From 299bb08a48ef2cba7398cc505fd8076fa5cf146b Mon Sep 17 00:00:00 2001 From: Carolina Nymark Date: Tue, 12 Nov 2024 05:44:36 +0000 Subject: [PATCH 001/323] Twenty Twenty: Correct the border style of the pull quote block in the editor. This change makes the border of the pull quote block visible in the editor when the user selects a border color or thickness, by setting the default border style to solid. Props nidhidhandhukiya, ugyensupport, dhruvang21, sabernhardt, divyeshk71, poena. Fixes #62301. git-svn-id: https://develop.svn.wordpress.org/trunk@59390 602fd350-edb4-49c9-b593-d223f7449a82 --- .../themes/twentytwenty/assets/css/editor-style-block-rtl.css | 2 +- .../themes/twentytwenty/assets/css/editor-style-block.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-content/themes/twentytwenty/assets/css/editor-style-block-rtl.css b/src/wp-content/themes/twentytwenty/assets/css/editor-style-block-rtl.css index 9345b90a76fc7..fd8868212b324 100644 --- a/src/wp-content/themes/twentytwenty/assets/css/editor-style-block-rtl.css +++ b/src/wp-content/themes/twentytwenty/assets/css/editor-style-block-rtl.css @@ -791,7 +791,7 @@ hr.wp-block-separator.is-style-dots::before { /* Block: Pullquote -------------------------- */ .editor-styles-wrapper .wp-block-pullquote { - border: none; + border: 0 solid; color: inherit; padding: 0; position: relative; diff --git a/src/wp-content/themes/twentytwenty/assets/css/editor-style-block.css b/src/wp-content/themes/twentytwenty/assets/css/editor-style-block.css index 0619a1a2dd7d6..19a11cf3f0ee6 100644 --- a/src/wp-content/themes/twentytwenty/assets/css/editor-style-block.css +++ b/src/wp-content/themes/twentytwenty/assets/css/editor-style-block.css @@ -795,7 +795,7 @@ hr.wp-block-separator.is-style-dots::before { /* Block: Pullquote -------------------------- */ .editor-styles-wrapper .wp-block-pullquote { - border: none; + border: 0 solid; color: inherit; padding: 0; position: relative; From 7b3d1078ec264a3f85766ccc9d19370318a37bce Mon Sep 17 00:00:00 2001 From: bernhard-reiter Date: Tue, 12 Nov 2024 10:30:26 +0000 Subject: [PATCH 002/323] HTML API: Ensure that full processor can seek to earlier bookmarks. When the HTML Processor seeks to an earlier place, it returns the the beginning of the document and proceeds forward until it reaches the appropriate location. This requires resetting internal state so that the processor can correctly proceed from the beginning of the document. The seeking reset logic was not adapted to account for the full processor (i.e. when created via `WP_HTML_Processor::create_full_parser()`). This change updates the seek logic to account for the full and fragment parsers as well as other state that has been introduced in the interim and should be reset. Props jonsurrell, dmsnell, westonruter, mi5t4n. Fixes #62290. git-svn-id: https://develop.svn.wordpress.org/trunk@59391 602fd350-edb4-49c9-b593-d223f7449a82 --- .../html-api/class-wp-html-open-elements.php | 9 - .../html-api/class-wp-html-processor.php | 96 ++++++++--- .../html-api/wpHtmlProcessor-bookmark.php | 160 ++++++++++++++++++ .../tests/html-api/wpHtmlProcessor.php | 2 +- 4 files changed, 229 insertions(+), 38 deletions(-) create mode 100644 tests/phpunit/tests/html-api/wpHtmlProcessor-bookmark.php diff --git a/src/wp-includes/html-api/class-wp-html-open-elements.php b/src/wp-includes/html-api/class-wp-html-open-elements.php index cb913853f0ee9..210492ab9af08 100644 --- a/src/wp-includes/html-api/class-wp-html-open-elements.php +++ b/src/wp-includes/html-api/class-wp-html-open-elements.php @@ -520,11 +520,6 @@ public function pop(): bool { return false; } - if ( 'context-node' === $item->bookmark_name ) { - $this->stack[] = $item; - return false; - } - $this->after_element_pop( $item ); return true; } @@ -585,10 +580,6 @@ public function push( WP_HTML_Token $stack_item ): void { * @return bool Whether the node was found and removed from the stack of open elements. */ public function remove_node( WP_HTML_Token $token ): bool { - if ( 'context-node' === $token->bookmark_name ) { - return false; - } - foreach ( $this->walk_up() as $position_from_end => $item ) { if ( $token->bookmark_name !== $item->bookmark_name ) { continue; diff --git a/src/wp-includes/html-api/class-wp-html-processor.php b/src/wp-includes/html-api/class-wp-html-processor.php index 19d15bfa43c5b..6a2c7d6fbeaf7 100644 --- a/src/wp-includes/html-api/class-wp-html-processor.php +++ b/src/wp-includes/html-api/class-wp-html-processor.php @@ -5328,52 +5328,92 @@ public function seek( $bookmark_name ): bool { * and computation time. */ if ( 'backward' === $direction ) { + /* - * Instead of clearing the parser state and starting fresh, calling the stack methods - * maintains the proper flags in the parser. + * When moving backward, stateful stacks should be cleared. */ foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) { - if ( 'context-node' === $item->bookmark_name ) { - break; - } - $this->state->stack_of_open_elements->remove_node( $item ); } foreach ( $this->state->active_formatting_elements->walk_up() as $item ) { - if ( 'context-node' === $item->bookmark_name ) { - break; - } - $this->state->active_formatting_elements->remove_node( $item ); } - parent::seek( 'context-node' ); - $this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY; - $this->state->frameset_ok = true; - $this->element_queue = array(); - $this->current_element = null; + /* + * **After** clearing stacks, more processor state can be reset. + * This must be done after clearing the stack because those stacks generate events that + * would appear on a subsequent call to `next_token()`. + */ + $this->state->frameset_ok = true; + $this->state->stack_of_template_insertion_modes = array(); + $this->state->head_element = null; + $this->state->form_element = null; + $this->state->current_token = null; + $this->current_element = null; + $this->element_queue = array(); + + /* + * The absence of a context node indicates a full parse. + * The presence of a context node indicates a fragment parser. + */ + if ( null === $this->context_node ) { + $this->change_parsing_namespace( 'html' ); + $this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_INITIAL; + $this->breadcrumbs = array(); - if ( isset( $this->context_node ) ) { - $this->breadcrumbs = array_slice( $this->breadcrumbs, 0, 2 ); + $this->bookmarks['initial'] = new WP_HTML_Span( 0, 0 ); + parent::seek( 'initial' ); + unset( $this->bookmarks['initial'] ); } else { - $this->breadcrumbs = array(); - } - } - // When moving forwards, reparse the document until reaching the same location as the original bookmark. - if ( $bookmark_starts_at === $this->bookmarks[ $this->state->current_token->bookmark_name ]->start ) { - return true; + /* + * Push the root-node (HTML) back onto the stack of open elements. + * + * Fragment parsers require this extra bit of setup. + * It's handled in full parsers by advancing the processor state. + */ + $this->state->stack_of_open_elements->push( + new WP_HTML_Token( + 'root-node', + 'HTML', + false + ) + ); + + $this->change_parsing_namespace( + $this->context_node->integration_node_type + ? 'html' + : $this->context_node->namespace + ); + + if ( 'TEMPLATE' === $this->context_node->node_name ) { + $this->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE; + } + + $this->reset_insertion_mode_appropriately(); + $this->breadcrumbs = array_slice( $this->breadcrumbs, 0, 2 ); + parent::seek( $this->context_node->bookmark_name ); + } } - while ( $this->next_token() ) { + /* + * Here, the processor moves forward through the document until it matches the bookmark. + * do-while is used here because the processor is expected to already be stopped on + * a token than may match the bookmarked location. + */ + do { + /* + * The processor will stop on virtual tokens, but bookmarks may not be set on them. + * They should not be matched when seeking a bookmark, skip them. + */ + if ( $this->is_virtual() ) { + continue; + } if ( $bookmark_starts_at === $this->bookmarks[ $this->state->current_token->bookmark_name ]->start ) { - while ( isset( $this->current_element ) && WP_HTML_Stack_Event::POP === $this->current_element->operation ) { - $this->current_element = array_shift( $this->element_queue ); - } return true; } - } + } while ( $this->next_token() ); return false; } diff --git a/tests/phpunit/tests/html-api/wpHtmlProcessor-bookmark.php b/tests/phpunit/tests/html-api/wpHtmlProcessor-bookmark.php new file mode 100644 index 0000000000000..91cc17898f77d --- /dev/null +++ b/tests/phpunit/tests/html-api/wpHtmlProcessor-bookmark.php @@ -0,0 +1,160 @@ +' ); + $this->assertTrue( $processor->next_tag( 'DIV' ) ); + $this->assertTrue( $processor->set_bookmark( 'mark' ), 'Failed to set bookmark.' ); + $this->assertTrue( $processor->has_bookmark( 'mark' ), 'Failed has_bookmark check.' ); + + // Confirm the bookmark works and processing continues normally. + $this->assertTrue( $processor->seek( 'mark' ), 'Failed to seek to bookmark.' ); + $this->assertSame( 'DIV', $processor->get_tag() ); + $this->assertSame( array( 'HTML', 'BODY', 'DIV' ), $processor->get_breadcrumbs() ); + $this->assertTrue( $processor->next_tag() ); + $this->assertSame( 'SPAN', $processor->get_tag() ); + $this->assertSame( array( 'HTML', 'BODY', 'DIV', 'SPAN' ), $processor->get_breadcrumbs() ); + } + + /** + * @dataProvider data_processor_constructors + * + * @ticket 62290 + */ + public function test_processor_seek_backward( callable $factory ) { + $processor = $factory( '
' ); + $this->assertTrue( $processor->next_tag( 'DIV' ) ); + $this->assertTrue( $processor->set_bookmark( 'mark' ), 'Failed to set bookmark.' ); + $this->assertTrue( $processor->has_bookmark( 'mark' ), 'Failed has_bookmark check.' ); + + // Move past the bookmark so it must scan backwards. + $this->assertTrue( $processor->next_tag( 'SPAN' ) ); + + // Confirm the bookmark works. + $this->assertTrue( $processor->seek( 'mark' ), 'Failed to seek to bookmark.' ); + $this->assertSame( 'DIV', $processor->get_tag() ); + } + + /** + * @dataProvider data_processor_constructors + * + * @ticket 62290 + */ + public function test_processor_seek_forward( callable $factory ) { + $processor = $factory( '
' ); + $this->assertTrue( $processor->next_tag( 'DIV' ) ); + $this->assertTrue( $processor->set_bookmark( 'one' ), 'Failed to set bookmark "one".' ); + $this->assertTrue( $processor->has_bookmark( 'one' ), 'Failed "one" has_bookmark check.' ); + + // Move past the bookmark so it must scan backwards. + $this->assertTrue( $processor->next_tag( 'SPAN' ) ); + $this->assertTrue( $processor->get_attribute( 'two' ) ); + $this->assertTrue( $processor->set_bookmark( 'two' ), 'Failed to set bookmark "two".' ); + $this->assertTrue( $processor->has_bookmark( 'two' ), 'Failed "two" has_bookmark check.' ); + + // Seek back. + $this->assertTrue( $processor->seek( 'one' ), 'Failed to seek to bookmark "one".' ); + $this->assertSame( 'DIV', $processor->get_tag() ); + + // Seek forward and continue processing. + $this->assertTrue( $processor->seek( 'two' ), 'Failed to seek to bookmark "two".' ); + $this->assertSame( 'SPAN', $processor->get_tag() ); + $this->assertTrue( $processor->get_attribute( 'two' ) ); + + $this->assertTrue( $processor->next_tag() ); + $this->assertSame( 'A', $processor->get_tag() ); + $this->assertTrue( $processor->get_attribute( 'three' ) ); + } + + /** + * Ensure the parsing namespace is handled when seeking from foreign content. + * + * @dataProvider data_processor_constructors + * + * @ticket 62290 + */ + public function test_seek_back_from_foreign_content( callable $factory ) { + $processor = $factory( '' ); + $this->assertTrue( $processor->next_tag( 'CUSTOM-ELEMENT' ) ); + $this->assertTrue( $processor->set_bookmark( 'mark' ), 'Failed to set bookmark "mark".' ); + $this->assertTrue( $processor->has_bookmark( 'mark' ), 'Failed "mark" has_bookmark check.' ); + + /* + * has self-closing flag, but HTML elements (that are not void elements) cannot self-close, + * they must be closed by some means, usually a closing tag. + * + * If the div were interpreted as foreign content, it would self-close. + */ + $this->assertTrue( $processor->has_self_closing_flag() ); + $this->assertTrue( $processor->expects_closer(), 'Incorrectly interpreted HTML custom-element with self-closing flag as self-closing element.' ); + + // Proceed into foreign content. + $this->assertTrue( $processor->next_tag( 'RECT' ) ); + $this->assertSame( 'svg', $processor->get_namespace() ); + $this->assertTrue( $processor->has_self_closing_flag() ); + $this->assertFalse( $processor->expects_closer() ); + $this->assertSame( array( 'HTML', 'BODY', 'CUSTOM-ELEMENT', 'SVG', 'RECT' ), $processor->get_breadcrumbs() ); + + // Seek back. + $this->assertTrue( $processor->seek( 'mark' ), 'Failed to seek to bookmark "mark".' ); + $this->assertSame( 'CUSTOM-ELEMENT', $processor->get_tag() ); + // If the parsing namespace were not correct here (html), + // then the self-closing flag would be misinterpreted. + $this->assertTrue( $processor->has_self_closing_flag() ); + $this->assertTrue( $processor->expects_closer(), 'Incorrectly interpreted HTML custom-element with self-closing flag as self-closing element.' ); + + // Proceed into foreign content again. + $this->assertTrue( $processor->next_tag( 'RECT' ) ); + $this->assertSame( 'svg', $processor->get_namespace() ); + $this->assertTrue( $processor->has_self_closing_flag() ); + $this->assertFalse( $processor->expects_closer() ); + + // The RECT should still descend from the CUSTOM-ELEMENT despite its self-closing flag. + $this->assertSame( array( 'HTML', 'BODY', 'CUSTOM-ELEMENT', 'SVG', 'RECT' ), $processor->get_breadcrumbs() ); + } + + /** + * Covers a regression where the root node may not be present on the stack of open elements. + * + * Heading elements (h1, h2, etc.) check the current node on the stack of open elements + * and expect it to be defined. If the root-node has been popped, pushing a new heading + * onto the stack will create a warning and fail the test. + * + * @ticket 62290 + */ + public function test_fragment_starts_with_h1() { + $processor = WP_HTML_Processor::create_fragment( '

' ); + $this->assertTrue( $processor->next_tag( 'H1' ) ); + $this->assertTrue( $processor->set_bookmark( 'mark' ) ); + $this->assertTrue( $processor->next_token() ); + $this->assertTrue( $processor->seek( 'mark' ) ); + } + + /** + * Data provider. + * + * @return array + */ + public static function data_processor_constructors(): array { + return array( + 'Full parser' => array( array( WP_HTML_Processor::class, 'create_full_parser' ) ), + 'Fragment parser' => array( array( WP_HTML_Processor::class, 'create_fragment' ) ), + ); + } +} diff --git a/tests/phpunit/tests/html-api/wpHtmlProcessor.php b/tests/phpunit/tests/html-api/wpHtmlProcessor.php index 6638f7600252c..e33619467e971 100644 --- a/tests/phpunit/tests/html-api/wpHtmlProcessor.php +++ b/tests/phpunit/tests/html-api/wpHtmlProcessor.php @@ -133,7 +133,7 @@ public function test_clear_to_navigate_after_seeking() { // Create a bookmark inside of that stack. if ( null !== $processor->get_attribute( 'two' ) ) { - $processor->set_bookmark( 'two' ); + $this->assertTrue( $processor->set_bookmark( 'two' ) ); break; } } From ed0ad98bc408a4abaeda00faf00be87159635d1e Mon Sep 17 00:00:00 2001 From: bernhard-reiter Date: Tue, 12 Nov 2024 12:56:37 +0000 Subject: [PATCH 003/323] HTML API: Expect closer on foreign content `void` lookalike elements. Ensure that `expects_closer` returns `false` on tags that look like void HTML tags, but are actually ''not'' void tags in foreign content. Props jonsurrell, bernhard-reiter. Fixes #62363. git-svn-id: https://develop.svn.wordpress.org/trunk@59392 602fd350-edb4-49c9-b593-d223f7449a82 --- .../html-api/class-wp-html-processor.php | 2 +- .../tests/html-api/wpHtmlProcessor.php | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/html-api/class-wp-html-processor.php b/src/wp-includes/html-api/class-wp-html-processor.php index 6a2c7d6fbeaf7..567b65062c0eb 100644 --- a/src/wp-includes/html-api/class-wp-html-processor.php +++ b/src/wp-includes/html-api/class-wp-html-processor.php @@ -821,7 +821,7 @@ public function expects_closer( ?WP_HTML_Token $node = null ): ?bool { // Doctype declarations. 'html' === $token_name || // Void elements. - self::is_void( $token_name ) || + ( 'html' === $token_namespace && self::is_void( $token_name ) ) || // Special atomic elements. ( 'html' === $token_namespace && in_array( $token_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP' ), true ) ) || // Self-closing elements in foreign content. diff --git a/tests/phpunit/tests/html-api/wpHtmlProcessor.php b/tests/phpunit/tests/html-api/wpHtmlProcessor.php index e33619467e971..fd9d812103865 100644 --- a/tests/phpunit/tests/html-api/wpHtmlProcessor.php +++ b/tests/phpunit/tests/html-api/wpHtmlProcessor.php @@ -561,6 +561,31 @@ public function test_expects_closer_foreign_content_self_closing() { $this->assertTrue( $processor->expects_closer() ); } + /** + * Ensures that expects_closer works for void-like elements in foreign content. + * + * For example, `
This should be hidden by the hidden attribute.
}}} Both server and client will return with this fix: {{{ }}} Props jonsurrell, luisherranz. Fixes #62374. git-svn-id: https://develop.svn.wordpress.org/trunk@59398 602fd350-edb4-49c9-b593-d223f7449a82 --- .../class-wp-interactivity-api.php | 3 +- .../interactivity-api/wpInteractivityAPI.php | 32 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/interactivity-api/class-wp-interactivity-api.php b/src/wp-includes/interactivity-api/class-wp-interactivity-api.php index 75eba82c1695b..f71684599f22e 100644 --- a/src/wp-includes/interactivity-api/class-wp-interactivity-api.php +++ b/src/wp-includes/interactivity-api/class-wp-interactivity-api.php @@ -584,7 +584,8 @@ private function evaluate( $directive_value ) { } elseif ( is_object( $current ) && isset( $current->$path_segment ) ) { $current = $current->$path_segment; } else { - return null; + $current = null; + break; } if ( $current instanceof Closure ) { diff --git a/tests/phpunit/tests/interactivity-api/wpInteractivityAPI.php b/tests/phpunit/tests/interactivity-api/wpInteractivityAPI.php index d6d7c28fdb77c..c63c64c6888e6 100644 --- a/tests/phpunit/tests/interactivity-api/wpInteractivityAPI.php +++ b/tests/phpunit/tests/interactivity-api/wpInteractivityAPI.php @@ -1079,6 +1079,38 @@ public function test_evaluate_value_negation() { $this->assertFalse( $result ); } + /** + * Tests that the `evaluate` method operates correctly when used with the + * negation operator (!) with non-existent paths. + * + * @ticket 62374 + * + * @covers ::evaluate + */ + public function test_evaluate_value_negation_non_existent_path() { + $this->interactivity->state( 'myPlugin', array() ); + $this->interactivity->state( 'otherPlugin', array() ); + $this->set_internal_context_stack( + array( + 'myPlugin' => array(), + 'otherPlugin' => array(), + ) + ); + $this->set_internal_namespace_stack( 'myPlugin' ); + + $result = $this->evaluate( '!state.missing' ); + $this->assertTrue( $result ); + + $result = $this->evaluate( '!context.missing' ); + $this->assertTrue( $result ); + + $result = $this->evaluate( 'otherPlugin::!state.deeply.nested.missing' ); + $this->assertTrue( $result ); + + $result = $this->evaluate( 'otherPlugin::!context.deeply.nested.missing' ); + $this->assertTrue( $result ); + } + /** * Tests the `evaluate` method with non-existent paths. * From 1a27422be34291c961b578778edb1288732bdd15 Mon Sep 17 00:00:00 2001 From: bernhard-reiter Date: Wed, 13 Nov 2024 12:18:48 +0000 Subject: [PATCH 007/323] HTML API: Include doctype in full parser serialize. Output DOCTYPE when calling `WP_HTML_Processor::serialize` on a full document that includes a DOCTYPE. The DOCTYPE should be included in the serialized/normalized HTML output as it has an impact in how the document is handled, in particular whether the document should be handled in quirks or no-quirks mode. This only affects the serialization of full parsers at this time because DOCTYPE tokens are currently ignored in all possible fragments. The omission of the DOCTYPE is subtle but can change the serialized document's quirks/no-quirks mode. Props jonsurrell. Fixes #62396. git-svn-id: https://develop.svn.wordpress.org/trunk@59399 602fd350-edb4-49c9-b593-d223f7449a82 --- .../html-api/class-wp-html-processor.php | 28 +++++++++++++--- .../html-api/wpHtmlProcessor-serialize.php | 33 +++++++++++++++++++ 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/html-api/class-wp-html-processor.php b/src/wp-includes/html-api/class-wp-html-processor.php index 567b65062c0eb..f6c561f010948 100644 --- a/src/wp-includes/html-api/class-wp-html-processor.php +++ b/src/wp-includes/html-api/class-wp-html-processor.php @@ -1178,6 +1178,30 @@ protected function serialize_token(): string { $token_type = $this->get_token_type(); switch ( $token_type ) { + case '#doctype': + $doctype = $this->get_doctype_info(); + if ( null === $doctype ) { + break; + } + + $html .= 'name ) { + $html .= " {$doctype->name}"; + } + + if ( null !== $doctype->public_identifier ) { + $html .= " PUBLIC \"{$doctype->public_identifier}\""; + } + if ( null !== $doctype->system_identifier ) { + if ( null === $doctype->public_identifier ) { + $html .= ' SYSTEM'; + } + $html .= " \"{$doctype->system_identifier}\""; + } + $html .= '>'; + break; + case '#text': $html .= htmlspecialchars( $this->get_modifiable_text(), ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8' ); break; @@ -1194,10 +1218,6 @@ protected function serialize_token(): string { case '#cdata-section': $html .= "get_modifiable_text()}]]>"; break; - - case 'html': - $html .= ''; - break; } if ( '#tag' !== $token_type ) { diff --git a/tests/phpunit/tests/html-api/wpHtmlProcessor-serialize.php b/tests/phpunit/tests/html-api/wpHtmlProcessor-serialize.php index e05ca28473e04..021c798a9e8ec 100644 --- a/tests/phpunit/tests/html-api/wpHtmlProcessor-serialize.php +++ b/tests/phpunit/tests/html-api/wpHtmlProcessor-serialize.php @@ -284,4 +284,37 @@ public static function data_tokens_with_null_bytes() { 'Comment text' => array( "", "" ), ); } + + /** + * @ticket 62396 + * + * @dataProvider data_provider_serialize_doctype + */ + public function test_full_document_serialize_includes_doctype( string $doctype_input, string $doctype_output ) { + $processor = WP_HTML_Processor::create_full_parser( + "{$doctype_input}👌" + ); + $this->assertSame( + "{$doctype_output}👌", + $processor->serialize() + ); + } + + /** + * Data provider. + * + * @return array[] + */ + public static function data_provider_serialize_doctype() { + return array( + 'None' => array( '', '' ), + 'Empty' => array( '', '' ), + 'HTML5' => array( '', '' ), + 'Strange name' => array( '', '' ), + 'With public' => array( '', '' ), + 'With system' => array( '', '' ), + 'With public and system' => array( '', '' ), + 'Weird casing' => array( '', '' ), + ); + } } From a27e6a8ecd5279a45e47ef88d048643740d07b5a Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Wed, 13 Nov 2024 12:25:43 +0000 Subject: [PATCH 008/323] Coding Standards: Consistently escape URLs in `wp-admin/themes.php`. Includes: * Wrapping long lines for better readability. * Bringing some consistency to the placement of `href` and `aria-label` attributes. * Adding missing `aria-label` attributes for Live Preview links. Follow-up to [26726], [52020], [51083]. Props patelketan, sainathpoojary, SergeyBiryukov. Fixes #62405. git-svn-id: https://develop.svn.wordpress.org/trunk@59400 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/themes.php | 122 +++++++++++++++++++++++++++++++--------- 1 file changed, 95 insertions(+), 27 deletions(-) diff --git a/src/wp-admin/themes.php b/src/wp-admin/themes.php index d7ebd5c646c42..4c814dd42b6d1 100644 --- a/src/wp-admin/themes.php +++ b/src/wp-admin/themes.php @@ -583,7 +583,9 @@ /* translators: %s: Theme name. */ $details_aria_label = sprintf( _x( 'View Theme Details for %s', 'theme' ), $theme['name'] ); ?> - +
- + - + + - + - - - + + + + @@ -954,7 +975,9 @@ function wp_theme_auto_update_setting_template() { /* translators: %s: Theme name. */ $details_aria_label = sprintf( _x( 'View Theme Details for %s', 'theme' ), '{{ data.name }}' ); ?> - +
- + <# } #> <# } else { #> <# if ( data.compatibleWP && data.compatiblePHP ) { #> @@ -986,20 +1012,36 @@ function wp_theme_auto_update_setting_template() { /* translators: %s: Theme name. */ $aria_label = sprintf( _x( 'Activate %s', 'theme' ), '{{ data.name }}' ); ?> - + + - + <# } else { #> - + + <# if ( ! data.blockTheme ) { #> - + + <# } #> <# } #> <# } #> @@ -1211,31 +1253,54 @@ function wp_theme_auto_update_setting_template() {
- +
+
<# if ( data.compatibleWP && data.compatiblePHP ) { #> - <# if ( ! data.blockTheme ) { #> - + + <# } #> + <# if ( data.actions.activate ) { #> - + + <# } #> <# } else { #> - <# if ( ! data.blockTheme ) { #> - + + <# } #> + <# if ( data.actions.activate ) { #> - + + <# } #> <# } #>
@@ -1245,7 +1310,10 @@ function wp_theme_auto_update_setting_template() { /* translators: %s: Theme name. */ $aria_label = sprintf( _x( 'Delete %s', 'theme' ), '{{ data.name }}' ); ?> - + <# } #>
From b082308482443bf4269d2a9ae73feb8a3dfc1ba6 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Wed, 13 Nov 2024 19:06:57 +0000 Subject: [PATCH 009/323] Build/Test Tools: Avoid starting the database twice. The database container is started when the `services` are initially set up. Having a separate step for this sometimes introduces unexpected failures for an unknown reason. Props johnbillion. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59402 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/install-testing.yml | 5 ----- .github/workflows/reusable-upgrade-testing.yml | 6 ------ 2 files changed, 11 deletions(-) diff --git a/.github/workflows/install-testing.yml b/.github/workflows/install-testing.yml index fd63f665aea4c..9b9036085cd89 100644 --- a/.github/workflows/install-testing.yml +++ b/.github/workflows/install-testing.yml @@ -96,7 +96,6 @@ jobs: # # Performs the following steps: # - Sets up PHP. - # - Starts the database server. # - Downloads the specified version of WordPress. # - Creates a `wp-config.php` file. # - Installs WordPress. @@ -157,10 +156,6 @@ jobs: coverage: none tools: wp-cli${{ contains( fromJSON('["5.4", "5.5"]'), matrix.php ) && ':2.4.0' || '' }} - - name: Start the database server - run: | - sudo systemctl start ${{ matrix.db-type }} - - name: Download WordPress run: wp core download ${{ inputs.wp-version && format( '--version={0}', inputs.wp-version ) || '--version=nightly' }} diff --git a/.github/workflows/reusable-upgrade-testing.yml b/.github/workflows/reusable-upgrade-testing.yml index 5ae658dc3baae..1d4f26f91ad2c 100644 --- a/.github/workflows/reusable-upgrade-testing.yml +++ b/.github/workflows/reusable-upgrade-testing.yml @@ -42,7 +42,6 @@ jobs: # # Performs the following steps: # - Sets up PHP. - # - Starts the database server. # - Downloads the specified version of WordPress. # - Creates a `wp-config.php` file. # - Installs WordPress. @@ -68,7 +67,6 @@ jobs: --entrypoint sh ${{ inputs.db-type }}:${{ inputs.db-version }} -c "exec docker-entrypoint.sh mysqld${{ inputs.db-type == 'mysql' && contains( fromJSON('["7.2", "7.3"]'), inputs.php ) && ' --default-authentication-plugin=mysql_native_password' || '' }}" - steps: - name: Set up PHP ${{ inputs.php }} uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1 @@ -77,10 +75,6 @@ jobs: coverage: none tools: wp-cli - - name: Start the database server - run: | - sudo systemctl start ${{ inputs.db-type }} - - name: Download WordPress ${{ inputs.wp }} run: wp core download --version=${{ inputs.wp }} From 7b294142e2b0db42a0bd37b81886ce7dd7965c74 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Wed, 13 Nov 2024 19:11:53 +0000 Subject: [PATCH 010/323] Build/Test Tools: Correct upgrade testing workflow name. The reusable upgrade testing workflow was renamed in [58165], but the event `paths` filters were not updated accordingly. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59403 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/upgrade-testing.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/upgrade-testing.yml b/.github/workflows/upgrade-testing.yml index 253d479628b09..8ea2c16bfb36a 100644 --- a/.github/workflows/upgrade-testing.yml +++ b/.github/workflows/upgrade-testing.yml @@ -7,12 +7,12 @@ on: # Always test the workflow after it's updated. paths: - '.github/workflows/upgrade-testing.yml' - - '.github/workflows/upgrade-testing-run.yml' + - '.github/workflows/reusable-upgrade-testing.yml' pull_request: # Always test the workflow when changes are suggested. paths: - '.github/workflows/upgrade-testing.yml' - - '.github/workflows/upgrade-testing-run.yml' + - '.github/workflows/reusable-upgrade-testing.yml' workflow_dispatch: inputs: new-version: From e9dfa8c34c74cb51da93ae4b4e61c1df0378b3d7 Mon Sep 17 00:00:00 2001 From: John Blackbourn Date: Thu, 14 Nov 2024 16:44:57 +0000 Subject: [PATCH 011/323] Docs: Correct the spelling of silicon in the local development environment readme. See #62281 git-svn-id: https://develop.svn.wordpress.org/trunk@59405 602fd350-edb4-49c9-b593-d223f7449a82 --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7b07b883d7544..adb4fc946d9a8 100644 --- a/README.md +++ b/README.md @@ -139,11 +139,11 @@ The development environment can be reset. This will destroy the database and att npm run env:reset ``` -### Apple Silicone machines and old MySQL versions +### Apple Silicon machines and old MySQL versions -The MySQL Docker images do not support Apple Silicone processors (M1, M2, etc.) for MySQL versions 5.7 and earlier. +The MySQL Docker images do not support Apple Silicon processors (M1, M2, etc.) for MySQL versions 5.7 and earlier. -When using MySQL <= 5.7 on an Apple Silicone machine, you must create a `docker-compose.override.yml` file with the following contents: +When using MySQL <= 5.7 on an Apple Silicon machine, you must create a `docker-compose.override.yml` file with the following contents: ``` services: From 2e5e2131a145e593173a7b2c57fb84fa93deabba Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Fri, 15 Nov 2024 21:09:32 +0000 Subject: [PATCH 012/323] Docs: Add missing commas in a few DocBlocks for various media functions. Follow-up to [56416]. Props truptikanzariya. Fixes #62433. git-svn-id: https://develop.svn.wordpress.org/trunk@59406 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-image-editor-gd.php | 4 ++-- src/wp-includes/class-wp-image-editor-imagick.php | 2 +- src/wp-includes/class-wp-image-editor.php | 2 +- src/wp-includes/media.php | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/wp-includes/class-wp-image-editor-gd.php b/src/wp-includes/class-wp-image-editor-gd.php index dfa90545f6cb7..54fd7957cbef7 100644 --- a/src/wp-includes/class-wp-image-editor-gd.php +++ b/src/wp-includes/class-wp-image-editor-gd.php @@ -182,7 +182,7 @@ protected function update_size( $width = false, $height = false ) { * If true, image will be cropped to the specified dimensions using center positions. * If an array, the image will be cropped using the array to specify the crop location: * - * @type string $0 The x crop position. Accepts 'left' 'center', or 'right'. + * @type string $0 The x crop position. Accepts 'left', 'center', or 'right'. * @type string $1 The y crop position. Accepts 'top', 'center', or 'bottom'. * } * @return true|WP_Error @@ -214,7 +214,7 @@ public function resize( $max_w, $max_h, $crop = false ) { * If true, image will be cropped to the specified dimensions using center positions. * If an array, the image will be cropped using the array to specify the crop location: * - * @type string $0 The x crop position. Accepts 'left' 'center', or 'right'. + * @type string $0 The x crop position. Accepts 'left', 'center', or 'right'. * @type string $1 The y crop position. Accepts 'top', 'center', or 'bottom'. * } * @return resource|GdImage|WP_Error diff --git a/src/wp-includes/class-wp-image-editor-imagick.php b/src/wp-includes/class-wp-image-editor-imagick.php index 4370e30a3e528..45b0e3a5a48ef 100644 --- a/src/wp-includes/class-wp-image-editor-imagick.php +++ b/src/wp-includes/class-wp-image-editor-imagick.php @@ -346,7 +346,7 @@ public static function set_imagick_time_limit() { * If true, image will be cropped to the specified dimensions using center positions. * If an array, the image will be cropped using the array to specify the crop location: * - * @type string $0 The x crop position. Accepts 'left' 'center', or 'right'. + * @type string $0 The x crop position. Accepts 'left', 'center', or 'right'. * @type string $1 The y crop position. Accepts 'top', 'center', or 'bottom'. * } * @return true|WP_Error diff --git a/src/wp-includes/class-wp-image-editor.php b/src/wp-includes/class-wp-image-editor.php index 7a16d504c08c3..dc2420507800d 100644 --- a/src/wp-includes/class-wp-image-editor.php +++ b/src/wp-includes/class-wp-image-editor.php @@ -111,7 +111,7 @@ abstract public function save( $destfilename = null, $mime_type = null ); * If true, image will be cropped to the specified dimensions using center positions. * If an array, the image will be cropped using the array to specify the crop location: * - * @type string $0 The x crop position. Accepts 'left' 'center', or 'right'. + * @type string $0 The x crop position. Accepts 'left', 'center', or 'right'. * @type string $1 The y crop position. Accepts 'top', 'center', or 'bottom'. * } * @return true|WP_Error diff --git a/src/wp-includes/media.php b/src/wp-includes/media.php index 1e3673e89431b..6e58658189816 100644 --- a/src/wp-includes/media.php +++ b/src/wp-includes/media.php @@ -288,7 +288,7 @@ function image_downsize( $id, $size = 'medium' ) { * If true, image will be cropped to the specified dimensions using center positions. * If an array, the image will be cropped using the array to specify the crop location: * - * @type string $0 The x crop position. Accepts 'left' 'center', or 'right'. + * @type string $0 The x crop position. Accepts 'left', 'center', or 'right'. * @type string $1 The y crop position. Accepts 'top', 'center', or 'bottom'. * } */ @@ -350,7 +350,7 @@ function remove_image_size( $name ) { * If true, image will be cropped to the specified dimensions using center positions. * If an array, the image will be cropped using the array to specify the crop location: * - * @type string $0 The x crop position. Accepts 'left' 'center', or 'right'. + * @type string $0 The x crop position. Accepts 'left', 'center', or 'right'. * @type string $1 The y crop position. Accepts 'top', 'center', or 'bottom'. * } */ @@ -530,7 +530,7 @@ function wp_constrain_dimensions( $current_width, $current_height, $max_width = * If true, image will be cropped to the specified dimensions using center positions. * If an array, the image will be cropped using the array to specify the crop location: * - * @type string $0 The x crop position. Accepts 'left' 'center', or 'right'. + * @type string $0 The x crop position. Accepts 'left', 'center', or 'right'. * @type string $1 The y crop position. Accepts 'top', 'center', or 'bottom'. * } * @return array|false Returned array matches parameters for `imagecopyresampled()`. False on failure. @@ -684,7 +684,7 @@ function image_resize_dimensions( $orig_w, $orig_h, $dest_w, $dest_h, $crop = fa * If true, image will be cropped to the specified dimensions using center positions. * If an array, the image will be cropped using the array to specify the crop location: * - * @type string $0 The x crop position. Accepts 'left' 'center', or 'right'. + * @type string $0 The x crop position. Accepts 'left', 'center', or 'right'. * @type string $1 The y crop position. Accepts 'top', 'center', or 'bottom'. * } * @return array|false Metadata array on success. False if no image was created. From e6a16acfd87de3bc469e43a741df870809994426 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Sat, 16 Nov 2024 23:13:43 +0000 Subject: [PATCH 013/323] Coding Standards: Escape attachment URL in `wp-admin/async-upload.php`. Follow-up to [58279]. Props shyamkariya, pitamdey, nareshbheda, ketanniruke, desrosj. Fixes #62434. git-svn-id: https://develop.svn.wordpress.org/trunk@59407 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/async-upload.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/wp-admin/async-upload.php b/src/wp-admin/async-upload.php index 551f854b5ae15..a146f6a48a71b 100644 --- a/src/wp-admin/async-upload.php +++ b/src/wp-admin/async-upload.php @@ -74,7 +74,9 @@ } ?> - +
From a731b9bfc0f626cc589c27cc579966c5364a73d5 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Sun, 17 Nov 2024 13:43:00 +0000 Subject: [PATCH 014/323] Tests: Add missing `@covers` tag for `fetch_feed()` tests. Includes correcting the test class name as per the naming conventions. Follow-up to [59382]. See #62280. git-svn-id: https://develop.svn.wordpress.org/trunk@59408 602fd350-edb4-49c9-b593-d223f7449a82 --- tests/phpunit/tests/feed/fetchFeed.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/phpunit/tests/feed/fetchFeed.php b/tests/phpunit/tests/feed/fetchFeed.php index 5fd9026a4beb4..20ed485d4fec7 100644 --- a/tests/phpunit/tests/feed/fetchFeed.php +++ b/tests/phpunit/tests/feed/fetchFeed.php @@ -1,14 +1,16 @@ Date: Mon, 18 Nov 2024 02:53:51 +0000 Subject: [PATCH 015/323] Customizer: Fix layout issues in customizer accordions. Adjust some CSS characteristics in the customizer accordions to avoid a slight horizontal scroll, allow the chevron icon to be part of the clickable control surface, and resolve a pre-existing padding issue allowing overflow on accordion headings. Follow up to [59224]. Props laurelfulford, wildworks, domainsupport, sabernhardt, rcreators, desrosj, sainathpoojary. Fixes #62313, #62335. git-svn-id: https://develop.svn.wordpress.org/trunk@59409 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/css/common.css | 2 +- src/wp-admin/css/customize-controls.css | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/wp-admin/css/common.css b/src/wp-admin/css/common.css index c7082137d5537..6d24705d549b2 100644 --- a/src/wp-admin/css/common.css +++ b/src/wp-admin/css/common.css @@ -2462,7 +2462,7 @@ h1.nav-tab-wrapper, /* Back-compat for pre-4.4 */ } .nav-menus-php .metabox-holder .accordion-section-title span.dashicons.dashicons-arrow-down::before { position: relative; - left: -1px + left: -1px; } .nav-menus-php .metabox-holder .accordion-section.open .accordion-section-title span.dashicons.dashicons-arrow-down { diff --git a/src/wp-admin/css/customize-controls.css b/src/wp-admin/css/customize-controls.css index 59905ea902347..8149c28d138d6 100644 --- a/src/wp-admin/css/customize-controls.css +++ b/src/wp-admin/css/customize-controls.css @@ -553,7 +553,8 @@ body.trashing #publish-settings { .15s border-color ease-in-out; } -.accordion-section-title:has(button.accordion-trigger) { +.accordion-section-title:has(button.accordion-trigger), +#customize-controls .current-panel .control-section > h3.accordion-section-title:has(button.accordion-trigger) { padding: 0; } @@ -561,9 +562,10 @@ body.trashing #publish-settings { all: unset; width: 100%; height: 100%; - padding: 10px 10px 11px 14px; + padding: 10px 30px 11px 14px; display: flex; align-items: center; + box-sizing: border-box; } .accordion-section-title button.accordion-trigger:has(.menu-in-location) { @@ -587,6 +589,7 @@ body.trashing #publish-settings { #customize-outer-theme-controls .accordion-section-title:after { content: "\f345"; color: #a7aaad; + pointer-events: none; } #customize-theme-controls .accordion-section-content, From 91eb2517bed7d2e9668eda228a83f4db511f19d0 Mon Sep 17 00:00:00 2001 From: Carlos Bravo Date: Mon, 18 Nov 2024 13:05:35 +0000 Subject: [PATCH 016/323] HTML API: Fix normalized doctype pub/sys identifier quotes. Changeset [59399] fixed missing DOCTYPEs in normalized HTML output. It missed an edge case where public and system identifiers may contain double quotes, in which case they must be quoted with single quotes. This commit addresses that issue and adds tests. Follow-up to [59399]. Props jonsurrell, luisherranz, apermo. Fixes #62396. git-svn-id: https://develop.svn.wordpress.org/trunk@59410 602fd350-edb4-49c9-b593-d223f7449a82 --- .../html-api/class-wp-html-processor.php | 7 +++++-- .../html-api/wpHtmlProcessor-serialize.php | 20 +++++++++++-------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/wp-includes/html-api/class-wp-html-processor.php b/src/wp-includes/html-api/class-wp-html-processor.php index f6c561f010948..9abc782d0cb32 100644 --- a/src/wp-includes/html-api/class-wp-html-processor.php +++ b/src/wp-includes/html-api/class-wp-html-processor.php @@ -1191,14 +1191,17 @@ protected function serialize_token(): string { } if ( null !== $doctype->public_identifier ) { - $html .= " PUBLIC \"{$doctype->public_identifier}\""; + $quote = str_contains( $doctype->public_identifier, '"' ) ? "'" : '"'; + $html .= " PUBLIC {$quote}{$doctype->public_identifier}{$quote}"; } if ( null !== $doctype->system_identifier ) { if ( null === $doctype->public_identifier ) { $html .= ' SYSTEM'; } - $html .= " \"{$doctype->system_identifier}\""; + $quote = str_contains( $doctype->system_identifier, '"' ) ? "'" : '"'; + $html .= " {$quote}{$doctype->system_identifier}{$quote}"; } + $html .= '>'; break; diff --git a/tests/phpunit/tests/html-api/wpHtmlProcessor-serialize.php b/tests/phpunit/tests/html-api/wpHtmlProcessor-serialize.php index 021c798a9e8ec..e2b5a79c2de2f 100644 --- a/tests/phpunit/tests/html-api/wpHtmlProcessor-serialize.php +++ b/tests/phpunit/tests/html-api/wpHtmlProcessor-serialize.php @@ -307,14 +307,18 @@ public function test_full_document_serialize_includes_doctype( string $doctype_i */ public static function data_provider_serialize_doctype() { return array( - 'None' => array( '', '' ), - 'Empty' => array( '', '' ), - 'HTML5' => array( '', '' ), - 'Strange name' => array( '', '' ), - 'With public' => array( '', '' ), - 'With system' => array( '', '' ), - 'With public and system' => array( '', '' ), - 'Weird casing' => array( '', '' ), + 'None' => array( '', '' ), + 'Empty' => array( '', '' ), + 'HTML5' => array( '', '' ), + 'Strange name' => array( '', '' ), + 'With public' => array( '', '' ), + 'With system' => array( '', '' ), + 'With public and system' => array( '', '' ), + 'Weird casing' => array( '', '' ), + 'Single quotes in public ID' => array( '', '' ), + 'Double quotes in public ID' => array( '', '' ), + 'Single quotes in system ID' => array( '', '' ), + 'Double quotes in system ID' => array( '', '' ), ); } } From 439221cc25693700d98f99323d338bb504e26aae Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Mon, 18 Nov 2024 17:33:23 +0000 Subject: [PATCH 017/323] =?UTF-8?q?Editor:=20Use=20sentence=20casing=20for?= =?UTF-8?q?=20=E2=80=9CCall=20to=20action=E2=80=9D.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is more consistent with other strings and occurrences of this string. Props juanfra, joen, narenin, mukesh27. See #62414. git-svn-id: https://develop.svn.wordpress.org/trunk@59412 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/block-patterns.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/block-patterns.php b/src/wp-includes/block-patterns.php index 851898d006a98..f1a24cdf72fe1 100644 --- a/src/wp-includes/block-patterns.php +++ b/src/wp-includes/block-patterns.php @@ -74,7 +74,7 @@ function _register_core_block_patterns_and_categories() { register_block_pattern_category( 'call-to-action', array( - 'label' => _x( 'Call to Action', 'Block pattern category' ), + 'label' => _x( 'Call to action', 'Block pattern category' ), 'description' => __( 'Sections whose purpose is to trigger a specific action.' ), ) ); From 0a6666b040d1955294e1bed58b13b543ed6d1c5b Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Mon, 18 Nov 2024 18:03:22 +0000 Subject: [PATCH 018/323] Media: Avoid running expensive logic twice using GD. Support for uploading AVIF was added in [57524]. A new block of conditional logic was added determine which function should be used to create the new image file that resulted in these expensive functions being run twice. This combines the two conditional logic to ensure the appropriate function is only run once regardless of format. Props adamsilverstein, glynnquelch. Fixes #62331. git-svn-id: https://develop.svn.wordpress.org/trunk@59413 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-image-editor-gd.php | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/wp-includes/class-wp-image-editor-gd.php b/src/wp-includes/class-wp-image-editor-gd.php index 54fd7957cbef7..e4f065537639d 100644 --- a/src/wp-includes/class-wp-image-editor-gd.php +++ b/src/wp-includes/class-wp-image-editor-gd.php @@ -103,20 +103,13 @@ public function load() { return new WP_Error( 'error_loading_image', __( 'File does not exist?' ), $this->file ); } - // WebP may not work with imagecreatefromstring(). + // Handle WebP and AVIF mime types explicitly, falling back to imagecreatefromstring. if ( - function_exists( 'imagecreatefromwebp' ) && - ( 'image/webp' === wp_get_image_mime( $this->file ) ) + function_exists( 'imagecreatefromwebp' ) && ( 'image/webp' === wp_get_image_mime( $this->file ) ) ) { $this->image = @imagecreatefromwebp( $this->file ); - } else { - $this->image = @imagecreatefromstring( $file_contents ); - } - - // AVIF may not work with imagecreatefromstring(). - if ( - function_exists( 'imagecreatefromavif' ) && - ( 'image/avif' === wp_get_image_mime( $this->file ) ) + } elseif ( + function_exists( 'imagecreatefromavif' ) && ( 'image/avif' === wp_get_image_mime( $this->file ) ) ) { $this->image = @imagecreatefromavif( $this->file ); } else { From 2d5431dc97bc4e5c7f9e9113ef31aaefe9dbbab5 Mon Sep 17 00:00:00 2001 From: Andrew Ozz Date: Mon, 18 Nov 2024 19:31:45 +0000 Subject: [PATCH 019/323] Editor: Fix the JS to select, save, and update categories on the old Edit Post screen. Props: charleslf, im3dabasia1, desrosj, dhruvang21, Zargarov, sainathpoojary, azaozz Fixes: #62440 git-svn-id: https://develop.svn.wordpress.org/trunk@59414 602fd350-edb4-49c9-b593-d223f7449a82 --- src/js/_enqueues/admin/post.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/js/_enqueues/admin/post.js b/src/js/_enqueues/admin/post.js index 5dd70b950fb72..95c2fa0400fe7 100644 --- a/src/js/_enqueues/admin/post.js +++ b/src/js/_enqueues/admin/post.js @@ -659,8 +659,10 @@ jQuery( function($) { 'li.popular-category > label input[type="checkbox"]', function() { var t = $(this), c = t.is(':checked'), id = t.val(); - if ( id && t.parents('#taxonomy-'+taxonomy).length ) - $('#in-' + taxonomy + '-' + id + ', #in-popular-' + taxonomy + '-' + id).prop( 'checked', c ); + if ( id && t.parents('#taxonomy-'+taxonomy).length ) { + $('input[id^="in-' + taxonomy + '-' + id + '"]').prop('checked', c); + $('input#in-popular-' + taxonomy + '-' + id).prop('checked', c); + } } ); From 61b9859728b31130274b31bde9c6d73ee915fa03 Mon Sep 17 00:00:00 2001 From: Felix Arntz Date: Mon, 18 Nov 2024 19:50:06 +0000 Subject: [PATCH 020/323] Media: Avoid images with `sizes=auto` to be displayed downsized in supporting browsers. Based on the user agent stylesheet rules outlined in https://html.spec.whatwg.org/multipage/rendering.html#img-contain-size, images that have `sizes=auto` while applying `width: auto` or `width: fit-content` would be constrained to only 300px width. This changeset overrides said user agent stylesheet rule with a much larger constraint, to avoid the problem. Additionally, it introduces a filter `wp_img_tag_add_auto_sizes` which can be used to opt out of the functionality, as an additional measure. Props joemcgill, flixos90, dooperweb, SirLouen, azaozz, mukesh27, apermo. Fixes #62413. See #61847, #62345. git-svn-id: https://develop.svn.wordpress.org/trunk@59415 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/default-filters.php | 1 + src/wp-includes/media.php | 52 ++++++++++++- tests/phpunit/tests/media.php | 114 +++++++++++++++++++++++----- 3 files changed, 145 insertions(+), 22 deletions(-) diff --git a/src/wp-includes/default-filters.php b/src/wp-includes/default-filters.php index 961b37f9aa1bb..ae654605e8f4b 100644 --- a/src/wp-includes/default-filters.php +++ b/src/wp-includes/default-filters.php @@ -611,6 +611,7 @@ add_action( 'wp_default_styles', 'wp_default_styles' ); add_filter( 'style_loader_src', 'wp_style_loader_src', 10, 2 ); +add_action( 'wp_head', 'wp_print_auto_sizes_contain_css_fix', 1 ); add_action( 'wp_head', 'wp_maybe_inline_styles', 1 ); // Run for styles enqueued in . add_action( 'wp_footer', 'wp_maybe_inline_styles', 1 ); // Run for late-loaded styles in the footer. diff --git a/src/wp-includes/media.php b/src/wp-includes/media.php index 6e58658189816..00e23ff53d7ef 100644 --- a/src/wp-includes/media.php +++ b/src/wp-includes/media.php @@ -1137,8 +1137,12 @@ function wp_get_attachment_image( $attachment_id, $size = 'thumbnail', $icon = f } } + /** This filter is documented in wp-includes/media.php */ + $add_auto_sizes = apply_filters( 'wp_img_tag_add_auto_sizes', true ); + // Adds 'auto' to the sizes attribute if applicable. if ( + $add_auto_sizes && isset( $attr['loading'] ) && 'lazy' === $attr['loading'] && isset( $attr['sizes'] ) && @@ -1985,6 +1989,17 @@ function wp_filter_content_tags( $content, $context = null ) { * @return string The filtered image tag markup. */ function wp_img_tag_add_auto_sizes( string $image ): string { + /** + * Filters whether auto-sizes for lazy loaded images is enabled. + * + * @since 6.7.1 + * + * @param boolean $enabled Whether auto-sizes for lazy loaded images is enabled. + */ + if ( ! apply_filters( 'wp_img_tag_add_auto_sizes', true ) ) { + return $image; + } + $processor = new WP_HTML_Tag_Processor( $image ); // Bail if there is no IMG tag. @@ -1993,8 +2008,19 @@ function wp_img_tag_add_auto_sizes( string $image ): string { } // Bail early if the image is not lazy-loaded. - $value = $processor->get_attribute( 'loading' ); - if ( ! is_string( $value ) || 'lazy' !== strtolower( trim( $value, " \t\f\r\n" ) ) ) { + $loading = $processor->get_attribute( 'loading' ); + if ( ! is_string( $loading ) || 'lazy' !== strtolower( trim( $loading, " \t\f\r\n" ) ) ) { + return $image; + } + + /* + * Bail early if the image doesn't have a width attribute. + * Per WordPress Core itself, lazy-loaded images should always have a width attribute. + * However, it is possible that lazy-loading could be added by a plugin, where we don't have that guarantee. + * As such, it still makes sense to ensure presence of a width attribute here in order to use `sizes=auto`. + */ + $width = $processor->get_attribute( 'width' ); + if ( ! is_string( $width ) || '' === $width ) { return $image; } @@ -2029,6 +2055,28 @@ function wp_sizes_attribute_includes_valid_auto( string $sizes_attr ): bool { return 'auto' === strtolower( trim( $first_size, " \t\f\r\n" ) ); } +/** + * Prints a CSS rule to fix potential visual issues with images using `sizes=auto`. + * + * This rule overrides the similar rule in the default user agent stylesheet, to avoid images that use e.g. + * `width: auto` or `width: fit-content` to appear smaller. + * + * @since 6.7.1 + * @see https://html.spec.whatwg.org/multipage/rendering.html#img-contain-size + * @see https://core.trac.wordpress.org/ticket/62413 + */ +function wp_print_auto_sizes_contain_css_fix() { + /** This filter is documented in wp-includes/media.php */ + $add_auto_sizes = apply_filters( 'wp_img_tag_add_auto_sizes', true ); + if ( ! $add_auto_sizes ) { + return; + } + + ?> + + false ) ); + + $this->assertStringNotContainsString( + 'width="', + $markup, + 'Failed confirming the test markup did not include a width attribute.' + ); + + $this->assertStringNotContainsString( + 'sizes="auto, ', + $markup, + 'Failed asserting that the sizes attribute for an image without a width does not include "auto".' + ); + } + /** * Test content filtered markup with lazy loading gets auto-sizes. * @@ -6236,6 +6266,46 @@ public function test_content_image_without_lazy_loading_does_not_have_auto_sizes ); } + /** + * Test content filtered markup with lazy loading does not get auto-sizes when disabled. + * + * @ticket 61847 + * @ticket 62413 + * + * @covers ::wp_img_tag_add_auto_sizes + */ + public function test_content_image_does_not_have_auto_sizes_when_disabled() { + // Force lazy loading attribute. + add_filter( 'wp_img_tag_add_loading_attr', '__return_true' ); + // Disable auto-sizes attribute. + add_filter( 'wp_img_tag_add_auto_sizes', '__return_false' ); + + $this->assertStringNotContainsString( + 'sizes="auto, ', + wp_filter_content_tags( get_image_tag( self::$large_id, '', '', '', 'large' ) ), + 'Failed asserting that the sizes attribute for a content image with lazy loading does not include "auto" when disabled.' + ); + } + + /** + * Test generated image markup with lazy loading does not get auto-sizes when disabled. + * + * @ticket 61847 + * @ticket 62413 + * + * @covers ::wp_img_tag_add_auto_sizes + */ + public function test_generated_image_does_not_have_auto_sizes_when_disabled() { + // Disable auto-sizes attribute. + add_filter( 'wp_img_tag_add_auto_sizes', '__return_false' ); + + $this->assertStringNotContainsString( + 'sizes="auto, ', + wp_get_attachment_image( self::$large_id, 'large', false, array( 'loading' => 'lazy' ) ), + 'Failed asserting that the sizes attribute for an image with lazy loading does not include "auto" when disabled.' + ); + } + /** * Test generated markup for an image with 'auto' keyword already present in sizes does not receive it again. * @@ -6385,44 +6455,48 @@ public function data_image_with_existing_auto_sizes() { public function data_provider_to_test_wp_img_tag_add_auto_sizes() { return array( 'expected_with_single_quoted_attributes' => array( - 'input' => "", - 'expected' => "", + 'input' => "", + 'expected' => "", ), 'expected_with_data_sizes_attribute' => array( - 'input' => '', - 'expected' => '', + 'input' => '', + 'expected' => '', ), 'expected_with_data_sizes_attribute_already_present' => array( - 'input' => '', - 'expected' => '', + 'input' => '', + 'expected' => '', ), 'not_expected_with_loading_lazy_in_attr_value' => array( - 'input' => '\'This', - 'expected' => '\'This', + 'input' => '\'This', + 'expected' => '\'This', ), 'not_expected_with_data_loading_attribute_present' => array( - 'input' => '', - 'expected' => '', + 'input' => '', + 'expected' => '', ), 'expected_when_attributes_have_spaces_after_them' => array( - 'input' => '', - 'expected' => '', + 'input' => '', + 'expected' => '', ), 'expected_when_attributes_are_upper_case' => array( - 'input' => '', - 'expected' => '', + 'input' => '', + 'expected' => '', ), 'expected_when_loading_lazy_lacks_quotes' => array( - 'input' => '', - 'expected' => '', + 'input' => '', + 'expected' => '', ), 'expected_when_loading_lazy_has_whitespace' => array( - 'input' => '', - 'expected' => '', + 'input' => '', + 'expected' => '', ), 'not_expected_when_sizes_auto_lacks_quotes' => array( - 'input' => '', - 'expected' => '', + 'input' => '', + 'expected' => '', + ), + 'not_expected_when_img_lacks_dimensions' => array( + 'input' => '', + 'expected' => '', ), ); } From 0365bff679a187fc37c01fdf1a1b42d95309a780 Mon Sep 17 00:00:00 2001 From: Michal Czaplinski Date: Mon, 18 Nov 2024 20:04:35 +0000 Subject: [PATCH 021/323] Interactivity API: Remove redundant server state from Interactivity Router Remove the workaround for a bug that was fixed in https://github.com/WordPress/gutenberg/pull/66183. Previously, if the store was not initialized with a minimal navigation object, the interactivity-router script module would error. Props jonsurrell, czapla, gziolo. Fixes 62465#. git-svn-id: https://develop.svn.wordpress.org/trunk@59416 602fd350-edb4-49c9-b593-d223f7449a82 --- .../class-wp-interactivity-api.php | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/wp-includes/interactivity-api/class-wp-interactivity-api.php b/src/wp-includes/interactivity-api/class-wp-interactivity-api.php index f71684599f22e..f6764736f9e8a 100644 --- a/src/wp-includes/interactivity-api/class-wp-interactivity-api.php +++ b/src/wp-includes/interactivity-api/class-wp-interactivity-api.php @@ -1090,19 +1090,6 @@ private function data_wp_router_region_processor( WP_Interactivity_API_Directive if ( 'enter' === $mode && ! $this->has_processed_router_region ) { $this->has_processed_router_region = true; - /* - * Initialize the `core/router` store. - * If the store is not initialized like this with minimal - * navigation object, the interactivity-router script module - * errors. - */ - $this->state( - 'core/router', - array( - 'navigation' => new stdClass(), - ) - ); - // Enqueues as an inline style. wp_register_style( 'wp-interactivity-router-animations', false ); wp_add_inline_style( 'wp-interactivity-router-animations', $this->get_router_animation_styles() ); From af003c4616f76764e7b6e1ec61aedcf9da0e022e Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Mon, 18 Nov 2024 23:36:26 +0000 Subject: [PATCH 022/323] =?UTF-8?q?Users:=20Correct=20=E2=80=9CAdd=20New?= =?UTF-8?q?=20User=E2=80=9D=20page=20reference=20on=20Network=20Settings?= =?UTF-8?q?=20screen.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up to [56515]. Props timse201. Fixes #62458. git-svn-id: https://develop.svn.wordpress.org/trunk@59417 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/network/settings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-admin/network/settings.php b/src/wp-admin/network/settings.php index a8504e4b279d8..c93d98a169849 100644 --- a/src/wp-admin/network/settings.php +++ b/src/wp-admin/network/settings.php @@ -250,7 +250,7 @@ - + From dec5c906459c5cdebe7630fb6a61bcbf3e4344b9 Mon Sep 17 00:00:00 2001 From: ramonopoly Date: Tue, 19 Nov 2024 04:42:17 +0000 Subject: [PATCH 023/323] Theme JSON: include block style variations in path only output of get_block_nodes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit An `$include_node_paths_only` option to `get_block_nodes()` was introduced to improve performance. When set to `true`, this option tells the function to only return paths, and not selectors, for consumers that only needed paths to style values. For one of the conditional blocks, block style variations wasn't included. This commit adds them to the array of paths following the existing model `$node[]['path' => [], 'variations' => ['path' => []]]`. Follow-up to [61858]. Props aaronrobertshaw, ramonopoly. Fixes #62399. git-svn-id: https://develop.svn.wordpress.org/trunk@59418 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-theme-json.php | 14 +++- tests/phpunit/tests/theme/wpThemeJson.php | 79 +++++++++++++++++++++++ 2 files changed, 92 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/class-wp-theme-json.php b/src/wp-includes/class-wp-theme-json.php index f40fde9cf82b3..7885f27b420c5 100644 --- a/src/wp-includes/class-wp-theme-json.php +++ b/src/wp-includes/class-wp-theme-json.php @@ -2722,9 +2722,21 @@ private static function get_block_nodes( $theme_json, $selectors = array(), $opt foreach ( $theme_json['styles']['blocks'] as $name => $node ) { $node_path = array( 'styles', 'blocks', $name ); if ( $include_node_paths_only ) { - $nodes[] = array( + $variation_paths = array(); + if ( $include_variations && isset( $node['variations'] ) ) { + foreach ( $node['variations'] as $variation => $variation_node ) { + $variation_paths[] = array( + 'path' => array( 'styles', 'blocks', $name, 'variations', $variation ), + ); + } + } + $node = array( 'path' => $node_path, ); + if ( ! empty( $variation_paths ) ) { + $node['variations'] = $variation_paths; + } + $nodes[] = $node; } else { $selector = null; if ( isset( $selectors[ $name ]['selector'] ) ) { diff --git a/tests/phpunit/tests/theme/wpThemeJson.php b/tests/phpunit/tests/theme/wpThemeJson.php index 5b0653c6849a3..8fe8c7d5d0d65 100644 --- a/tests/phpunit/tests/theme/wpThemeJson.php +++ b/tests/phpunit/tests/theme/wpThemeJson.php @@ -2502,6 +2502,85 @@ public function test_return_block_node_paths() { $this->assertEquals( $expected, $block_nodes ); } + /** + * This test covers `get_block_nodes` with the `$include_node_paths_only` + * and `include_block_style_variations` options. + * + * @ticket 62399 + */ + public function test_return_block_node_paths_with_variations() { + $theme_json = new ReflectionClass( 'WP_Theme_JSON' ); + + $func = $theme_json->getMethod( 'get_block_nodes' ); + $func->setAccessible( true ); + + $theme_json = array( + 'version' => WP_Theme_JSON::LATEST_SCHEMA, + 'styles' => array( + 'typography' => array( + 'fontSize' => '16px', + ), + 'blocks' => array( + 'core/button' => array( + 'color' => array( + 'background' => 'red', + ), + 'variations' => array( + 'cheese' => array( + 'color' => array( + 'background' => 'cheese', + ), + ), + ), + ), + 'core/group' => array( + 'color' => array( + 'background' => 'blue', + ), + 'variations' => array( + 'apricot' => array( + 'color' => array( + 'background' => 'apricot', + ), + ), + ), + ), + ), + ), + ); + + $block_nodes = $func->invoke( + null, + $theme_json, + array(), + array( + 'include_node_paths_only' => true, + 'include_block_style_variations' => true, + ) + ); + + $expected = array( + array( + 'path' => array( 'styles', 'blocks', 'core/button' ), + 'variations' => array( + array( + 'path' => array( 'styles', 'blocks', 'core/button', 'variations', 'cheese' ), + ), + ), + ), + array( + 'path' => array( 'styles', 'blocks', 'core/group' ), + 'variations' => array( + array( + 'path' => array( 'styles', 'blocks', 'core/group', 'variations', 'apricot' ), + ), + ), + ), + ); + + $this->assertEquals( $expected, $block_nodes ); + } + /** * @ticket 54336 */ From 11e4c7c5dd8c0366e0f911995881a6ca9a2323e5 Mon Sep 17 00:00:00 2001 From: Riad Benguella Date: Tue, 19 Nov 2024 08:00:36 +0000 Subject: [PATCH 024/323] Admin Color Scheme: Update the highlight color in the Modern color scheme. In the Modern color scheme, the font color on hover in the admin bar is bright green. However, in the WordPress.org site itself, the color used is Blueberry 2. This commits aligns both colors on the more balanced Blueberry color. Props fushar, Joen. Fixes #62219. git-svn-id: https://develop.svn.wordpress.org/trunk@59419 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/css/colors/modern/colors.scss | 2 +- src/wp-includes/general-template.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-admin/css/colors/modern/colors.scss b/src/wp-admin/css/colors/modern/colors.scss index 845d4f034dae8..a66855729fbd4 100644 --- a/src/wp-admin/css/colors/modern/colors.scss +++ b/src/wp-admin/css/colors/modern/colors.scss @@ -3,7 +3,7 @@ $scheme-name: "modern"; $base-color: #1e1e1e; $highlight-color: #3858e9; -$menu-submenu-focus-text: #33f078; +$menu-submenu-focus-text: #7b90ff; $notification-color: $highlight-color; $link: $highlight-color; diff --git a/src/wp-includes/general-template.php b/src/wp-includes/general-template.php index b4aa26e2e493e..1d9fc98b843f7 100644 --- a/src/wp-includes/general-template.php +++ b/src/wp-includes/general-template.php @@ -4762,7 +4762,7 @@ function register_admin_color_schemes() { 'modern', _x( 'Modern', 'admin color scheme' ), admin_url( "css/colors/modern/colors$suffix.css" ), - array( '#1e1e1e', '#3858e9', '#33f078' ), + array( '#1e1e1e', '#3858e9', '#7b90ff' ), array( 'base' => '#f3f1f1', 'focus' => '#fff', From 6c00c00fd6338df6ec02abaae4ae7ae4bb715398 Mon Sep 17 00:00:00 2001 From: Michal Czaplinski Date: Tue, 19 Nov 2024 16:03:08 +0000 Subject: [PATCH 025/323] HTML API: Use case insensitive tag_name comparison in `::next_tag`. The HTML API `::next_tag` method now performs case-insensitive matching when searching for tags by name. For example, searching for 'DIV' will match both '
' and '
' tags. Props jonsurrell, dmsnell. Fixes #62427. git-svn-id: https://develop.svn.wordpress.org/trunk@59422 602fd350-edb4-49c9-b593-d223f7449a82 --- .../html-api/class-wp-html-processor.php | 4 ++++ tests/phpunit/tests/html-api/wpHtmlProcessor.php | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/wp-includes/html-api/class-wp-html-processor.php b/src/wp-includes/html-api/class-wp-html-processor.php index 9abc782d0cb32..cfcd6bdb94e94 100644 --- a/src/wp-includes/html-api/class-wp-html-processor.php +++ b/src/wp-includes/html-api/class-wp-html-processor.php @@ -557,6 +557,10 @@ public function next_tag( $query = null ): bool { return false; } + if ( isset( $query['tag_name'] ) ) { + $query['tag_name'] = strtoupper( $query['tag_name'] ); + } + $needs_class = ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) ) ? $query['class_name'] : null; diff --git a/tests/phpunit/tests/html-api/wpHtmlProcessor.php b/tests/phpunit/tests/html-api/wpHtmlProcessor.php index fd9d812103865..1ca60e691f03e 100644 --- a/tests/phpunit/tests/html-api/wpHtmlProcessor.php +++ b/tests/phpunit/tests/html-api/wpHtmlProcessor.php @@ -1042,4 +1042,19 @@ public function test_ensure_next_token_method_extensibility( $html, $expected_to $this->assertEquals( $expected_token_counts, $processor->token_seen_count, 'Snapshot: ' . var_export( $processor->token_seen_count, true ) ); } + + /** + * Ensure that lowercased tag_name query matches tags case-insensitively. + * + * @group 62427 + */ + public function test_next_tag_lowercase_tag_name() { + // The upper case
is irrelevant but illustrates the case-insentivity. + $processor = WP_HTML_Processor::create_fragment( '
' ); + $this->assertTrue( $processor->next_tag( array( 'tag_name' => 'div' ) ) ); + + // The upper case is irrelevant but illustrates the case-insentivity. + $processor = WP_HTML_Processor::create_fragment( '' ); + $this->assertTrue( $processor->next_tag( array( 'tag_name' => 'rect' ) ) ); + } } From 42af8b7735f9ad66a1f9b424e2ed8d1bdc3fecc3 Mon Sep 17 00:00:00 2001 From: Joe Dolson Date: Tue, 19 Nov 2024 21:22:10 +0000 Subject: [PATCH 026/323] Login: Revert selector change in login heading CSS. In [59138], the login screens were updated to change the `h1` heading from the logo to screen-reader hidden text. Along with that HTML change, we changed the CSS selectors from `.login h1` to `.login .wp-login-logo`. This unnecessary change increased specificity and broke the CSS selectors used by a wide variety of plugins to replace the login logo. Commit reverts the change in selector back to using the `.login h1` pattern. Props leecollings, sabernhardt, im3dabasia1, roytanck, sailpete, joedolson. Fixes #62410. git-svn-id: https://develop.svn.wordpress.org/trunk@59424 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/css/login.css | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/wp-admin/css/login.css b/src/wp-admin/css/login.css index 57465ea586479..c2211d9da681e 100644 --- a/src/wp-admin/css/login.css +++ b/src/wp-admin/css/login.css @@ -269,11 +269,11 @@ p { vertical-align: baseline; } -.login .wp-login-logo { +.login h1 { text-align: center; } -.login .wp-login-logo a { +.login h1 a { background-image: url(../images/w-logo-blue.png?ver=20131202); background-image: none, url(../images/wordpress-logo.svg?ver=20131107); background-size: 84px; @@ -323,13 +323,13 @@ p { .login #nav a:hover, .login #backtoblog a:hover, -.login .wp-login-logo a:hover { +.login h1 a:hover { color: #135e96; } .login #nav a:focus, .login #backtoblog a:focus, -.login .wp-login-logo a:focus { +.login h1 a:focus { color: #043959; } @@ -390,7 +390,7 @@ body.interim-login { margin: 5px auto 20px; } -.interim-login.login .wp-login-logo a { +.interim-login.login h1 a { width: auto; } From 7f2684100c9c093546fb8cd221f6f3d3bae706ab Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Tue, 19 Nov 2024 22:16:52 +0000 Subject: [PATCH 027/323] Toolbar: Allow the Learn WordPress link to be localized. The Learn WordPress website is supposed to automatically redirect to the correct locale according to the browser's language settings, however that may not work as expected in some cases. This commit brings consistency with the other WordPress.org links, which can be localized as appropriate. Follow-up to [56720]. Props timse201, ruturajraval2305, yogeshbhutkar, ajayghaghretiya-multidots, swissspidy, sabernhardt, im3dabasia1, mukesh27. Fixes #62459. git-svn-id: https://develop.svn.wordpress.org/trunk@59425 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/admin-bar.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/admin-bar.php b/src/wp-includes/admin-bar.php index 0d7c3b63c70ef..9bb26e7ed792c 100644 --- a/src/wp-includes/admin-bar.php +++ b/src/wp-includes/admin-bar.php @@ -205,7 +205,7 @@ function wp_admin_bar_wp_menu( $wp_admin_bar ) { 'parent' => 'wp-logo-external', 'id' => 'learn', 'title' => __( 'Learn WordPress' ), - 'href' => 'https://learn.wordpress.org/', + 'href' => __( 'https://learn.wordpress.org/' ), ) ); From e1d14937decf1868ba9ad9fd97bf6f70891c22c0 Mon Sep 17 00:00:00 2001 From: Joe Dolson Date: Tue, 19 Nov 2024 23:23:52 +0000 Subject: [PATCH 028/323] Menus: i18n: Fix untranslatable strings in `nav-menu.js`. Wrap three untranslatable strings in nav menus in JS translation functions. Follow up to [59265]. Props juliemoynat, swissspidy, yogeshbhutkar, sergeybiryukov, desrosj, tobifjellner, audrasjb, joedolson. Fixes #62402. git-svn-id: https://develop.svn.wordpress.org/trunk@59426 602fd350-edb4-49c9-b593-d223f7449a82 --- src/js/_enqueues/lib/nav-menu.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/js/_enqueues/lib/nav-menu.js b/src/js/_enqueues/lib/nav-menu.js index be66268a5c087..3b1daa997067b 100644 --- a/src/js/_enqueues/lib/nav-menu.js +++ b/src/js/_enqueues/lib/nav-menu.js @@ -319,7 +319,7 @@ $selected = 'selected'; } - $html += ''; + $html += ''; $.each( menuItems, function() { var menuItem = $(this), @@ -364,7 +364,13 @@ if ( i == itemPosition ) { $selected = 'selected'; } - $html += ''; + // Translators: %1$s is the current menu item number, %2$s is the total number of menu items. + var itemString = wp.i18n.sprintf( + wp.i18n._x( '%1$s of %2$s', 'indicating a part of a total number of items in a navigation menu' ), + i, + totalMenuItems + ); + $html += ''; } } else { @@ -380,7 +386,13 @@ if ( i == itemPosition ) { $selected = 'selected'; } - $html += ''; + // Translators: %1$s is the current submenu item number, %2$s is the total number of submenu items. + var submenuString = wp.i18n.sprintf( + wp.i18n._x( '%1$s of %2$s', 'indicating a part of a total number of items in a submenu' ), + i, + totalSubMenuItems + ); + $html += ''; } } From 9b6229463b1eaee92bcde71341fa96ceb344b383 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Wed, 20 Nov 2024 01:37:43 +0000 Subject: [PATCH 029/323] Options, Meta APIs: Ensure duplicate salts are properly flagged. Improvements were made in 6.7 to ensure that salts stored in the database were primed more efficiently. The logic added to accomplish this suffered from an edge case where array indexes were unexpectedly missing when `wp_salt()` was called recursively. Follow up to [58837]. Props juliobox, ankitkumarshah, dilipbheda, johnbillion, joemcgill, desrosj. Fixes #62424. git-svn-id: https://develop.svn.wordpress.org/trunk@59427 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/pluggable.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/wp-includes/pluggable.php b/src/wp-includes/pluggable.php index da637ebbcfefc..cc16e8c8bde37 100644 --- a/src/wp-includes/pluggable.php +++ b/src/wp-includes/pluggable.php @@ -2479,16 +2479,7 @@ function wp_salt( $scheme = 'auth' ) { static $duplicated_keys; if ( null === $duplicated_keys ) { - $duplicated_keys = array( - 'put your unique phrase here' => true, - ); - - /* - * translators: This string should only be translated if wp-config-sample.php is localized. - * You can check the localized release package or - * https://i18n.svn.wordpress.org//branches//dist/wp-config-sample.php - */ - $duplicated_keys[ __( 'put your unique phrase here' ) ] = true; + $duplicated_keys = array(); foreach ( array( 'AUTH', 'SECURE_AUTH', 'LOGGED_IN', 'NONCE', 'SECRET' ) as $first ) { foreach ( array( 'KEY', 'SALT' ) as $second ) { @@ -2499,6 +2490,15 @@ function wp_salt( $scheme = 'auth' ) { $duplicated_keys[ $value ] = isset( $duplicated_keys[ $value ] ); } } + + $duplicated_keys['put your unique phrase here'] = true; + + /* + * translators: This string should only be translated if wp-config-sample.php is localized. + * You can check the localized release package or + * https://i18n.svn.wordpress.org//branches//dist/wp-config-sample.php + */ + $duplicated_keys[ __( 'put your unique phrase here' ) ] = true; } /* From 193f6eb26e65216576a10492dd4103044c3a079c Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Wed, 20 Nov 2024 02:48:40 +0000 Subject: [PATCH 030/323] i18n: Account for `load_*_textdomain()` after JIT loading. When `load_*_textdomain()` functions are called after WordPress has already attempted just-in-time loading of translations, nothing happens. This updates the related logic to retry translation loading when a custom path is set to ensure all translations are available. Additionally, this also fixes cases where an `en_US.mo` file is provided with non-English strings to override the default language. Follow up to [59157]. Props swissspidy, peterwilsoncc, desrosj, apermo, sergeybiryukov, wildworks, tigriweb, twvania, looswebstudio, stimul, audrasjb, finntown, bluantinoo, timwhitlock, albigdd. See #62337. git-svn-id: https://develop.svn.wordpress.org/trunk@59430 602fd350-edb4-49c9-b593-d223f7449a82 --- .../class-wp-textdomain-registry.php | 12 +++++++- src/wp-includes/l10n.php | 29 ++++++++++++++++-- .../custom-internationalized-plugin.php | 6 +++- .../tests/l10n/loadTextdomainJustInTime.php | 30 +++++++++++++++++++ tests/phpunit/tests/l10n/wpLocaleSwitcher.php | 2 ++ .../tests/l10n/wpTextdomainRegistry.php | 5 ++-- 6 files changed, 77 insertions(+), 7 deletions(-) diff --git a/src/wp-includes/class-wp-textdomain-registry.php b/src/wp-includes/class-wp-textdomain-registry.php index e5aeb82e5cda5..bb2135e3650a2 100644 --- a/src/wp-includes/class-wp-textdomain-registry.php +++ b/src/wp-includes/class-wp-textdomain-registry.php @@ -153,6 +153,16 @@ public function set( $domain, $locale, $path ) { * @param string $path Language directory path. */ public function set_custom_path( $domain, $path ) { + // If just-in-time loading was triggered before, reset the entry so it can be tried again. + + if ( isset( $this->all[ $domain ] ) ) { + $this->all[ $domain ] = array_filter( $this->all[ $domain ] ); + } + + if ( empty( $this->current[ $domain ] ) ) { + unset( $this->current[ $domain ] ); + } + $this->custom_paths[ $domain ] = rtrim( $path, '/' ); } @@ -336,7 +346,7 @@ private function get_path_from_lang_dir( $domain, $locale ) { * If no path is found for the given locale and a custom path has been set * using load_plugin_textdomain/load_theme_textdomain, use that one. */ - if ( 'en_US' !== $locale && isset( $this->custom_paths[ $domain ] ) ) { + if ( isset( $this->custom_paths[ $domain ] ) ) { $fallback_location = rtrim( $this->custom_paths[ $domain ], '/' ) . '/'; $this->set( $domain, $locale, $fallback_location ); return $fallback_location; diff --git a/src/wp-includes/l10n.php b/src/wp-includes/l10n.php index bee3581618181..f9239f84b9e03 100644 --- a/src/wp-includes/l10n.php +++ b/src/wp-includes/l10n.php @@ -985,6 +985,9 @@ function load_default_textdomain( $locale = null ) { * @since 4.6.0 The function now tries to load the .mo file from the languages directory first. * @since 6.7.0 Translations are no longer immediately loaded, but handed off to the just-in-time loading mechanism. * + * @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry. + * @global array $l10n An array of all currently loaded text domains. + * * @param string $domain Unique identifier for retrieving translated strings * @param string|false $deprecated Optional. Deprecated. Use the $plugin_rel_path parameter instead. * Default false. @@ -994,7 +997,8 @@ function load_default_textdomain( $locale = null ) { */ function load_plugin_textdomain( $domain, $deprecated = false, $plugin_rel_path = false ) { /** @var WP_Textdomain_Registry $wp_textdomain_registry */ - global $wp_textdomain_registry; + /** @var array $l10n */ + global $wp_textdomain_registry, $l10n; if ( ! is_string( $domain ) ) { return false; @@ -1011,6 +1015,11 @@ function load_plugin_textdomain( $domain, $deprecated = false, $plugin_rel_path $wp_textdomain_registry->set_custom_path( $domain, $path ); + // If just-in-time loading was triggered before, reset the entry so it can be tried again. + if ( isset( $l10n[ $domain ] ) && $l10n[ $domain ] instanceof NOOP_Translations ) { + unset( $l10n[ $domain ] ); + } + return true; } @@ -1022,6 +1031,7 @@ function load_plugin_textdomain( $domain, $deprecated = false, $plugin_rel_path * @since 6.7.0 Translations are no longer immediately loaded, but handed off to the just-in-time loading mechanism. * * @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry. + * @global array $l10n An array of all currently loaded text domains. * * @param string $domain Text domain. Unique identifier for retrieving translated strings. * @param string $mu_plugin_rel_path Optional. Relative to `WPMU_PLUGIN_DIR` directory in which the .mo @@ -1030,7 +1040,8 @@ function load_plugin_textdomain( $domain, $deprecated = false, $plugin_rel_path */ function load_muplugin_textdomain( $domain, $mu_plugin_rel_path = '' ) { /** @var WP_Textdomain_Registry $wp_textdomain_registry */ - global $wp_textdomain_registry; + /** @var array $l10n */ + global $wp_textdomain_registry, $l10n; if ( ! is_string( $domain ) ) { return false; @@ -1040,6 +1051,11 @@ function load_muplugin_textdomain( $domain, $mu_plugin_rel_path = '' ) { $wp_textdomain_registry->set_custom_path( $domain, $path ); + // If just-in-time loading was triggered before, reset the entry so it can be tried again. + if ( isset( $l10n[ $domain ] ) && $l10n[ $domain ] instanceof NOOP_Translations ) { + unset( $l10n[ $domain ] ); + } + return true; } @@ -1056,6 +1072,7 @@ function load_muplugin_textdomain( $domain, $mu_plugin_rel_path = '' ) { * @since 6.7.0 Translations are no longer immediately loaded, but handed off to the just-in-time loading mechanism. * * @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry. + * @global array $l10n An array of all currently loaded text domains. * * @param string $domain Text domain. Unique identifier for retrieving translated strings. * @param string|false $path Optional. Path to the directory containing the .mo file. @@ -1064,7 +1081,8 @@ function load_muplugin_textdomain( $domain, $mu_plugin_rel_path = '' ) { */ function load_theme_textdomain( $domain, $path = false ) { /** @var WP_Textdomain_Registry $wp_textdomain_registry */ - global $wp_textdomain_registry; + /** @var array $l10n */ + global $wp_textdomain_registry, $l10n; if ( ! is_string( $domain ) ) { return false; @@ -1076,6 +1094,11 @@ function load_theme_textdomain( $domain, $path = false ) { $wp_textdomain_registry->set_custom_path( $domain, $path ); + // If just-in-time loading was triggered before, reset the entry so it can be tried again. + if ( isset( $l10n[ $domain ] ) && $l10n[ $domain ] instanceof NOOP_Translations ) { + unset( $l10n[ $domain ] ); + } + return true; } diff --git a/tests/phpunit/data/plugins/custom-internationalized-plugin/custom-internationalized-plugin.php b/tests/phpunit/data/plugins/custom-internationalized-plugin/custom-internationalized-plugin.php index 41eb59355633a..c7d1c0d5e42f8 100644 --- a/tests/phpunit/data/plugins/custom-internationalized-plugin/custom-internationalized-plugin.php +++ b/tests/phpunit/data/plugins/custom-internationalized-plugin/custom-internationalized-plugin.php @@ -7,7 +7,11 @@ Text Domain: custom-internationalized-plugin */ -load_plugin_textdomain( 'custom-internationalized-plugin', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' ); +function custom_i18n_load_textdomain() { + load_plugin_textdomain( 'custom-internationalized-plugin', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' ); +} + +add_action( 'init', 'custom_i18n_load_textdomain' ); function custom_i18n_plugin_test() { return __( 'This is a dummy plugin', 'custom-internationalized-plugin' ); diff --git a/tests/phpunit/tests/l10n/loadTextdomainJustInTime.php b/tests/phpunit/tests/l10n/loadTextdomainJustInTime.php index ea6de4017be26..af8bb8825ac9e 100644 --- a/tests/phpunit/tests/l10n/loadTextdomainJustInTime.php +++ b/tests/phpunit/tests/l10n/loadTextdomainJustInTime.php @@ -342,4 +342,34 @@ public function test_get_locale_is_called_only_once_per_textdomain_with_custom_l $this->assertFalse( is_textdomain_loaded( $textdomain ) ); $this->assertSame( 1, $filter->get_call_count() ); } + + /** + * @ticket 44937 + * @ticket 62337 + * + * @covers ::load_plugin_textdomain + * @covers ::is_textdomain_loaded + * @covers WP_Textdomain_Registry::set_custom_path + */ + public function test_plugin_translation_should_be_translated_when_calling_load_plugin_textdomain_too_late() { + require_once DIR_TESTDATA . '/plugins/custom-internationalized-plugin/custom-internationalized-plugin.php'; + + add_filter( 'locale', array( $this, 'filter_set_locale_to_german' ) ); + + $is_textdomain_loaded_before = is_textdomain_loaded( 'custom-internationalized-plugin' ); + $output_before = custom_i18n_plugin_test(); + + $is_textdomain_loaded_middle = is_textdomain_loaded( 'custom-internationalized-plugin' ); + + custom_i18n_load_textdomain(); + + $output_after = custom_i18n_plugin_test(); + $is_textdomain_loaded_after = is_textdomain_loaded( 'custom-internationalized-plugin' ); + + $this->assertFalse( $is_textdomain_loaded_before ); + $this->assertFalse( $is_textdomain_loaded_middle ); + $this->assertSame( 'This is a dummy plugin', $output_before ); + $this->assertSame( 'Das ist ein Dummy Plugin', $output_after ); + $this->assertTrue( $is_textdomain_loaded_after ); + } } diff --git a/tests/phpunit/tests/l10n/wpLocaleSwitcher.php b/tests/phpunit/tests/l10n/wpLocaleSwitcher.php index ba12a432e41b5..f24ca7695ca9b 100644 --- a/tests/phpunit/tests/l10n/wpLocaleSwitcher.php +++ b/tests/phpunit/tests/l10n/wpLocaleSwitcher.php @@ -493,6 +493,8 @@ public function test_switch_reloads_plugin_translations_outside_wp_lang_dir() { require_once DIR_TESTDATA . '/plugins/custom-internationalized-plugin/custom-internationalized-plugin.php'; + custom_i18n_load_textdomain(); + $actual = custom_i18n_plugin_test(); switch_to_locale( 'es_ES' ); diff --git a/tests/phpunit/tests/l10n/wpTextdomainRegistry.php b/tests/phpunit/tests/l10n/wpTextdomainRegistry.php index 0344fe6cafc38..f5a12ff779dde 100644 --- a/tests/phpunit/tests/l10n/wpTextdomainRegistry.php +++ b/tests/phpunit/tests/l10n/wpTextdomainRegistry.php @@ -39,9 +39,10 @@ public function test_set_custom_path() { $this->instance->has( 'foo' ), 'Incorrect availability status for textdomain with custom path' ); - $this->assertFalse( + $this->assertSame( + WP_LANG_DIR . '/bar/', $this->instance->get( 'foo', 'en_US' ), - 'Should not return custom path for textdomain and en_US locale' + 'Should return custom path for textdomain and en_US locale' ); $this->assertSame( WP_LANG_DIR . '/bar/', From 654475fa25c88a2fecf9290ffcd9512b553a8574 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Wed, 20 Nov 2024 11:20:36 +0000 Subject: [PATCH 031/323] I18N: Adjust translator comments in `nav-menu.js`. Includes: * Moving the comments directly above `wp.i18n._x()` so that they can be picked up properly. * Simplifying the context to avoid unnecessarily translating the string twice for the same use case. * Using the established translator comments format for consistency. Follow-up to [59428]. See #62402. git-svn-id: https://develop.svn.wordpress.org/trunk@59431 602fd350-edb4-49c9-b593-d223f7449a82 --- src/js/_enqueues/lib/nav-menu.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/js/_enqueues/lib/nav-menu.js b/src/js/_enqueues/lib/nav-menu.js index 3b1daa997067b..398f54ecfddc6 100644 --- a/src/js/_enqueues/lib/nav-menu.js +++ b/src/js/_enqueues/lib/nav-menu.js @@ -364,9 +364,9 @@ if ( i == itemPosition ) { $selected = 'selected'; } - // Translators: %1$s is the current menu item number, %2$s is the total number of menu items. var itemString = wp.i18n.sprintf( - wp.i18n._x( '%1$s of %2$s', 'indicating a part of a total number of items in a navigation menu' ), + /* translators: 1: The current menu item number, 2: The total number of menu items. */ + wp.i18n._x( '%1$s of %2$s', 'part of a total number of menu items' ), i, totalMenuItems ); @@ -386,9 +386,9 @@ if ( i == itemPosition ) { $selected = 'selected'; } - // Translators: %1$s is the current submenu item number, %2$s is the total number of submenu items. var submenuString = wp.i18n.sprintf( - wp.i18n._x( '%1$s of %2$s', 'indicating a part of a total number of items in a submenu' ), + /* translators: 1: The current submenu item number, 2: The total number of submenu items. */ + wp.i18n._x( '%1$s of %2$s', 'part of a total number of menu items' ), i, totalSubMenuItems ); From f9418c7c3df66a46df00354f93cee92e73601bd3 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Wed, 20 Nov 2024 16:18:06 +0000 Subject: [PATCH 032/323] Editor: update npm packages in trunk for 6.7.1. Syncs Editor packages for WordPress 6.7.1 RC1. Includes the following PRs: - https://github.com/WordPress/gutenberg/pull/66945 - https://github.com/WordPress/gutenberg/pull/66889 - https://github.com/WordPress/gutenberg/pull/67139 Reviewed by desrosj. Merges [59437] to trunk. Props mmaattiiaass, ramonopoly, mamaduka, get_dave, poena, ntsekouras, mcsf, jsnajdr, 0mirka00, desrosj, joemcgill, cbravobernal, azaozz, room34, mayanktripathi32, im3dabasia1, jonsurrell. Fixes #62478, #62447. git-svn-id: https://develop.svn.wordpress.org/trunk@59438 602fd350-edb4-49c9-b593-d223f7449a82 --- package-lock.json | 462 ++++++++++-------- package.json | 48 +- .../assets/script-loader-packages.min.php | 2 +- 3 files changed, 293 insertions(+), 219 deletions(-) diff --git a/package-lock.json b/package-lock.json index ff98ab2d2914c..162040e719015 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,58 +14,58 @@ "@wordpress/api-fetch": "7.8.2", "@wordpress/autop": "4.8.1", "@wordpress/blob": "4.8.1", - "@wordpress/block-directory": "5.8.17", - "@wordpress/block-editor": "14.3.14", - "@wordpress/block-library": "9.8.15", + "@wordpress/block-directory": "5.8.18", + "@wordpress/block-editor": "14.3.15", + "@wordpress/block-library": "9.8.16", "@wordpress/block-serialization-default-parser": "5.8.1", "@wordpress/blocks": "13.8.5", - "@wordpress/commands": "1.8.10", - "@wordpress/components": "28.8.10", + "@wordpress/commands": "1.8.11", + "@wordpress/components": "28.8.11", "@wordpress/compose": "7.8.3", - "@wordpress/core-commands": "1.8.14", - "@wordpress/core-data": "7.8.14", - "@wordpress/customize-widgets": "5.8.15", + "@wordpress/core-commands": "1.8.15", + "@wordpress/core-data": "7.8.15", + "@wordpress/customize-widgets": "5.8.16", "@wordpress/data": "10.8.3", "@wordpress/data-controls": "4.8.3", - "@wordpress/dataviews": "4.4.10", + "@wordpress/dataviews": "4.4.11", "@wordpress/date": "5.8.2", "@wordpress/deprecated": "4.8.2", "@wordpress/dom": "4.8.2", "@wordpress/dom-ready": "4.8.1", - "@wordpress/edit-post": "8.8.17", - "@wordpress/edit-site": "6.8.17", - "@wordpress/edit-widgets": "6.8.15", - "@wordpress/editor": "14.8.17", + "@wordpress/edit-post": "8.8.18", + "@wordpress/edit-site": "6.8.18", + "@wordpress/edit-widgets": "6.8.16", + "@wordpress/editor": "14.8.18", "@wordpress/element": "6.8.1", "@wordpress/escape-html": "3.8.1", - "@wordpress/fields": "0.0.15", - "@wordpress/format-library": "5.8.14", + "@wordpress/fields": "0.0.16", + "@wordpress/format-library": "5.8.15", "@wordpress/hooks": "4.8.2", "@wordpress/html-entities": "4.8.1", "@wordpress/i18n": "5.8.2", "@wordpress/icons": "10.8.2", "@wordpress/interactivity": "6.8.5", "@wordpress/interactivity-router": "2.8.6", - "@wordpress/interface": "6.8.10", + "@wordpress/interface": "6.8.11", "@wordpress/is-shallow-equal": "5.8.1", "@wordpress/keyboard-shortcuts": "5.8.3", "@wordpress/keycodes": "4.8.2", - "@wordpress/list-reusable-blocks": "5.8.10", + "@wordpress/list-reusable-blocks": "5.8.11", "@wordpress/media-utils": "5.8.2", "@wordpress/notices": "5.8.3", - "@wordpress/nux": "9.8.10", - "@wordpress/patterns": "2.8.14", - "@wordpress/plugins": "7.8.10", - "@wordpress/preferences": "4.8.10", + "@wordpress/nux": "9.8.11", + "@wordpress/patterns": "2.8.15", + "@wordpress/plugins": "7.8.11", + "@wordpress/preferences": "4.8.11", "@wordpress/preferences-persistence": "2.8.2", "@wordpress/primitives": "4.8.1", "@wordpress/priority-queue": "3.8.1", "@wordpress/private-apis": "1.8.1", "@wordpress/redux-routine": "5.8.1", - "@wordpress/reusable-blocks": "5.8.14", + "@wordpress/reusable-blocks": "5.8.15", "@wordpress/rich-text": "7.8.3", "@wordpress/router": "1.8.1", - "@wordpress/server-side-render": "5.8.10", + "@wordpress/server-side-render": "5.8.11", "@wordpress/shortcode": "4.8.1", "@wordpress/style-engine": "2.8.1", "@wordpress/sync": "1.8.1", @@ -74,7 +74,7 @@ "@wordpress/url": "4.8.1", "@wordpress/viewport": "6.8.3", "@wordpress/warning": "3.8.1", - "@wordpress/widgets": "4.8.14", + "@wordpress/widgets": "4.8.15", "@wordpress/wordcount": "4.8.1", "backbone": "1.6.0", "clipboard": "2.0.11", @@ -6257,6 +6257,7 @@ "version": "4.8.2", "resolved": "https://registry.npmjs.org/@wordpress/a11y/-/a11y-4.8.2.tgz", "integrity": "sha512-eILr2ZYK5FYSlx18rnP06qKyPELxEyDcnosSOsjskPGw5gYT01sUf0fkAebliuG88VppT+bgI008TRo3dvtZzQ==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/dom-ready": "^4.8.1", @@ -6271,6 +6272,7 @@ "version": "3.8.3", "resolved": "https://registry.npmjs.org/@wordpress/annotations/-/annotations-3.8.3.tgz", "integrity": "sha512-ihDxDnDDX73j7VGZutx0XBGelMf9cZmfh3L6hNW5CFacMTaH9+FNAY4+2I55N+fWOE7h1ePlHeL5DXvz38xsug==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/data": "^10.8.3", @@ -6291,6 +6293,7 @@ "version": "7.8.2", "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-7.8.2.tgz", "integrity": "sha512-6jiodZD4+5lIelb/E6FHMa6xuldcoIkQ5vWtvHpoB30++7eOgYi0tl5b1NlzGqfReIcl9oO+Wwp5V9mRE+mJoA==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/i18n": "^5.8.2", @@ -6305,6 +6308,7 @@ "version": "4.8.1", "resolved": "https://registry.npmjs.org/@wordpress/autop/-/autop-4.8.1.tgz", "integrity": "sha512-/ah4oBIRGMZlxBBPiD6R5uamCPEXTzmsJ0iceDJxMHc5KvNcy59oHNCirD5yiRLORk8RrujUczIGfglpUjGh2Q==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0" }, @@ -6318,6 +6322,7 @@ "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-8.8.2.tgz", "integrity": "sha512-XhIpSw6d8GeaBe+gQ25nck01+Q3UiVQgih/yBCFWNtzB2qp/AB7195lHGxbuAYUO9RM1eXsf8kVJV2caAb4WnA==", "dev": true, + "license": "GPL-2.0-or-later", "dependencies": { "@babel/core": "^7.16.0", "@babel/plugin-transform-react-jsx": "^7.16.0", @@ -6351,6 +6356,7 @@ "version": "4.8.1", "resolved": "https://registry.npmjs.org/@wordpress/blob/-/blob-4.8.1.tgz", "integrity": "sha512-fMLWmum+B8aZi5w8Tie7mw+LEP/FF6RXVMG8AH4GwtXYYD2b3WgjbF7I4p6HYOaz3kAEnlJNo55qqLT2tFogww==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0" }, @@ -6360,27 +6366,28 @@ } }, "node_modules/@wordpress/block-directory": { - "version": "5.8.17", - "resolved": "https://registry.npmjs.org/@wordpress/block-directory/-/block-directory-5.8.17.tgz", - "integrity": "sha512-J1gJ8JF0Hn5l4Y4rceP3ubRmrDU61xXvfd7E56PSHPw0lALSLFCGv1h6IDPtMP9YWIOIOTXmzxc4Bn1kUjFLjA==", + "version": "5.8.18", + "resolved": "https://registry.npmjs.org/@wordpress/block-directory/-/block-directory-5.8.18.tgz", + "integrity": "sha512-lYZDKI/IFMymfi3MxFfvpBMx6nhqAOEX+IXZvpKPiHR62LL+MXBoeOdiSZYKysfztFyPH7Ism43c1TeY+fQnIg==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/a11y": "^4.8.2", "@wordpress/api-fetch": "^7.8.2", - "@wordpress/block-editor": "^14.3.14", + "@wordpress/block-editor": "^14.3.15", "@wordpress/blocks": "^13.8.5", - "@wordpress/components": "^28.8.10", + "@wordpress/components": "^28.8.11", "@wordpress/compose": "^7.8.3", - "@wordpress/core-data": "^7.8.14", + "@wordpress/core-data": "^7.8.15", "@wordpress/data": "^10.8.3", - "@wordpress/editor": "^14.8.17", + "@wordpress/editor": "^14.8.18", "@wordpress/element": "^6.8.1", "@wordpress/hooks": "^4.8.2", "@wordpress/html-entities": "^4.8.1", "@wordpress/i18n": "^5.8.2", "@wordpress/icons": "^10.8.2", "@wordpress/notices": "^5.8.3", - "@wordpress/plugins": "^7.8.10", + "@wordpress/plugins": "^7.8.11", "@wordpress/private-apis": "^1.8.1", "@wordpress/url": "^4.8.1", "change-case": "^4.1.2", @@ -6396,9 +6403,10 @@ } }, "node_modules/@wordpress/block-editor": { - "version": "14.3.14", - "resolved": "https://registry.npmjs.org/@wordpress/block-editor/-/block-editor-14.3.14.tgz", - "integrity": "sha512-R4cu/f4wZZbgP+4HZu5zhCNwFPckd1Jn91277BSZft7G/SLlDXCOWK5bZlPsSGpoPm7gSMs276Q3RDJKmfReCw==", + "version": "14.3.15", + "resolved": "https://registry.npmjs.org/@wordpress/block-editor/-/block-editor-14.3.15.tgz", + "integrity": "sha512-5cFdYZMXsOlzWzbzLSB34wT3aQfl2WEKw83NA9/A4IAvZ7rJXdVJx0H2ZP7itmU/Rcj2cxPC152rfit9y4/+ww==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@emotion/react": "^11.7.1", @@ -6409,8 +6417,8 @@ "@wordpress/blob": "^4.8.1", "@wordpress/block-serialization-default-parser": "^5.8.1", "@wordpress/blocks": "^13.8.5", - "@wordpress/commands": "^1.8.10", - "@wordpress/components": "^28.8.10", + "@wordpress/commands": "^1.8.11", + "@wordpress/components": "^28.8.11", "@wordpress/compose": "^7.8.3", "@wordpress/data": "^10.8.3", "@wordpress/date": "^5.8.2", @@ -6426,7 +6434,7 @@ "@wordpress/keyboard-shortcuts": "^5.8.3", "@wordpress/keycodes": "^4.8.2", "@wordpress/notices": "^5.8.3", - "@wordpress/preferences": "^4.8.10", + "@wordpress/preferences": "^4.8.11", "@wordpress/private-apis": "^1.8.1", "@wordpress/rich-text": "^7.8.3", "@wordpress/style-engine": "^2.8.1", @@ -6459,20 +6467,21 @@ } }, "node_modules/@wordpress/block-library": { - "version": "9.8.15", - "resolved": "https://registry.npmjs.org/@wordpress/block-library/-/block-library-9.8.15.tgz", - "integrity": "sha512-YsEjYEcSzo1b19p/o1YuhhRjsBtmHNEmuc37zWM5U2IOb3YU57EZSoG4lFSSytQcpzvsv0KFCv1Y9MTOAkWnkQ==", + "version": "9.8.16", + "resolved": "https://registry.npmjs.org/@wordpress/block-library/-/block-library-9.8.16.tgz", + "integrity": "sha512-1Vo36U439E856KR22n71oHhXTJ7e7iRS/4HDWEem1NY1iSFiBK3RBoIDLv7emVExSXhdRill7RjPGmRMeiEvJg==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/a11y": "^4.8.2", "@wordpress/api-fetch": "^7.8.2", "@wordpress/autop": "^4.8.1", "@wordpress/blob": "^4.8.1", - "@wordpress/block-editor": "^14.3.14", + "@wordpress/block-editor": "^14.3.15", "@wordpress/blocks": "^13.8.5", - "@wordpress/components": "^28.8.10", + "@wordpress/components": "^28.8.11", "@wordpress/compose": "^7.8.3", - "@wordpress/core-data": "^7.8.14", + "@wordpress/core-data": "^7.8.15", "@wordpress/data": "^10.8.3", "@wordpress/date": "^5.8.2", "@wordpress/deprecated": "^4.8.2", @@ -6488,12 +6497,12 @@ "@wordpress/keyboard-shortcuts": "^5.8.3", "@wordpress/keycodes": "^4.8.2", "@wordpress/notices": "^5.8.3", - "@wordpress/patterns": "^2.8.14", + "@wordpress/patterns": "^2.8.15", "@wordpress/primitives": "^4.8.1", "@wordpress/private-apis": "^1.8.1", - "@wordpress/reusable-blocks": "^5.8.14", + "@wordpress/reusable-blocks": "^5.8.15", "@wordpress/rich-text": "^7.8.3", - "@wordpress/server-side-render": "^5.8.10", + "@wordpress/server-side-render": "^5.8.11", "@wordpress/url": "^4.8.1", "@wordpress/viewport": "^6.8.3", "@wordpress/wordcount": "^4.8.1", @@ -6520,6 +6529,7 @@ "version": "5.8.1", "resolved": "https://registry.npmjs.org/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-5.8.1.tgz", "integrity": "sha512-SmbMiM/KTh9veMcujL+t375yMR1JZlIzbVEIk6NdiGV+7pvtenUe4Av0tr+0QaINmgo3MJmc4Y3csZrKFlRr+w==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0" }, @@ -6532,6 +6542,7 @@ "version": "13.8.5", "resolved": "https://registry.npmjs.org/@wordpress/blocks/-/blocks-13.8.5.tgz", "integrity": "sha512-KE0bbN370G3tA/7Oaugk0IRLaG3p06sEnfbbDvoRSyiPyxQsyYb53i921vuteHtzQ+3DEjtDzrku/bsKOn81Tg==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/autop": "^4.8.1", @@ -6580,12 +6591,13 @@ } }, "node_modules/@wordpress/commands": { - "version": "1.8.10", - "resolved": "https://registry.npmjs.org/@wordpress/commands/-/commands-1.8.10.tgz", - "integrity": "sha512-Bw6xNGcMEvo78+RLudhWj+8L5PUWHCuV4bn/WNP/mbXycipdQB0lmYHxpyIGKwbuk740vT5KJeCKde7vecxlTQ==", + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/@wordpress/commands/-/commands-1.8.11.tgz", + "integrity": "sha512-CKnzWwSKO3kckqV58JXA0taU2JgIpEkVxX8xUOe3aI1isaOFjF+iwshuhNgWcs3sAiuUK0s4aQWi3ZqGhmirzA==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/components": "^28.8.10", + "@wordpress/components": "^28.8.11", "@wordpress/data": "^10.8.3", "@wordpress/element": "^6.8.1", "@wordpress/i18n": "^5.8.2", @@ -6605,9 +6617,10 @@ } }, "node_modules/@wordpress/components": { - "version": "28.8.10", - "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-28.8.10.tgz", - "integrity": "sha512-DBls/rm7uee9DOs0Vcbd5dByN9WonboeusA136qwQI5eXqpouOwv9BX7v3or87C9tvDPdb2bsAwtttUa2NsIvg==", + "version": "28.8.11", + "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-28.8.11.tgz", + "integrity": "sha512-IfSSeFUcbBS1eS5fq1ShPIW2JEU9OJiKrkZ8Ae3FpqTfYbJppVP4+cpK+kvBWj5PLyg+EBHv4W5dx9tMUKsKRg==", + "license": "GPL-2.0-or-later", "dependencies": { "@ariakit/react": "^0.4.10", "@babel/runtime": "^7.16.0", @@ -6668,6 +6681,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-7.8.3.tgz", "integrity": "sha512-knHfFz1/rzFr69d2lDIFspXYTn56Fdd6+4Enc9QhHfkICpwi59jQCXqtNguCB2O8FdL2FNpK1YSgx1FrTo37dA==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@types/mousetrap": "^1.6.8", @@ -6692,15 +6706,16 @@ } }, "node_modules/@wordpress/core-commands": { - "version": "1.8.14", - "resolved": "https://registry.npmjs.org/@wordpress/core-commands/-/core-commands-1.8.14.tgz", - "integrity": "sha512-GOXJfizE7g3fG938Tyu0XahEZIhf4LeYmXSQz6ZCtN+b1gXLcHCrrGVxvyVeasOX7iDu+Cw7nO0NRPxd1ipH/g==", + "version": "1.8.15", + "resolved": "https://registry.npmjs.org/@wordpress/core-commands/-/core-commands-1.8.15.tgz", + "integrity": "sha512-1+Pa1V6Tsc1bFFHzbAfaqSv+w58jKQ+3qqdlcmGWdkYJz8VLE6kaKG9IrgT+xm0ricGpQ6dy6T2h6BXRWT5LgQ==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/block-editor": "^14.3.14", - "@wordpress/commands": "^1.8.10", + "@wordpress/block-editor": "^14.3.15", + "@wordpress/commands": "^1.8.11", "@wordpress/compose": "^7.8.3", - "@wordpress/core-data": "^7.8.14", + "@wordpress/core-data": "^7.8.15", "@wordpress/data": "^10.8.3", "@wordpress/element": "^6.8.1", "@wordpress/html-entities": "^4.8.1", @@ -6721,13 +6736,14 @@ } }, "node_modules/@wordpress/core-data": { - "version": "7.8.14", - "resolved": "https://registry.npmjs.org/@wordpress/core-data/-/core-data-7.8.14.tgz", - "integrity": "sha512-22+DamX2SZxpJOl9qOWDRt/XoX0xBXXnQJiqOx7YqJ8/hvEeasyHjBuFqkiFtLMx2X2PbGLj/vaHyBBc1VBGuA==", + "version": "7.8.15", + "resolved": "https://registry.npmjs.org/@wordpress/core-data/-/core-data-7.8.15.tgz", + "integrity": "sha512-fh3/Q8UF2skuSAgERXDhQdc59yA+WxE1YweIFbW1Gh2V80T9XrkX7GHQBuAXcEScdcIsE64fZLYJkVhrrWl0jA==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/api-fetch": "^7.8.2", - "@wordpress/block-editor": "^14.3.14", + "@wordpress/block-editor": "^14.3.15", "@wordpress/blocks": "^13.8.5", "@wordpress/compose": "^7.8.3", "@wordpress/data": "^10.8.3", @@ -6758,31 +6774,32 @@ } }, "node_modules/@wordpress/customize-widgets": { - "version": "5.8.15", - "resolved": "https://registry.npmjs.org/@wordpress/customize-widgets/-/customize-widgets-5.8.15.tgz", - "integrity": "sha512-45KPAa5oHIU07mR958J1KnJX3TMm8dWJ1WBAsM5k9ynH6ZC25zQDSUt0YZSKBrsQlvS1/Uwb09frNfgJLrMKtw==", + "version": "5.8.16", + "resolved": "https://registry.npmjs.org/@wordpress/customize-widgets/-/customize-widgets-5.8.16.tgz", + "integrity": "sha512-Rl3n+55RTwHfTb8MyjAJc7/y61w+rOXMubst+gpOa6Uw5EN/rq61evCopLD86tVHMesWflQvC7jDDr6MwTcmeA==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/block-editor": "^14.3.14", - "@wordpress/block-library": "^9.8.15", + "@wordpress/block-editor": "^14.3.15", + "@wordpress/block-library": "^9.8.16", "@wordpress/blocks": "^13.8.5", - "@wordpress/components": "^28.8.10", + "@wordpress/components": "^28.8.11", "@wordpress/compose": "^7.8.3", - "@wordpress/core-data": "^7.8.14", + "@wordpress/core-data": "^7.8.15", "@wordpress/data": "^10.8.3", "@wordpress/dom": "^4.8.2", "@wordpress/element": "^6.8.1", "@wordpress/hooks": "^4.8.2", "@wordpress/i18n": "^5.8.2", "@wordpress/icons": "^10.8.2", - "@wordpress/interface": "^6.8.10", + "@wordpress/interface": "^6.8.11", "@wordpress/is-shallow-equal": "^5.8.1", "@wordpress/keyboard-shortcuts": "^5.8.3", "@wordpress/keycodes": "^4.8.2", "@wordpress/media-utils": "^5.8.2", - "@wordpress/preferences": "^4.8.10", + "@wordpress/preferences": "^4.8.11", "@wordpress/private-apis": "^1.8.1", - "@wordpress/widgets": "^4.8.14", + "@wordpress/widgets": "^4.8.15", "clsx": "^2.1.1", "fast-deep-equal": "^3.1.3" }, @@ -6799,6 +6816,7 @@ "version": "10.8.3", "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-10.8.3.tgz", "integrity": "sha512-JunqBEVVwJJz45N8JTZNh9WHFn857SUtbp7Efp55oesH/g3ejLMuNu6Ewf9/qEEGQut8VeVQ7yGhl+GQDu9u+w==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/compose": "^7.8.3", @@ -6828,6 +6846,7 @@ "version": "4.8.3", "resolved": "https://registry.npmjs.org/@wordpress/data-controls/-/data-controls-4.8.3.tgz", "integrity": "sha512-uh7ECbGDU3lFIUK+LiN0GHFRlWzgvsT+RXZeEDWE22gtbrksdGOQV8Ufz+/iSUnMaOA41r0Yz90lROfUL4mdFQ==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/api-fetch": "^7.8.2", @@ -6843,13 +6862,14 @@ } }, "node_modules/@wordpress/dataviews": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/@wordpress/dataviews/-/dataviews-4.4.10.tgz", - "integrity": "sha512-4s0pzJ40P/0OEQSI7ZkUkD/cSW7QlT+uY2IlNSc6i6Kn44ufeKcgvkSxNsqwS1iE5Yh7AHterV9nlinem9zTuA==", + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@wordpress/dataviews/-/dataviews-4.4.11.tgz", + "integrity": "sha512-P9E79dWb4y27eAo/H1M9lQ3l5tKi/SMm4hmoZsEBMd5Z8tYzGeFSOJlzzU6gJf0Ue1OIjg0/RO/f3mcZQe6k2A==", + "license": "GPL-2.0-or-later", "dependencies": { "@ariakit/react": "^0.4.10", "@babel/runtime": "^7.16.0", - "@wordpress/components": "^28.8.10", + "@wordpress/components": "^28.8.11", "@wordpress/compose": "^7.8.3", "@wordpress/data": "^10.8.3", "@wordpress/element": "^6.8.1", @@ -6873,6 +6893,7 @@ "version": "5.8.2", "resolved": "https://registry.npmjs.org/@wordpress/date/-/date-5.8.2.tgz", "integrity": "sha512-ECPE9JXQ0GN+A3ssP+bmEtt122JQnkuXzGOUXfED+kjdmFZ1MgPtyKfXBFDzyW6fPHAwzpSbyFSBXfwxevxWAQ==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/deprecated": "^4.8.2", @@ -6889,6 +6910,7 @@ "resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-6.8.3.tgz", "integrity": "sha512-2XtMyfX8wacCBK9S808o3NkDdo+qeJgtz6DQhi1nOK6XhIsw/IeSwbZgrTlIzhUk2mQ1N0Y+e3588/dxiS4kBQ==", "dev": true, + "license": "GPL-2.0-or-later", "dependencies": { "json2php": "^0.0.7" }, @@ -6911,6 +6933,7 @@ "version": "4.8.2", "resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-4.8.2.tgz", "integrity": "sha512-AMO0FeqYfIcQRNzAVYDYHZ6ISdfkPHm8Rt8HQOl0Bg7tWX3ocVYnMULUGg/VzgM8AJzAUrfBpwcXZBMF1g4Xpw==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/hooks": "^4.8.2" @@ -6924,6 +6947,7 @@ "version": "4.8.2", "resolved": "https://registry.npmjs.org/@wordpress/dom/-/dom-4.8.2.tgz", "integrity": "sha512-5VZooybouKVkQ6W2+ef7AnAYQG54lkUN8+Kzc7ly84+WL13RbrwfE4Bj9/RFE5Ew59XTfHME0+GzE3fpLNiTYA==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/deprecated": "^4.8.2" @@ -6937,6 +6961,7 @@ "version": "4.8.1", "resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-4.8.1.tgz", "integrity": "sha512-xVMNpOaLzpZS4HFH5yYE3ToOhpsDpV29PoeDzuki18XA+ZPg6SvQ/TmwggMasnI1PoyAcQWxugXMV+YUFGM8Mg==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0" }, @@ -6950,6 +6975,7 @@ "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils/-/e2e-test-utils-11.8.2.tgz", "integrity": "sha512-ddpxERmKzUwBejem0tQweNUlyCXLab0qPwHs+bJwGDzrp75WHW29rb9pQvvem2uLvso7Sw0IfVZaO2+hVXPM+g==", "dev": true, + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/api-fetch": "^7.8.2", @@ -6973,6 +6999,7 @@ "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.8.1.tgz", "integrity": "sha512-BKp2EpC35/SWJg1h69Q0RP7hlcNoqyuq1UA5CJycph2yuzrfl8+tfKqkrdCYhyLU/MuW6GFh9d92vb2cTYnSOQ==", "dev": true, + "license": "GPL-2.0-or-later", "dependencies": { "change-case": "^4.1.2", "form-data": "^4.0.0", @@ -7032,25 +7059,26 @@ } }, "node_modules/@wordpress/edit-post": { - "version": "8.8.17", - "resolved": "https://registry.npmjs.org/@wordpress/edit-post/-/edit-post-8.8.17.tgz", - "integrity": "sha512-QcdwvVeb6flXmzC1H17R0toYI8rdaFhEXNy16aYi2YNP9vQxiW89qAbRM5AC59QVJaZXr0kSzhn9vOc+JPtF+w==", + "version": "8.8.18", + "resolved": "https://registry.npmjs.org/@wordpress/edit-post/-/edit-post-8.8.18.tgz", + "integrity": "sha512-1woHpjt0RM4gKrpevaG1Zh6b2Al0biNrGFrIuAK2S71SasLrQuYzx9z3bAs5acCjXhV7VkLkLpK+ERm59256vQ==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/a11y": "^4.8.2", "@wordpress/api-fetch": "^7.8.2", - "@wordpress/block-editor": "^14.3.14", - "@wordpress/block-library": "^9.8.15", + "@wordpress/block-editor": "^14.3.15", + "@wordpress/block-library": "^9.8.16", "@wordpress/blocks": "^13.8.5", - "@wordpress/commands": "^1.8.10", - "@wordpress/components": "^28.8.10", + "@wordpress/commands": "^1.8.11", + "@wordpress/components": "^28.8.11", "@wordpress/compose": "^7.8.3", - "@wordpress/core-commands": "^1.8.14", - "@wordpress/core-data": "^7.8.14", + "@wordpress/core-commands": "^1.8.15", + "@wordpress/core-data": "^7.8.15", "@wordpress/data": "^10.8.3", "@wordpress/deprecated": "^4.8.2", "@wordpress/dom": "^4.8.2", - "@wordpress/editor": "^14.8.17", + "@wordpress/editor": "^14.8.18", "@wordpress/element": "^6.8.1", "@wordpress/hooks": "^4.8.2", "@wordpress/html-entities": "^4.8.1", @@ -7059,13 +7087,13 @@ "@wordpress/keyboard-shortcuts": "^5.8.3", "@wordpress/keycodes": "^4.8.2", "@wordpress/notices": "^5.8.3", - "@wordpress/plugins": "^7.8.10", - "@wordpress/preferences": "^4.8.10", + "@wordpress/plugins": "^7.8.11", + "@wordpress/preferences": "^4.8.11", "@wordpress/private-apis": "^1.8.1", "@wordpress/url": "^4.8.1", "@wordpress/viewport": "^6.8.3", "@wordpress/warning": "^3.8.1", - "@wordpress/widgets": "^4.8.14", + "@wordpress/widgets": "^4.8.15", "clsx": "^2.1.1", "memize": "^2.1.0" }, @@ -7079,29 +7107,30 @@ } }, "node_modules/@wordpress/edit-site": { - "version": "6.8.17", - "resolved": "https://registry.npmjs.org/@wordpress/edit-site/-/edit-site-6.8.17.tgz", - "integrity": "sha512-1Exa8QVFBrz6M4hgQwlNV+pecuWvx11oRL2m3k16g8Q89uzaoNW+KcBj40JfbMcs+6Vu5YjcnWl7420IUFRwhQ==", + "version": "6.8.18", + "resolved": "https://registry.npmjs.org/@wordpress/edit-site/-/edit-site-6.8.18.tgz", + "integrity": "sha512-sts/9mPt8u7MJw0+qjbWH1kh39GAT94goVw45FDMQtNB6uNe8HEDe2qoc/ObXATiRtmndEQnteNe+y1Tbbi8Dw==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@react-spring/web": "^9.4.5", "@wordpress/a11y": "^4.8.2", "@wordpress/api-fetch": "^7.8.2", "@wordpress/blob": "^4.8.1", - "@wordpress/block-editor": "^14.3.14", - "@wordpress/block-library": "^9.8.15", + "@wordpress/block-editor": "^14.3.15", + "@wordpress/block-library": "^9.8.16", "@wordpress/blocks": "^13.8.5", - "@wordpress/commands": "^1.8.10", - "@wordpress/components": "^28.8.10", + "@wordpress/commands": "^1.8.11", + "@wordpress/components": "^28.8.11", "@wordpress/compose": "^7.8.3", - "@wordpress/core-commands": "^1.8.14", - "@wordpress/core-data": "^7.8.14", + "@wordpress/core-commands": "^1.8.15", + "@wordpress/core-data": "^7.8.15", "@wordpress/data": "^10.8.3", - "@wordpress/dataviews": "^4.4.10", + "@wordpress/dataviews": "^4.4.11", "@wordpress/date": "^5.8.2", "@wordpress/deprecated": "^4.8.2", "@wordpress/dom": "^4.8.2", - "@wordpress/editor": "^14.8.17", + "@wordpress/editor": "^14.8.18", "@wordpress/element": "^6.8.1", "@wordpress/escape-html": "^3.8.1", "@wordpress/hooks": "^4.8.2", @@ -7111,18 +7140,18 @@ "@wordpress/keyboard-shortcuts": "^5.8.3", "@wordpress/keycodes": "^4.8.2", "@wordpress/notices": "^5.8.3", - "@wordpress/patterns": "^2.8.14", - "@wordpress/plugins": "^7.8.10", - "@wordpress/preferences": "^4.8.10", + "@wordpress/patterns": "^2.8.15", + "@wordpress/plugins": "^7.8.11", + "@wordpress/preferences": "^4.8.11", "@wordpress/primitives": "^4.8.1", "@wordpress/priority-queue": "^3.8.1", "@wordpress/private-apis": "^1.8.1", - "@wordpress/reusable-blocks": "^5.8.14", + "@wordpress/reusable-blocks": "^5.8.15", "@wordpress/router": "^1.8.1", "@wordpress/style-engine": "^2.8.1", "@wordpress/url": "^4.8.1", "@wordpress/viewport": "^6.8.3", - "@wordpress/widgets": "^4.8.14", + "@wordpress/widgets": "^4.8.15", "@wordpress/wordcount": "^4.8.1", "change-case": "^4.1.2", "clsx": "^2.1.1", @@ -7141,18 +7170,19 @@ } }, "node_modules/@wordpress/edit-widgets": { - "version": "6.8.15", - "resolved": "https://registry.npmjs.org/@wordpress/edit-widgets/-/edit-widgets-6.8.15.tgz", - "integrity": "sha512-3Xdbffx0Pqo78Ia2ocECV9ieVPk8xxokNa2yNDP7R+djQ9fI1CV/U2TtAfnHy4r9Lq4efl32PuIgh1YYq7OupA==", + "version": "6.8.16", + "resolved": "https://registry.npmjs.org/@wordpress/edit-widgets/-/edit-widgets-6.8.16.tgz", + "integrity": "sha512-uMLnmoi2anx3n/EKPHUKvuxYlOzhRIm3j2+BicI8nthR9cxAvXkmC9Z7QdaCgleGaxDQPD61Q0KsuFFHJtQWWQ==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/api-fetch": "^7.8.2", - "@wordpress/block-editor": "^14.3.14", - "@wordpress/block-library": "^9.8.15", + "@wordpress/block-editor": "^14.3.15", + "@wordpress/block-library": "^9.8.16", "@wordpress/blocks": "^13.8.5", - "@wordpress/components": "^28.8.10", + "@wordpress/components": "^28.8.11", "@wordpress/compose": "^7.8.3", - "@wordpress/core-data": "^7.8.14", + "@wordpress/core-data": "^7.8.15", "@wordpress/data": "^10.8.3", "@wordpress/deprecated": "^4.8.2", "@wordpress/dom": "^4.8.2", @@ -7160,18 +7190,18 @@ "@wordpress/hooks": "^4.8.2", "@wordpress/i18n": "^5.8.2", "@wordpress/icons": "^10.8.2", - "@wordpress/interface": "^6.8.10", + "@wordpress/interface": "^6.8.11", "@wordpress/keyboard-shortcuts": "^5.8.3", "@wordpress/keycodes": "^4.8.2", "@wordpress/media-utils": "^5.8.2", "@wordpress/notices": "^5.8.3", - "@wordpress/patterns": "^2.8.14", - "@wordpress/plugins": "^7.8.10", - "@wordpress/preferences": "^4.8.10", + "@wordpress/patterns": "^2.8.15", + "@wordpress/plugins": "^7.8.11", + "@wordpress/preferences": "^4.8.11", "@wordpress/private-apis": "^1.8.1", - "@wordpress/reusable-blocks": "^5.8.14", + "@wordpress/reusable-blocks": "^5.8.15", "@wordpress/url": "^4.8.1", - "@wordpress/widgets": "^4.8.14", + "@wordpress/widgets": "^4.8.15", "clsx": "^2.1.1" }, "engines": { @@ -7184,43 +7214,44 @@ } }, "node_modules/@wordpress/editor": { - "version": "14.8.17", - "resolved": "https://registry.npmjs.org/@wordpress/editor/-/editor-14.8.17.tgz", - "integrity": "sha512-j+6WTkkhLVWj0A+5WpVXCTsVYb7bNM+0r1LdBWr3pIwoNDk/NvmwiG7aeTx0GwGmSublVNKkFgscRXf12xFfWQ==", + "version": "14.8.18", + "resolved": "https://registry.npmjs.org/@wordpress/editor/-/editor-14.8.18.tgz", + "integrity": "sha512-haVx9RynZ+b4pvoVGkCoAJ1IT1drBVX/4cOZmlgRZyGLRi083HjricxKXsNlczTGbWHfXcUiJsTTZ1BMNUCWYg==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/a11y": "^4.8.2", "@wordpress/api-fetch": "^7.8.2", "@wordpress/blob": "^4.8.1", - "@wordpress/block-editor": "^14.3.14", + "@wordpress/block-editor": "^14.3.15", "@wordpress/blocks": "^13.8.5", - "@wordpress/commands": "^1.8.10", - "@wordpress/components": "^28.8.10", + "@wordpress/commands": "^1.8.11", + "@wordpress/components": "^28.8.11", "@wordpress/compose": "^7.8.3", - "@wordpress/core-data": "^7.8.14", + "@wordpress/core-data": "^7.8.15", "@wordpress/data": "^10.8.3", - "@wordpress/dataviews": "^4.4.10", + "@wordpress/dataviews": "^4.4.11", "@wordpress/date": "^5.8.2", "@wordpress/deprecated": "^4.8.2", "@wordpress/dom": "^4.8.2", "@wordpress/element": "^6.8.1", - "@wordpress/fields": "^0.0.15", + "@wordpress/fields": "^0.0.16", "@wordpress/hooks": "^4.8.2", "@wordpress/html-entities": "^4.8.1", "@wordpress/i18n": "^5.8.2", "@wordpress/icons": "^10.8.2", - "@wordpress/interface": "^6.8.10", + "@wordpress/interface": "^6.8.11", "@wordpress/keyboard-shortcuts": "^5.8.3", "@wordpress/keycodes": "^4.8.2", "@wordpress/media-utils": "^5.8.2", "@wordpress/notices": "^5.8.3", - "@wordpress/patterns": "^2.8.14", - "@wordpress/plugins": "^7.8.10", - "@wordpress/preferences": "^4.8.10", + "@wordpress/patterns": "^2.8.15", + "@wordpress/plugins": "^7.8.11", + "@wordpress/preferences": "^4.8.11", "@wordpress/private-apis": "^1.8.1", - "@wordpress/reusable-blocks": "^5.8.14", + "@wordpress/reusable-blocks": "^5.8.15", "@wordpress/rich-text": "^7.8.3", - "@wordpress/server-side-render": "^5.8.10", + "@wordpress/server-side-render": "^5.8.11", "@wordpress/url": "^4.8.1", "@wordpress/warning": "^3.8.1", "@wordpress/wordcount": "^4.8.1", @@ -7249,6 +7280,7 @@ "version": "6.8.1", "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-6.8.1.tgz", "integrity": "sha512-JUd0XUHjNtQexAUJq5TodweU9kooCdrh/3NlKj8jEMKgveDx+ipXN2zVsaJWzAcu50FBhegaL+hFH6XRtqEDdQ==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@types/react": "^18.2.79", @@ -7268,6 +7300,7 @@ "version": "3.8.1", "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-3.8.1.tgz", "integrity": "sha512-JFOjsD6rSFVoFqK+f5YCeYmRycn7Hj29cX3+sBXL0p5Uox7SQLhY/rmATm6o/PiGCVtDeQlZ9I8dBeQSZBoXqQ==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0" }, @@ -7335,25 +7368,26 @@ } }, "node_modules/@wordpress/fields": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/@wordpress/fields/-/fields-0.0.15.tgz", - "integrity": "sha512-3RHHiJ6LNfSH11JUZy2Vy7cXJDpNvxr01gvQrggIJtESUfcIRAqR7swL18J/La6BDJecADS5cGKXuk9jYhRMlg==", + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@wordpress/fields/-/fields-0.0.16.tgz", + "integrity": "sha512-FeziO0mS67FCiZ/uNGwRHSbcOSHVVtE7PbO6ZfKStO6APxJSisF+eubimj4l6O8wHgDmaevPPfFBzghn6m39Tw==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/blob": "^4.8.1", "@wordpress/blocks": "^13.8.5", - "@wordpress/components": "^28.8.10", + "@wordpress/components": "^28.8.11", "@wordpress/compose": "^7.8.3", - "@wordpress/core-data": "^7.8.14", + "@wordpress/core-data": "^7.8.15", "@wordpress/data": "^10.8.3", - "@wordpress/dataviews": "^4.4.10", + "@wordpress/dataviews": "^4.4.11", "@wordpress/element": "^6.8.1", "@wordpress/hooks": "^4.8.2", "@wordpress/html-entities": "^4.8.1", "@wordpress/i18n": "^5.8.2", "@wordpress/icons": "^10.8.2", "@wordpress/notices": "^5.8.3", - "@wordpress/patterns": "^2.8.14", + "@wordpress/patterns": "^2.8.15", "@wordpress/primitives": "^4.8.1", "@wordpress/private-apis": "^1.8.1", "@wordpress/url": "^4.8.1", @@ -7370,14 +7404,15 @@ } }, "node_modules/@wordpress/format-library": { - "version": "5.8.14", - "resolved": "https://registry.npmjs.org/@wordpress/format-library/-/format-library-5.8.14.tgz", - "integrity": "sha512-cMox5+cDJgXv7R5ErFliCICQ+IOWkNQB7iWzmr/QLNtPB6wxPid23P7irRczwyL3jfTizjRbFReea72s7U2wRA==", + "version": "5.8.15", + "resolved": "https://registry.npmjs.org/@wordpress/format-library/-/format-library-5.8.15.tgz", + "integrity": "sha512-Qp6OFwiHSb6qrluvFOaNlsoElUj1L6YMF6oAq/fBLq4UX2KANkV1UkTNN8Lo/iCe48Za+DxLle8nCa9Gt0XdDg==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/a11y": "^4.8.2", - "@wordpress/block-editor": "^14.3.14", - "@wordpress/components": "^28.8.10", + "@wordpress/block-editor": "^14.3.15", + "@wordpress/components": "^28.8.11", "@wordpress/compose": "^7.8.3", "@wordpress/data": "^10.8.3", "@wordpress/element": "^6.8.1", @@ -7401,6 +7436,7 @@ "version": "4.8.2", "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-4.8.2.tgz", "integrity": "sha512-BhhYJB/RFIng6Taydah6zCMd9iDYdSlISvByP9tBDsuHZL6iuVBmEGBXmm0Mt6ABCFHELuhFkxwdWPRjWTiqSw==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0" }, @@ -7413,6 +7449,7 @@ "version": "4.8.1", "resolved": "https://registry.npmjs.org/@wordpress/html-entities/-/html-entities-4.8.1.tgz", "integrity": "sha512-JOiXUdts9PvanVj3cuPlzJop6UBMDApzLRWRLeZNjZPq0IsTGcI7zPhBVT++aW1C8zTzngzpdFfFaWle3p5w7Q==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0" }, @@ -7425,6 +7462,7 @@ "version": "5.8.2", "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-5.8.2.tgz", "integrity": "sha512-evcwjw1cfGoyJoPMZlaYNwmYJAlIJh5pkgM1QWanpBPTMLsMOMcpZQGzOwvKf1uLozGOKkBAe106qQ7rgjZkoQ==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/hooks": "^4.8.2", @@ -7445,6 +7483,7 @@ "version": "10.8.2", "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-10.8.2.tgz", "integrity": "sha512-ebJ3mRJo3bMgPm9vSTxc7I98HT30mgU59WGUAQyx31cElKbzMhd3jM7bD2JhYXZ1OPnJGY3W4lHovMFfU7wsOQ==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/element": "^6.8.1", @@ -7459,6 +7498,7 @@ "version": "6.8.5", "resolved": "https://registry.npmjs.org/@wordpress/interactivity/-/interactivity-6.8.5.tgz", "integrity": "sha512-uCLcjYyNzn0KndbGr4ZtOOhogKieTMeH29/j3zK5Bu3pxsS5IxL6Ankanh+u7qkhXTND0AkZJmES7G+Z5DOIzg==", + "license": "GPL-2.0-or-later", "dependencies": { "@preact/signals": "^1.2.2", "preact": "^10.19.3" @@ -7472,6 +7512,7 @@ "version": "2.8.6", "resolved": "https://registry.npmjs.org/@wordpress/interactivity-router/-/interactivity-router-2.8.6.tgz", "integrity": "sha512-3GO9v9im1K7PNjCvr/0dOl3IQZ3RpMxUb3Y41M348Su3R8uNawA85c+9ZdyxYUG91/0atHdehErFiVt45IToYA==", + "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/a11y": "^4.8.2", "@wordpress/interactivity": "^6.8.5" @@ -7482,21 +7523,22 @@ } }, "node_modules/@wordpress/interface": { - "version": "6.8.10", - "resolved": "https://registry.npmjs.org/@wordpress/interface/-/interface-6.8.10.tgz", - "integrity": "sha512-h2nzYEu98+lASn83AkiJ1n/zVDZ8Vx2NcWFGDHpTYqpiIa7kOGjWXBBY0OLSHVxYcNvcYP+KghtcGNKEylvZlw==", + "version": "6.8.11", + "resolved": "https://registry.npmjs.org/@wordpress/interface/-/interface-6.8.11.tgz", + "integrity": "sha512-h10OXs44nkAduPa1ZGOfcdg2JRaTE62d5JwNDYeNwyjFBqLmQknGsSeDS677M/DYvX/AMcseaEObRZv7U8zjQQ==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/a11y": "^4.8.2", - "@wordpress/components": "^28.8.10", + "@wordpress/components": "^28.8.11", "@wordpress/compose": "^7.8.3", "@wordpress/data": "^10.8.3", "@wordpress/deprecated": "^4.8.2", "@wordpress/element": "^6.8.1", "@wordpress/i18n": "^5.8.2", "@wordpress/icons": "^10.8.2", - "@wordpress/plugins": "^7.8.10", - "@wordpress/preferences": "^4.8.10", + "@wordpress/plugins": "^7.8.11", + "@wordpress/preferences": "^4.8.11", "@wordpress/private-apis": "^1.8.1", "@wordpress/viewport": "^6.8.3", "clsx": "^2.1.1" @@ -7514,6 +7556,7 @@ "version": "5.8.1", "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-5.8.1.tgz", "integrity": "sha512-2UpGvp+y7pCxQQoNyb5PIYPptZZjfcR80evR/V/0Abyxde+N0dEJHroiOd+Nm1BJJijzhmMH1B7AlyGqnKaFXA==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0" }, @@ -7561,6 +7604,7 @@ "version": "5.8.3", "resolved": "https://registry.npmjs.org/@wordpress/keyboard-shortcuts/-/keyboard-shortcuts-5.8.3.tgz", "integrity": "sha512-V8HUZ63/6hronEBO0dQmYxlk7aSM7+fawTDLrqHfMhqi75GWrwhztWSb2Xju0J7rOvSVO7Oc5gk+JX+ZvniWqA==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/data": "^10.8.3", @@ -7579,6 +7623,7 @@ "version": "4.8.2", "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-4.8.2.tgz", "integrity": "sha512-BxZD5tk4sDHywV7HOF/hSY924ToW7YJe6hDh4yv+7vo5LpiYQq+/uW21hyXrWEjGXZtdmT1tx69wR16BG35bYw==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/i18n": "^5.8.2" @@ -7589,14 +7634,15 @@ } }, "node_modules/@wordpress/list-reusable-blocks": { - "version": "5.8.10", - "resolved": "https://registry.npmjs.org/@wordpress/list-reusable-blocks/-/list-reusable-blocks-5.8.10.tgz", - "integrity": "sha512-1O97qxVWVrGmWbd4ibl7/R7ot/ZhlplsA7TGx79RY6pRX4jKESiiEqZkdPs1nmjfqsXL2LRWCD/ksp3HfpXPYQ==", + "version": "5.8.11", + "resolved": "https://registry.npmjs.org/@wordpress/list-reusable-blocks/-/list-reusable-blocks-5.8.11.tgz", + "integrity": "sha512-VDWVVo2L+d0RP6kRz3qDNUHRWchQTPBfe9JXLlIfPfJYRfUyPKXc3wTOAGnfZD0qip8FzD/AIKsiLSht0NItfw==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/api-fetch": "^7.8.2", "@wordpress/blob": "^4.8.1", - "@wordpress/components": "^28.8.10", + "@wordpress/components": "^28.8.11", "@wordpress/compose": "^7.8.3", "@wordpress/element": "^6.8.1", "@wordpress/i18n": "^5.8.2", @@ -7615,6 +7661,7 @@ "version": "5.8.2", "resolved": "https://registry.npmjs.org/@wordpress/media-utils/-/media-utils-5.8.2.tgz", "integrity": "sha512-r8C9WapBHkoLPOU9so3Ocdo17xHwJ43EfXckc47c9Wvu9Gn3CulkZWSvnIMeQLcm1Ay/PBBRu2Vxim5PNCaTpg==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/api-fetch": "^7.8.2", @@ -7631,6 +7678,7 @@ "version": "5.8.3", "resolved": "https://registry.npmjs.org/@wordpress/notices/-/notices-5.8.3.tgz", "integrity": "sha512-k2I6vS4y3OvaDIGGO5B94up7uQqpO0Vtykz7rvez0+nXJazYylKNv88zsegyjf74bWhhJ3HpfiDl+JVehwHnxw==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/a11y": "^4.8.2", @@ -7658,12 +7706,13 @@ } }, "node_modules/@wordpress/nux": { - "version": "9.8.10", - "resolved": "https://registry.npmjs.org/@wordpress/nux/-/nux-9.8.10.tgz", - "integrity": "sha512-PH90KO1jNtwxifhAEvhv/7q4VPutFN2NKXvG0NQCXN9dEqrFAQ1ZdCCL7MrMWkt2djH6UOSO85mdH5qC/zZxAg==", + "version": "9.8.11", + "resolved": "https://registry.npmjs.org/@wordpress/nux/-/nux-9.8.11.tgz", + "integrity": "sha512-e2H4PU0tDha/Hm38cZi6nf3niaiV/yF0K20Qm5AA5wmLk3AtOd9lxxedsDPjwbAXMHWIUWvasG9Zwyn2mGCpdA==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/components": "^28.8.10", + "@wordpress/components": "^28.8.11", "@wordpress/compose": "^7.8.3", "@wordpress/data": "^10.8.3", "@wordpress/deprecated": "^4.8.2", @@ -7681,17 +7730,18 @@ } }, "node_modules/@wordpress/patterns": { - "version": "2.8.14", - "resolved": "https://registry.npmjs.org/@wordpress/patterns/-/patterns-2.8.14.tgz", - "integrity": "sha512-LZPKVrbk44jKk2lwNiqXUkL0ocSns7vTLtYNgn092hmiKE/jU18HjdXTdX0gQHTfmJ2/peY9lASfad+Z3eqKVg==", + "version": "2.8.15", + "resolved": "https://registry.npmjs.org/@wordpress/patterns/-/patterns-2.8.15.tgz", + "integrity": "sha512-BrZVtcbFYAVZKbRR3s55VwvOudwoTbjsQiex3JDkJSdb9fs6wP4OBQAxw+NHGEP+9Cvo65PqHWpCqWkFTl40/Q==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/a11y": "^4.8.2", - "@wordpress/block-editor": "^14.3.14", + "@wordpress/block-editor": "^14.3.15", "@wordpress/blocks": "^13.8.5", - "@wordpress/components": "^28.8.10", + "@wordpress/components": "^28.8.11", "@wordpress/compose": "^7.8.3", - "@wordpress/core-data": "^7.8.14", + "@wordpress/core-data": "^7.8.15", "@wordpress/data": "^10.8.3", "@wordpress/element": "^6.8.1", "@wordpress/html-entities": "^4.8.1", @@ -7711,12 +7761,13 @@ } }, "node_modules/@wordpress/plugins": { - "version": "7.8.10", - "resolved": "https://registry.npmjs.org/@wordpress/plugins/-/plugins-7.8.10.tgz", - "integrity": "sha512-cfJ0ZsENOzrwCJl9ZOGuuI/6F+t4ScUtzPIp5Dyy+YXkjqJVQIC7HcFgb4nkYMvHinkdYgBgcFUvOipnZuoxdw==", + "version": "7.8.11", + "resolved": "https://registry.npmjs.org/@wordpress/plugins/-/plugins-7.8.11.tgz", + "integrity": "sha512-iNzNZh1eqCn3NpZZ7/Oo/vaazaXFOSvUGPaOecGvQcMBxh22phnVgq1ZdEAU6QG73bYZAn3kPu7sfOtrpDkLQQ==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/components": "^28.8.10", + "@wordpress/components": "^28.8.11", "@wordpress/compose": "^7.8.3", "@wordpress/element": "^6.8.1", "@wordpress/hooks": "^4.8.2", @@ -7752,13 +7803,14 @@ } }, "node_modules/@wordpress/preferences": { - "version": "4.8.10", - "resolved": "https://registry.npmjs.org/@wordpress/preferences/-/preferences-4.8.10.tgz", - "integrity": "sha512-6GKfDSGw6HvSO7AnXefqlPiO/yysmDB1K140hxAvmxPg9x2Xrvk5JWxTsaGbPUAgaa73I9UI895WosJe3WCJFg==", + "version": "4.8.11", + "resolved": "https://registry.npmjs.org/@wordpress/preferences/-/preferences-4.8.11.tgz", + "integrity": "sha512-5P84OWcfTmEHCE8ocHqmU7wj/F8osQmprP3gtLRYSmffw9hw7kWlSlG8Z3kErmS1jVQWfDZPRs2CoEIRNE93LA==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/a11y": "^4.8.2", - "@wordpress/components": "^28.8.10", + "@wordpress/components": "^28.8.11", "@wordpress/compose": "^7.8.3", "@wordpress/data": "^10.8.3", "@wordpress/deprecated": "^4.8.2", @@ -7781,6 +7833,7 @@ "version": "2.8.2", "resolved": "https://registry.npmjs.org/@wordpress/preferences-persistence/-/preferences-persistence-2.8.2.tgz", "integrity": "sha512-vFFSVXtV7Z5JKW0Vv0T1HjtuMb3ufUy8tsQcPWB924Js7T5tRGZt5Bidn6RflXTDYudrwGMlDwBrKIBWXY9F0g==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/api-fetch": "^7.8.2" @@ -7795,6 +7848,7 @@ "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-4.8.1.tgz", "integrity": "sha512-JDiVChhgwv6ZGa4aVOXnDJnj/dUFkD/SSvRLFkLOdB+ZbWgddJQkVB3rpJOfREsPtEFWqgTxcJoZjnkqltNbww==", "dev": true, + "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", "npm": ">=8.19.2" @@ -7807,6 +7861,7 @@ "version": "4.8.1", "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-4.8.1.tgz", "integrity": "sha512-enfNxpEWycMNnvF7lpP8QYGKotu6B0UfUVcA89oDkam4OhP8tkpP1OVZyPHPgseRWweS/hL6aW/4bvwNSklf+g==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/element": "^6.8.1", @@ -7824,6 +7879,7 @@ "version": "3.8.1", "resolved": "https://registry.npmjs.org/@wordpress/priority-queue/-/priority-queue-3.8.1.tgz", "integrity": "sha512-USgFi75o7GlWiPu1hSGSWFXcj5nOjTVjrj0jM6sV+vqa39oRXxE4zpxGkvV4EINn8OrqvHBs/17uygAFXqppZQ==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "requestidlecallback": "^0.3.0" @@ -7837,6 +7893,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/@wordpress/private-apis/-/private-apis-1.8.1.tgz", "integrity": "sha512-/5PV8+QfkaLJs9TsFTIVMc3Ns+KdysFzS5ZGSmRGgsjzzgqHZb670mxf/6YaFldNjELbg5QsvcHNm3mkfkYiQg==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0" }, @@ -7849,6 +7906,7 @@ "version": "5.8.1", "resolved": "https://registry.npmjs.org/@wordpress/redux-routine/-/redux-routine-5.8.1.tgz", "integrity": "sha512-mScAi3R/o9dAeS5yQm7F/txNSHhXthYE/NbHtm808+iMgXvgTztAJSg4K29YpAhXgqPTFYMTX0cFiiQ1uNEGqw==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "is-plain-object": "^5.0.0", @@ -7864,15 +7922,16 @@ } }, "node_modules/@wordpress/reusable-blocks": { - "version": "5.8.14", - "resolved": "https://registry.npmjs.org/@wordpress/reusable-blocks/-/reusable-blocks-5.8.14.tgz", - "integrity": "sha512-a+BYGng0YM7epuD54/U3CQcnHFKzmw9RQ744nMbakAgQLxepmRY7/4GjgMTSzVMTakIGQEJmnUze0wI0EamXmw==", + "version": "5.8.15", + "resolved": "https://registry.npmjs.org/@wordpress/reusable-blocks/-/reusable-blocks-5.8.15.tgz", + "integrity": "sha512-qgZlUf21UzaoF9x7WMZ7g3savI2PG6EugA0QnDWSI0bk19JnXoJ23DwkY4mm0WglTVOnsDq/HQjQWFvMNji6KA==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/block-editor": "^14.3.14", + "@wordpress/block-editor": "^14.3.15", "@wordpress/blocks": "^13.8.5", - "@wordpress/components": "^28.8.10", - "@wordpress/core-data": "^7.8.14", + "@wordpress/components": "^28.8.11", + "@wordpress/core-data": "^7.8.15", "@wordpress/data": "^10.8.3", "@wordpress/element": "^6.8.1", "@wordpress/i18n": "^5.8.2", @@ -7894,6 +7953,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@wordpress/rich-text/-/rich-text-7.8.3.tgz", "integrity": "sha512-rB2hebZbTAI5LdLLtatwijpRKzYO+UdQes1Bni2WBAd59KH0YIj4kkVnj39lYYrV3OS+CqSqH2W4UJB7HPNRWQ==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/a11y": "^4.8.2", @@ -7918,6 +7978,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/@wordpress/router/-/router-1.8.1.tgz", "integrity": "sha512-ASF2uFwCh4bt7HZ/OVFQs18sBoXnDvcGjg9voyCGirX6keH4jutGon3OTUorQVVLlirOrWDeeAciRJPT7TGYZA==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/element": "^6.8.1", @@ -7938,6 +7999,7 @@ "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-30.0.6.tgz", "integrity": "sha512-vpl/qyGHEVUO3gxwQRDd5pfN3IEAGgKB6QWpyMKcaT8KTn1a6TpM8KP7w4oNkPLnUrMouqXFpLb4gUBD0BbHKQ==", "dev": true, + "license": "GPL-2.0-or-later", "dependencies": { "@babel/core": "^7.16.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", @@ -9021,14 +9083,15 @@ } }, "node_modules/@wordpress/server-side-render": { - "version": "5.8.10", - "resolved": "https://registry.npmjs.org/@wordpress/server-side-render/-/server-side-render-5.8.10.tgz", - "integrity": "sha512-FXm72/4XgO3ZQxjlsxwA3q/c6HRCmxJEo1kkSZbNkB2OD76tpuL1AW/vCFhqaF1LWvUX41yxoJTHoB6FGx9O/w==", + "version": "5.8.11", + "resolved": "https://registry.npmjs.org/@wordpress/server-side-render/-/server-side-render-5.8.11.tgz", + "integrity": "sha512-D7TM+Z6HETLVQ40qe/d7IgXQ+N8fwsuss5TtuaNgUyN0W1ZUFhk1ANd25Qmz7xGSWDMZOql75a08XCgi/7OgnQ==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/api-fetch": "^7.8.2", "@wordpress/blocks": "^13.8.5", - "@wordpress/components": "^28.8.10", + "@wordpress/components": "^28.8.11", "@wordpress/compose": "^7.8.3", "@wordpress/data": "^10.8.3", "@wordpress/deprecated": "^4.8.2", @@ -9050,6 +9113,7 @@ "version": "4.8.1", "resolved": "https://registry.npmjs.org/@wordpress/shortcode/-/shortcode-4.8.1.tgz", "integrity": "sha512-c8wYr2zmXOonAgABnFmuKRQ7wYyAIvshb3nCVrjFbpHnFmK+CHMg/y/KmcnfnPscdAO+uKDBKYNp0fnYfQBhiQ==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "memize": "^2.0.1" @@ -9063,6 +9127,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/@wordpress/style-engine/-/style-engine-2.8.1.tgz", "integrity": "sha512-wsYdvrc+CEqidp9TmpG+/9s6zm1GEUU2Qp5qIELcQWU6VNzuycc5nqzFnRiKv0Pz+6TRgksjLsb86IQrCcg2nA==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "change-case": "^4.1.2" @@ -9094,6 +9159,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/@wordpress/sync/-/sync-1.8.1.tgz", "integrity": "sha512-i2vYN15nh5Cf8EgryZIIKAvx0IZi34gBqXNwvSymhh1/eD4yzcFyaFfko7NS93fPeGuVy/Hxj+2M1CdZ7fd43w==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@types/simple-peer": "^9.11.5", @@ -9115,6 +9181,7 @@ "version": "3.8.1", "resolved": "https://registry.npmjs.org/@wordpress/token-list/-/token-list-3.8.1.tgz", "integrity": "sha512-uQEimvYlEsjQh5PHscYnctSnuK11ZOpUGLlYbJ10VtoisDJP2bqYwu36FBGrEuY5g0y6y/rP/Hw1BirZ+wrZyw==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0" }, @@ -9127,6 +9194,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/@wordpress/undo-manager/-/undo-manager-1.8.1.tgz", "integrity": "sha512-l5U3NswNDWHVQ3sAsiCvI65JDrAFlBnAIsoKsc38zg2OkNO1m8IIf/K+D3YAqBBM+zDahSGbNaLCEftBbZVSUg==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/is-shallow-equal": "^5.8.1" @@ -9140,6 +9208,7 @@ "version": "4.8.1", "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-4.8.1.tgz", "integrity": "sha512-YZcNOlJAUhkxMWlmkkc6mvSdXukkleq8j5Z8p8kBWQX9Wxng84ygyBSMiqFeFvAIs8nNDXBrqG9zGGRxMW6q/g==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "remove-accents": "^0.5.0" @@ -9153,6 +9222,7 @@ "version": "6.8.3", "resolved": "https://registry.npmjs.org/@wordpress/viewport/-/viewport-6.8.3.tgz", "integrity": "sha512-izS9YQmogTilQx0xrd9RspAeF/PT1V9N7S7QjNAH9UZ7E4k32m2Vg6ebcYQGShRgmjUReiunIDDr0VDSK5h3PQ==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/compose": "^7.8.3", @@ -9171,23 +9241,25 @@ "version": "3.8.1", "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.8.1.tgz", "integrity": "sha512-xlo0Xw1jiyiE6nh43NAtQMAL05VDk837kY2xfjsus6wD597TeWFpj6gmcRMH25FZULTUHDB2EPfLviWXqOgUfg==", + "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", "npm": ">=8.19.2" } }, "node_modules/@wordpress/widgets": { - "version": "4.8.14", - "resolved": "https://registry.npmjs.org/@wordpress/widgets/-/widgets-4.8.14.tgz", - "integrity": "sha512-ObGs6zCS70je/mcK+5nIJMR/DeYC4pkGvF6cDqGSUSTck3HSDscwcrNNEnVcVUifSj+d4GOq9DG6MBKOXm3ceA==", + "version": "4.8.15", + "resolved": "https://registry.npmjs.org/@wordpress/widgets/-/widgets-4.8.15.tgz", + "integrity": "sha512-nAlEzexJ4577KIetFUQhLFJeL4TnOhWV0MsH2Gq0bt6xaE2uCsao5mYwLm3efY64WqaOrKiLxrntHU3qvlOZCw==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/api-fetch": "^7.8.2", - "@wordpress/block-editor": "^14.3.14", + "@wordpress/block-editor": "^14.3.15", "@wordpress/blocks": "^13.8.5", - "@wordpress/components": "^28.8.10", + "@wordpress/components": "^28.8.11", "@wordpress/compose": "^7.8.3", - "@wordpress/core-data": "^7.8.14", + "@wordpress/core-data": "^7.8.15", "@wordpress/data": "^10.8.3", "@wordpress/element": "^6.8.1", "@wordpress/i18n": "^5.8.2", @@ -9208,6 +9280,7 @@ "version": "4.8.1", "resolved": "https://registry.npmjs.org/@wordpress/wordcount/-/wordcount-4.8.1.tgz", "integrity": "sha512-72e8N6I6he5pA9KDwqrq3mRMb+9WtzqR67C0uBmrlQg4FT23XptG8fDVacD2Das2nWSAgaLR/4GhKv34pPj1vg==", + "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0" }, @@ -11778,9 +11851,10 @@ "dev": true }, "node_modules/client-zip": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/client-zip/-/client-zip-2.4.5.tgz", - "integrity": "sha512-4y4d5ZeTH/szIAMQeC8ju67pxtvj+3u20wMGwOFrZk+pegy3aSEA2JkwgC8XVDTXP/Iqn1gyqNQXmkyBp4KLEQ==" + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/client-zip/-/client-zip-2.4.6.tgz", + "integrity": "sha512-e7t1u14h/yT0A12qBwFsaus8UZZ8+MCaNAEn/z53mrukLq/LFcKX7TkbntAppGu8he2p8pz9vc5NEGE/h4ohlw==", + "license": "MIT" }, "node_modules/clipboard": { "version": "2.0.11", diff --git a/package.json b/package.json index e5d1a3729ef36..9720bc105bceb 100644 --- a/package.json +++ b/package.json @@ -83,58 +83,58 @@ "@wordpress/api-fetch": "7.8.2", "@wordpress/autop": "4.8.1", "@wordpress/blob": "4.8.1", - "@wordpress/block-directory": "5.8.17", - "@wordpress/block-editor": "14.3.14", - "@wordpress/block-library": "9.8.15", + "@wordpress/block-directory": "5.8.18", + "@wordpress/block-editor": "14.3.15", + "@wordpress/block-library": "9.8.16", "@wordpress/block-serialization-default-parser": "5.8.1", "@wordpress/blocks": "13.8.5", - "@wordpress/commands": "1.8.10", - "@wordpress/components": "28.8.10", + "@wordpress/commands": "1.8.11", + "@wordpress/components": "28.8.11", "@wordpress/compose": "7.8.3", - "@wordpress/core-commands": "1.8.14", - "@wordpress/core-data": "7.8.14", - "@wordpress/customize-widgets": "5.8.15", + "@wordpress/core-commands": "1.8.15", + "@wordpress/core-data": "7.8.15", + "@wordpress/customize-widgets": "5.8.16", "@wordpress/data": "10.8.3", "@wordpress/data-controls": "4.8.3", - "@wordpress/dataviews": "4.4.10", + "@wordpress/dataviews": "4.4.11", "@wordpress/date": "5.8.2", "@wordpress/deprecated": "4.8.2", "@wordpress/dom": "4.8.2", "@wordpress/dom-ready": "4.8.1", - "@wordpress/edit-post": "8.8.17", - "@wordpress/edit-site": "6.8.17", - "@wordpress/edit-widgets": "6.8.15", - "@wordpress/editor": "14.8.17", + "@wordpress/edit-post": "8.8.18", + "@wordpress/edit-site": "6.8.18", + "@wordpress/edit-widgets": "6.8.16", + "@wordpress/editor": "14.8.18", "@wordpress/element": "6.8.1", "@wordpress/escape-html": "3.8.1", - "@wordpress/fields": "0.0.15", - "@wordpress/format-library": "5.8.14", + "@wordpress/fields": "0.0.16", + "@wordpress/format-library": "5.8.15", "@wordpress/hooks": "4.8.2", "@wordpress/html-entities": "4.8.1", "@wordpress/i18n": "5.8.2", "@wordpress/icons": "10.8.2", "@wordpress/interactivity": "6.8.5", "@wordpress/interactivity-router": "2.8.6", - "@wordpress/interface": "6.8.10", + "@wordpress/interface": "6.8.11", "@wordpress/is-shallow-equal": "5.8.1", "@wordpress/keyboard-shortcuts": "5.8.3", "@wordpress/keycodes": "4.8.2", - "@wordpress/list-reusable-blocks": "5.8.10", + "@wordpress/list-reusable-blocks": "5.8.11", "@wordpress/media-utils": "5.8.2", "@wordpress/notices": "5.8.3", - "@wordpress/nux": "9.8.10", - "@wordpress/patterns": "2.8.14", - "@wordpress/plugins": "7.8.10", - "@wordpress/preferences": "4.8.10", + "@wordpress/nux": "9.8.11", + "@wordpress/patterns": "2.8.15", + "@wordpress/plugins": "7.8.11", + "@wordpress/preferences": "4.8.11", "@wordpress/preferences-persistence": "2.8.2", "@wordpress/primitives": "4.8.1", "@wordpress/priority-queue": "3.8.1", "@wordpress/private-apis": "1.8.1", "@wordpress/redux-routine": "5.8.1", - "@wordpress/reusable-blocks": "5.8.14", + "@wordpress/reusable-blocks": "5.8.15", "@wordpress/rich-text": "7.8.3", "@wordpress/router": "1.8.1", - "@wordpress/server-side-render": "5.8.10", + "@wordpress/server-side-render": "5.8.11", "@wordpress/shortcode": "4.8.1", "@wordpress/style-engine": "2.8.1", "@wordpress/sync": "1.8.1", @@ -143,7 +143,7 @@ "@wordpress/url": "4.8.1", "@wordpress/viewport": "6.8.3", "@wordpress/warning": "3.8.1", - "@wordpress/widgets": "4.8.14", + "@wordpress/widgets": "4.8.15", "@wordpress/wordcount": "4.8.1", "backbone": "1.6.0", "clipboard": "2.0.11", diff --git a/src/wp-includes/assets/script-loader-packages.min.php b/src/wp-includes/assets/script-loader-packages.min.php index 5e48da81fdb96..6b302c3846cfb 100644 --- a/src/wp-includes/assets/script-loader-packages.min.php +++ b/src/wp-includes/assets/script-loader-packages.min.php @@ -1 +1 @@ - array('dependencies' => array('wp-dom-ready', 'wp-i18n'), 'version' => '3156534cc54473497e14'), 'annotations.min.js' => array('dependencies' => array('wp-data', 'wp-hooks', 'wp-i18n', 'wp-rich-text'), 'version' => '238360e96c76d37a2468'), 'api-fetch.min.js' => array('dependencies' => array('wp-i18n', 'wp-url'), 'version' => 'd387b816bc1ed2042e28'), 'autop.min.js' => array('dependencies' => array(), 'version' => '9fb50649848277dd318d'), 'blob.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '9113eed771d446f4a556'), 'block-directory.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-plugins', 'wp-primitives', 'wp-url'), 'version' => '1e2dcb064ecd5905fe6b'), 'block-editor.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-style-engine', 'wp-token-list', 'wp-url', 'wp-warning', 'wp-wordcount'), 'version' => 'dc2875dbcee52519979b'), 'block-library.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-autop', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-patterns', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-wordcount'), 'version' => 'ccc402e50b786e799ae9'), 'block-serialization-default-parser.min.js' => array('dependencies' => array(), 'version' => '14d44daebf663d05d330'), 'blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-autop', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-private-apis', 'wp-rich-text', 'wp-shortcode', 'wp-warning'), 'version' => '8474af4b6260126fa879'), 'commands.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-primitives', 'wp-private-apis'), 'version' => '33b90579e9a6d83ac03b'), 'components.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-compose', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-warning'), 'version' => 'e2ec2370dd500f7ea7c0'), 'compose.min.js' => array('dependencies' => array('react', 'react-jsx-runtime', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-priority-queue'), 'version' => '85f0708cd2e6b26addeb'), 'core-commands.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-commands', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-private-apis', 'wp-router', 'wp-url'), 'version' => 'e398c3f43e502a9c4a8f'), 'core-data.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-private-apis', 'wp-rich-text', 'wp-url', 'wp-warning'), 'version' => '8224153d27ea1b378c5a'), 'customize-widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-widgets'), 'version' => '6cc7ebe73bf2bd031694'), 'data.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-is-shallow-equal', 'wp-priority-queue', 'wp-private-apis', 'wp-redux-routine'), 'version' => '7c62e39de0308c73d50c'), 'data-controls.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-data', 'wp-deprecated'), 'version' => '49f5587e8b90f9e7cc7e'), 'date.min.js' => array('dependencies' => array('moment', 'wp-deprecated'), 'version' => 'aaca6387d1cf924acc51'), 'deprecated.min.js' => array('dependencies' => array('wp-hooks'), 'version' => 'e1f84915c5e8ae38964c'), 'dom.min.js' => array('dependencies' => array('wp-deprecated'), 'version' => '93117dfee2692b04b770'), 'dom-ready.min.js' => array('dependencies' => array(), 'version' => 'f77871ff7694fffea381'), 'edit-post.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-plugins', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-widgets'), 'version' => 'f56f4976c416ccebe712'), 'edit-site.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-priority-queue', 'wp-private-apis', 'wp-router', 'wp-url', 'wp-warning', 'wp-widgets'), 'version' => '79e90f0c7638bb507b37'), 'edit-widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-viewport', 'wp-widgets'), 'version' => '1efdc3b9daf491cf8991'), 'editor.min.js' => array('dependencies' => array('react', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport', 'wp-warning', 'wp-wordcount'), 'version' => 'c75d9bcd56416c25429e'), 'element.min.js' => array('dependencies' => array('react', 'react-dom', 'wp-escape-html'), 'version' => 'cb762d190aebbec25b27'), 'escape-html.min.js' => array('dependencies' => array(), 'version' => '6561a406d2d232a6fbd2'), 'fields.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-blob', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-patterns', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => 'f946d21e4cfda7fd0943'), 'format-library.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-url'), 'version' => '81b8a9364113f57b6a37'), 'hooks.min.js' => array('dependencies' => array(), 'version' => '4d63a3d491d11ffd8ac6'), 'html-entities.min.js' => array('dependencies' => array(), 'version' => '2cd3358363e0675638fb'), 'i18n.min.js' => array('dependencies' => array('wp-hooks'), 'version' => '5e580eb46a90c2b997e6'), 'is-shallow-equal.min.js' => array('dependencies' => array(), 'version' => 'e0f9f1d78d83f5196979'), 'keyboard-shortcuts.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-data', 'wp-element', 'wp-keycodes'), 'version' => '32686e58e84193ce808b'), 'keycodes.min.js' => array('dependencies' => array('wp-i18n'), 'version' => '034ff647a54b018581d3'), 'list-reusable-blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-blob', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n'), 'version' => 'aa3dd59fcb0ede2ee0da'), 'media-utils.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-blob', 'wp-element', 'wp-i18n'), 'version' => 'e10cc6bfcff4fe474479'), 'notices.min.js' => array('dependencies' => array('wp-data'), 'version' => '673a68a7ac2f556ed50b'), 'nux.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-primitives'), 'version' => '9a0dc535fe222ae46a48'), 'patterns.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => '43f6fdf7b2a8313f6de5'), 'plugins.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-element', 'wp-hooks', 'wp-is-shallow-equal', 'wp-primitives'), 'version' => 'ef6da4a9b2747b62c09c'), 'preferences.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-primitives', 'wp-private-apis'), 'version' => '945c6cbfe821b3070047'), 'preferences-persistence.min.js' => array('dependencies' => array('wp-api-fetch'), 'version' => '9307a8c9e3254140a223'), 'primitives.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-element'), 'version' => 'aef2543ab60c8c9bb609'), 'priority-queue.min.js' => array('dependencies' => array(), 'version' => '9c21c957c7e50ffdbf48'), 'private-apis.min.js' => array('dependencies' => array(), 'version' => '4b858962c15c2c7a135f'), 'redux-routine.min.js' => array('dependencies' => array(), 'version' => 'a0a172871afaeb261566'), 'reusable-blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-url'), 'version' => '73735a77e4e5095733da'), 'rich-text.min.js' => array('dependencies' => array('wp-a11y', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-escape-html', 'wp-i18n', 'wp-keycodes'), 'version' => '4021b9e4e9ef4d3cd868'), 'router.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-element', 'wp-polyfill', 'wp-private-apis', 'wp-url'), 'version' => 'e4887fecc16ef03e908f'), 'server-side-render.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-i18n', 'wp-url'), 'version' => '1e0f25c205ebeb30bcd2'), 'shortcode.min.js' => array('dependencies' => array(), 'version' => 'b7747eee0efafd2f0c3b'), 'style-engine.min.js' => array('dependencies' => array(), 'version' => '08cc10e9532531e22456'), 'token-list.min.js' => array('dependencies' => array(), 'version' => '3b5f5dcfde830ecef24f'), 'undo-manager.min.js' => array('dependencies' => array('wp-is-shallow-equal'), 'version' => 'f0698003cb0f0a7bd794'), 'url.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'e87eb76272a3a08402d2'), 'viewport.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-data'), 'version' => '829c9a30d366e1e5054c'), 'warning.min.js' => array('dependencies' => array(), 'version' => 'ed7c8b0940914f4fe44b'), 'widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives'), 'version' => 'e4801fc4b16effe444d8'), 'wordcount.min.js' => array('dependencies' => array(), 'version' => '55d8c2bf3dc99e7ea5ec')); + array('dependencies' => array('wp-dom-ready', 'wp-i18n'), 'version' => '3156534cc54473497e14'), 'annotations.min.js' => array('dependencies' => array('wp-data', 'wp-hooks', 'wp-i18n', 'wp-rich-text'), 'version' => '238360e96c76d37a2468'), 'api-fetch.min.js' => array('dependencies' => array('wp-i18n', 'wp-url'), 'version' => 'd387b816bc1ed2042e28'), 'autop.min.js' => array('dependencies' => array(), 'version' => '9fb50649848277dd318d'), 'blob.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '9113eed771d446f4a556'), 'block-directory.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-plugins', 'wp-primitives', 'wp-url'), 'version' => '1e2dcb064ecd5905fe6b'), 'block-editor.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-style-engine', 'wp-token-list', 'wp-url', 'wp-warning', 'wp-wordcount'), 'version' => '28fb4f612c7c613fdd55'), 'block-library.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-autop', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-patterns', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-wordcount'), 'version' => 'ccc402e50b786e799ae9'), 'block-serialization-default-parser.min.js' => array('dependencies' => array(), 'version' => '14d44daebf663d05d330'), 'blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-autop', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-private-apis', 'wp-rich-text', 'wp-shortcode', 'wp-warning'), 'version' => '8474af4b6260126fa879'), 'commands.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-primitives', 'wp-private-apis'), 'version' => '33b90579e9a6d83ac03b'), 'components.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-compose', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-warning'), 'version' => '130172abbae720694b1f'), 'compose.min.js' => array('dependencies' => array('react', 'react-jsx-runtime', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-priority-queue'), 'version' => '85f0708cd2e6b26addeb'), 'core-commands.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-commands', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-private-apis', 'wp-router', 'wp-url'), 'version' => 'e398c3f43e502a9c4a8f'), 'core-data.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-private-apis', 'wp-rich-text', 'wp-url', 'wp-warning'), 'version' => '8224153d27ea1b378c5a'), 'customize-widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-widgets'), 'version' => '6cc7ebe73bf2bd031694'), 'data.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-is-shallow-equal', 'wp-priority-queue', 'wp-private-apis', 'wp-redux-routine'), 'version' => '7c62e39de0308c73d50c'), 'data-controls.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-data', 'wp-deprecated'), 'version' => '49f5587e8b90f9e7cc7e'), 'date.min.js' => array('dependencies' => array('moment', 'wp-deprecated'), 'version' => 'aaca6387d1cf924acc51'), 'deprecated.min.js' => array('dependencies' => array('wp-hooks'), 'version' => 'e1f84915c5e8ae38964c'), 'dom.min.js' => array('dependencies' => array('wp-deprecated'), 'version' => '93117dfee2692b04b770'), 'dom-ready.min.js' => array('dependencies' => array(), 'version' => 'f77871ff7694fffea381'), 'edit-post.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-plugins', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-widgets'), 'version' => 'f56f4976c416ccebe712'), 'edit-site.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-priority-queue', 'wp-private-apis', 'wp-router', 'wp-url', 'wp-warning', 'wp-widgets'), 'version' => '79e90f0c7638bb507b37'), 'edit-widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-viewport', 'wp-widgets'), 'version' => '1efdc3b9daf491cf8991'), 'editor.min.js' => array('dependencies' => array('react', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport', 'wp-warning', 'wp-wordcount'), 'version' => 'd362bb0f0c3fd99674fe'), 'element.min.js' => array('dependencies' => array('react', 'react-dom', 'wp-escape-html'), 'version' => 'cb762d190aebbec25b27'), 'escape-html.min.js' => array('dependencies' => array(), 'version' => '6561a406d2d232a6fbd2'), 'fields.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-blob', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-patterns', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => 'c8dc1e4d8421380ff34a'), 'format-library.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-url'), 'version' => '81b8a9364113f57b6a37'), 'hooks.min.js' => array('dependencies' => array(), 'version' => '4d63a3d491d11ffd8ac6'), 'html-entities.min.js' => array('dependencies' => array(), 'version' => '2cd3358363e0675638fb'), 'i18n.min.js' => array('dependencies' => array('wp-hooks'), 'version' => '5e580eb46a90c2b997e6'), 'is-shallow-equal.min.js' => array('dependencies' => array(), 'version' => 'e0f9f1d78d83f5196979'), 'keyboard-shortcuts.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-data', 'wp-element', 'wp-keycodes'), 'version' => '32686e58e84193ce808b'), 'keycodes.min.js' => array('dependencies' => array('wp-i18n'), 'version' => '034ff647a54b018581d3'), 'list-reusable-blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-blob', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n'), 'version' => 'aa3dd59fcb0ede2ee0da'), 'media-utils.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-blob', 'wp-element', 'wp-i18n'), 'version' => 'e10cc6bfcff4fe474479'), 'notices.min.js' => array('dependencies' => array('wp-data'), 'version' => '673a68a7ac2f556ed50b'), 'nux.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-primitives'), 'version' => '9a0dc535fe222ae46a48'), 'patterns.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => 'b4c7e00c3ec65ecfeaed'), 'plugins.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-element', 'wp-hooks', 'wp-is-shallow-equal', 'wp-primitives'), 'version' => 'ef6da4a9b2747b62c09c'), 'preferences.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-primitives', 'wp-private-apis'), 'version' => '945c6cbfe821b3070047'), 'preferences-persistence.min.js' => array('dependencies' => array('wp-api-fetch'), 'version' => '9307a8c9e3254140a223'), 'primitives.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-element'), 'version' => 'aef2543ab60c8c9bb609'), 'priority-queue.min.js' => array('dependencies' => array(), 'version' => '9c21c957c7e50ffdbf48'), 'private-apis.min.js' => array('dependencies' => array(), 'version' => '4b858962c15c2c7a135f'), 'redux-routine.min.js' => array('dependencies' => array(), 'version' => 'a0a172871afaeb261566'), 'reusable-blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-url'), 'version' => '73735a77e4e5095733da'), 'rich-text.min.js' => array('dependencies' => array('wp-a11y', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-escape-html', 'wp-i18n', 'wp-keycodes'), 'version' => '4021b9e4e9ef4d3cd868'), 'router.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-element', 'wp-polyfill', 'wp-private-apis', 'wp-url'), 'version' => 'e4887fecc16ef03e908f'), 'server-side-render.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-i18n', 'wp-url'), 'version' => '1e0f25c205ebeb30bcd2'), 'shortcode.min.js' => array('dependencies' => array(), 'version' => 'b7747eee0efafd2f0c3b'), 'style-engine.min.js' => array('dependencies' => array(), 'version' => '08cc10e9532531e22456'), 'token-list.min.js' => array('dependencies' => array(), 'version' => '3b5f5dcfde830ecef24f'), 'undo-manager.min.js' => array('dependencies' => array('wp-is-shallow-equal'), 'version' => 'f0698003cb0f0a7bd794'), 'url.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'e87eb76272a3a08402d2'), 'viewport.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-data'), 'version' => '829c9a30d366e1e5054c'), 'warning.min.js' => array('dependencies' => array(), 'version' => 'ed7c8b0940914f4fe44b'), 'widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives'), 'version' => 'e4801fc4b16effe444d8'), 'wordcount.min.js' => array('dependencies' => array(), 'version' => '55d8c2bf3dc99e7ea5ec')); From 4a03ebeffe993d9e61b9339586b67435ce5c0ecf Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Wed, 20 Nov 2024 18:08:27 +0000 Subject: [PATCH 033/323] Build/Test Tools: Correctly check for Dependabot. This updates the conditions added in [59370] to skip unnecessary pull request comments when Dependabot is the opening contributor to check for the correct `github.actor` value. Follow up to [59380]. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59441 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/pull-request-comments.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pull-request-comments.yml b/.github/workflows/pull-request-comments.yml index 3338ff78b0605..ab7eba9ceffaa 100644 --- a/.github/workflows/pull-request-comments.yml +++ b/.github/workflows/pull-request-comments.yml @@ -123,7 +123,7 @@ jobs: - name: Leave a comment about testing with Playground uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 - if: ${{ github.actor != 'dependabot' }} + if: ${{ github.actor != 'dependabot[bot]' }} with: script: | const fs = require( 'fs' ); @@ -172,7 +172,7 @@ jobs: permissions: issues: write pull-requests: write - if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event_name == 'pull_request_target' && ! github.event.pull_request.draft && github.event.pull_request.state == 'open' && github.actor != 'dependabot' }} + if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event_name == 'pull_request_target' && ! github.event.pull_request.draft && github.event.pull_request.state == 'open' && github.actor != 'dependabot[bot]' }} steps: - name: Check for Trac ticket and manage comment uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 From b2c8d8d2c8754cab5286b06efb4c11e2b6aa92d5 Mon Sep 17 00:00:00 2001 From: Joe McGill Date: Wed, 20 Nov 2024 21:27:18 +0000 Subject: [PATCH 034/323] Editor: Avoid unnecessary array_merge in WP_Style_Engine::parse_block_styles(). This adds an `! empty()` check for classnames and declarations to avoid calling array_merge() with an empty value. Props mukesh27, ramonopoly, aaronrobertshaw. Fixes #62317. git-svn-id: https://develop.svn.wordpress.org/trunk@59442 602fd350-edb4-49c9-b593-d223f7449a82 --- .../style-engine/class-wp-style-engine.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/style-engine/class-wp-style-engine.php b/src/wp-includes/style-engine/class-wp-style-engine.php index 5582aacbb1db9..1234efdc6447a 100644 --- a/src/wp-includes/style-engine/class-wp-style-engine.php +++ b/src/wp-includes/style-engine/class-wp-style-engine.php @@ -454,8 +454,15 @@ public static function parse_block_styles( $block_styles, $options ) { continue; } - $parsed_styles['classnames'] = array_merge( $parsed_styles['classnames'], static::get_classnames( $style_value, $style_definition ) ); - $parsed_styles['declarations'] = array_merge( $parsed_styles['declarations'], static::get_css_declarations( $style_value, $style_definition, $options ) ); + $classnames = static::get_classnames( $style_value, $style_definition ); + if ( ! empty( $classnames ) ) { + $parsed_styles['classnames'] = array_merge( $parsed_styles['classnames'], $classnames ); + } + + $css_declarations = static::get_css_declarations( $style_value, $style_definition, $options ); + if ( ! empty( $css_declarations ) ) { + $parsed_styles['declarations'] = array_merge( $parsed_styles['declarations'], $css_declarations ); + } } } From 99dd184af42577fe975ffc3993a93f0f1a972eef Mon Sep 17 00:00:00 2001 From: John Blackbourn Date: Thu, 21 Nov 2024 13:16:07 +0000 Subject: [PATCH 035/323] Build/Test Tools: Improve the error message shown when fetching Twemoji fails. This allows the full error message to be shown from the connection attempt instead of a generic error message. Fixes #62382 git-svn-id: https://develop.svn.wordpress.org/trunk@59443 602fd350-edb4-49c9-b593-d223f7449a82 --- Gruntfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gruntfile.js b/Gruntfile.js index 70f826ac0e33c..4f8a3d6aa2e76 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1066,7 +1066,7 @@ module.exports = function(grunt) { files = spawn( 'gh', [ 'api', 'graphql', '-f', query] ); if ( 0 !== files.status ) { - grunt.fatal( 'Unable to fetch Twemoji file list' ); + grunt.fatal( files.stderr.toString() ); } try { From 71a52ced57ad8cb9fc52681abb5280c56a0b0a6c Mon Sep 17 00:00:00 2001 From: bernhard-reiter Date: Thu, 21 Nov 2024 13:27:58 +0000 Subject: [PATCH 036/323] HTML API: Add method to create fragment at node. HTML Fragment parsing always happens with a context node, which may impact how a fragment of HTML is parsed. HTML Fragment Processors can be instantiated with a `BODY` context node via `WP_HTML_Processor::create_fragment( $html )`. This changeset adds a static method called `create_fragment_at_current_node( string $html_fragment )`. It can only be called when the processor is paused at a `#tag`, with some additional constraints: - The opening and closing tags must appear in the HTML input (no virtual tokens). - No "self-contained" elements are allowed ( `IFRAME`, `SCRIPT`, `TITLE`, etc.). If successful, the method will return a `WP_HTML_Processor` instance whose context is inherited from the node that the method was called from. Props jonsurrell, bernhard-reiter, gziolo. Fixes #62357. git-svn-id: https://develop.svn.wordpress.org/trunk@59444 602fd350-edb4-49c9-b593-d223f7449a82 --- .../html-api/class-wp-html-processor.php | 114 ++++++++++++++++++ .../tests/html-api/wpHtmlProcessor.php | 60 +++++++++ .../html-api/wpHtmlProcessorHtml5lib.php | 85 ++++++++++--- 3 files changed, 245 insertions(+), 14 deletions(-) diff --git a/src/wp-includes/html-api/class-wp-html-processor.php b/src/wp-includes/html-api/class-wp-html-processor.php index cfcd6bdb94e94..39196499fa5af 100644 --- a/src/wp-includes/html-api/class-wp-html-processor.php +++ b/src/wp-includes/html-api/class-wp-html-processor.php @@ -424,6 +424,120 @@ function ( WP_HTML_Token $token ): void { }; } + /** + * Creates a fragment processor at the current node. + * + * HTML Fragment parsing always happens with a context node. HTML Fragment Processors can be + * instantiated with a `BODY` context node via `WP_HTML_Processor::create_fragment( $html )`. + * + * The context node may impact how a fragment of HTML is parsed. For example, consider the HTML + * fragment `Inside TD?`. + * + * A BODY context node will produce the following tree: + * + * └─#text Inside TD? + * + * Notice that the `` tags are completely ignored. + * + * Compare that with an SVG context node that produces the following tree: + * + * ├─svg:td + * └─#text Inside TD? + * + * Here, a `td` node in the `svg` namespace is created, and its self-closing flag is respected. + * This is a peculiarity of parsing HTML in foreign content like SVG. + * + * Finally, consider the tree produced with a TABLE context node: + * + * └─TBODY + * └─TR + * └─TD + * └─#text Inside TD? + * + * These examples demonstrate how important the context node may be when processing an HTML + * fragment. Special care must be taken when processing fragments that are expected to appear + * in specific contexts. SVG and TABLE are good examples, but there are others. + * + * @see https://html.spec.whatwg.org/multipage/parsing.html#html-fragment-parsing-algorithm + * + * @param string $html Input HTML fragment to process. + * @return static|null The created processor if successful, otherwise null. + */ + public function create_fragment_at_current_node( string $html ) { + if ( $this->get_token_type() !== '#tag' ) { + return null; + } + + $namespace = $this->current_element->token->namespace; + + /* + * Prevent creating fragments at nodes that require a special tokenizer state. + * This is unsupported by the HTML Processor. + */ + if ( + 'html' === $namespace && + in_array( $this->current_element->token->node_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP', 'PLAINTEXT' ), true ) + ) { + return null; + } + + $fragment_processor = static::create_fragment( $html ); + if ( null === $fragment_processor ) { + return null; + } + + $fragment_processor->compat_mode = $this->compat_mode; + + $fragment_processor->context_node = clone $this->state->current_token; + $fragment_processor->context_node->bookmark_name = 'context-node'; + $fragment_processor->context_node->on_destroy = null; + + $fragment_processor->state->context_node = array( $fragment_processor->context_node->node_name, array() ); + + $attribute_names = $this->get_attribute_names_with_prefix( '' ); + if ( null !== $attribute_names ) { + foreach ( $attribute_names as $name ) { + $fragment_processor->state->context_node[1][ $name ] = $this->get_attribute( $name ); + } + } + + $fragment_processor->breadcrumbs = array( 'HTML', $fragment_processor->context_node->node_name ); + + if ( 'TEMPLATE' === $fragment_processor->context_node->node_name ) { + $fragment_processor->state->stack_of_template_insertion_modes[] = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE; + } + + $fragment_processor->reset_insertion_mode_appropriately(); + + /* + * > Set the parser's form element pointer to the nearest node to the context element that + * > is a form element (going straight up the ancestor chain, and including the element + * > itself, if it is a form element), if any. (If there is no such form element, the + * > form element pointer keeps its initial value, null.) + */ + foreach ( $this->state->stack_of_open_elements->walk_up() as $element ) { + if ( 'FORM' === $element->node_name && 'html' === $element->namespace ) { + $fragment_processor->state->form_element = clone $element; + $fragment_processor->state->form_element->bookmark_name = null; + $fragment_processor->state->form_element->on_destroy = null; + break; + } + } + + $fragment_processor->state->encoding_confidence = 'irrelevant'; + + /* + * Update the parsing namespace near the end of the process. + * This is important so that any push/pop from the stack of open + * elements does not change the parsing namespace. + */ + $fragment_processor->change_parsing_namespace( + $this->current_element->token->integration_node_type ? 'html' : $namespace + ); + + return $fragment_processor; + } + /** * Stops the parser and terminates its execution when encountering unsupported markup. * diff --git a/tests/phpunit/tests/html-api/wpHtmlProcessor.php b/tests/phpunit/tests/html-api/wpHtmlProcessor.php index 1ca60e691f03e..a19af13c78925 100644 --- a/tests/phpunit/tests/html-api/wpHtmlProcessor.php +++ b/tests/phpunit/tests/html-api/wpHtmlProcessor.php @@ -1043,6 +1043,66 @@ public function test_ensure_next_token_method_extensibility( $html, $expected_to $this->assertEquals( $expected_token_counts, $processor->token_seen_count, 'Snapshot: ' . var_export( $processor->token_seen_count, true ) ); } + /** + * @ticket 62357 + */ + public function test_create_fragment_at_current_node_in_foreign_content() { + $processor = WP_HTML_Processor::create_full_parser( '' ); + $this->assertTrue( $processor->next_tag( 'SVG' ) ); + + $fragment = $processor->create_fragment_at_current_node( "\0preceded-by-nul-byte
" ); + + $this->assertSame( 'svg', $fragment->get_namespace() ); + $this->assertTrue( $fragment->next_token() ); + + /* + * In HTML parsing, a nul byte would be ignored. + * In SVG it should be replaced with a replacement character. + */ + $this->assertSame( '#text', $fragment->get_token_type() ); + $this->assertSame( "\u{FFFD}", $fragment->get_modifiable_text() ); + + $this->assertTrue( $fragment->next_tag( 'RECT' ) ); + $this->assertSame( 'svg', $fragment->get_namespace() ); + + $this->assertTrue( $fragment->next_tag( 'CIRCLE' ) ); + $this->assertSame( array( 'HTML', 'SVG', 'CIRCLE' ), $fragment->get_breadcrumbs() ); + $this->assertTrue( $fragment->next_tag( 'foreignObject' ) ); + $this->assertSame( 'svg', $fragment->get_namespace() ); + } + + /** + * @ticket 62357 + */ + public function test_create_fragment_at_current_node_in_foreign_content_integration_point() { + $processor = WP_HTML_Processor::create_full_parser( '' ); + $this->assertTrue( $processor->next_tag( 'foreignObject' ) ); + + $fragment = $processor->create_fragment_at_current_node( "\0not-preceded-by-nul-byte" ); + + // Nothing has been processed, the html namespace should be used for parsing as an integration point. + $this->assertSame( 'html', $fragment->get_namespace() ); + + // HTML parsing transforms IMAGE into IMG. + $this->assertTrue( $fragment->next_tag( 'IMG' ) ); + + $this->assertTrue( $fragment->next_token() ); + + // In HTML parsing, the nul byte is ignored and the text is reached. + $this->assertSame( '#text', $fragment->get_token_type() ); + $this->assertSame( 'not-preceded-by-nul-byte', $fragment->get_modifiable_text() ); + + /* + * svg:foreignObject is an HTML integration point, so the processor should be in the HTML namespace. + * RECT is an HTML element here, meaning it may have the self-closing flag but does not self-close. + */ + $this->assertTrue( $fragment->next_tag( 'RECT' ) ); + $this->assertSame( array( 'HTML', 'FOREIGNOBJECT', 'RECT' ), $fragment->get_breadcrumbs() ); + $this->assertSame( 'html', $fragment->get_namespace() ); + $this->assertTrue( $fragment->has_self_closing_flag() ); + $this->assertTrue( $fragment->expects_closer() ); + } + /** * Ensure that lowercased tag_name query matches tags case-insensitively. * diff --git a/tests/phpunit/tests/html-api/wpHtmlProcessorHtml5lib.php b/tests/phpunit/tests/html-api/wpHtmlProcessorHtml5lib.php index 808fa39d17f26..7abe63a859954 100644 --- a/tests/phpunit/tests/html-api/wpHtmlProcessorHtml5lib.php +++ b/tests/phpunit/tests/html-api/wpHtmlProcessorHtml5lib.php @@ -138,10 +138,6 @@ public function data_external_html5lib_tests() { * @return bool True if the test case should be skipped. False otherwise. */ private static function should_skip_test( ?string $test_context_element, string $test_name ): bool { - if ( null !== $test_context_element && 'body' !== $test_context_element ) { - return true; - } - if ( array_key_exists( $test_name, self::SKIP_TESTS ) ) { return true; } @@ -157,18 +153,79 @@ private static function should_skip_test( ?string $test_context_element, string * @return string|null Tree structure of parsed HTML, if supported, else null. */ private static function build_tree_representation( ?string $fragment_context, string $html ) { - $processor = $fragment_context - ? WP_HTML_Processor::create_fragment( $html, "<{$fragment_context}>" ) - : WP_HTML_Processor::create_full_parser( $html ); - if ( null === $processor ) { - throw new WP_HTML_Unsupported_Exception( "Could not create a parser with the given fragment context: {$fragment_context}.", '', 0, '', array(), array() ); + $processor = null; + if ( $fragment_context ) { + if ( 'body' === $fragment_context ) { + $processor = WP_HTML_Processor::create_fragment( $html ); + } else { + + /* + * If the string of characters starts with "svg ", the context + * element is in the SVG namespace and the substring after + * "svg " is the local name. If the string of characters starts + * with "math ", the context element is in the MathML namespace + * and the substring after "math " is the local name. + * Otherwise, the context element is in the HTML namespace and + * the string is the local name. + */ + if ( str_starts_with( $fragment_context, 'svg ' ) ) { + $tag_name = substr( $fragment_context, 4 ); + if ( 'svg' === $tag_name ) { + $parent_processor = WP_HTML_Processor::create_full_parser( '' ); + } else { + $parent_processor = WP_HTML_Processor::create_full_parser( "<{$tag_name}>" ); + } + $parent_processor->next_tag( $tag_name ); + } elseif ( str_starts_with( $fragment_context, 'math ' ) ) { + $tag_name = substr( $fragment_context, 5 ); + if ( 'math' === $tag_name ) { + $parent_processor = WP_HTML_Processor::create_full_parser( '' ); + } else { + $parent_processor = WP_HTML_Processor::create_full_parser( "<{$tag_name}>" ); + } + $parent_processor->next_tag( $tag_name ); + } else { + if ( in_array( + $fragment_context, + array( + 'caption', + 'col', + 'colgroup', + 'tbody', + 'td', + 'tfoot', + 'th', + 'thead', + 'tr', + ), + true + ) ) { + $parent_processor = WP_HTML_Processor::create_full_parser( "<{$fragment_context}>" ); + $parent_processor->next_tag(); + } else { + $parent_processor = WP_HTML_Processor::create_full_parser( "<{$fragment_context}>" ); + } + $parent_processor->next_tag( $fragment_context ); + } + if ( null !== $parent_processor->get_unsupported_exception() ) { + throw $parent_processor->get_unsupported_exception(); + } + if ( null !== $parent_processor->get_last_error() ) { + throw new Exception( $parent_processor->get_last_error() ); + } + $processor = $parent_processor->create_fragment_at_current_node( $html ); + } + + if ( null === $processor ) { + throw new WP_HTML_Unsupported_Exception( "Could not create a parser with the given fragment context: {$fragment_context}.", '', 0, '', array(), array() ); + } + } else { + $processor = WP_HTML_Processor::create_full_parser( $html ); + if ( null === $processor ) { + throw new Exception( 'Could not create a full parser.' ); + } } - /* - * The fragment parser will start in 2 levels deep at: html > body > [position] - * and requires adjustment to initial parameters. - * The full parser will not. - */ $output = ''; $indent_level = 0; $was_text = null; From 8cd0ec0234cf09b275031073274283cc860334e6 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Thu, 21 Nov 2024 19:00:46 +0000 Subject: [PATCH 037/323] Bundled Theme: Pin a `theme.json` schema version to Twenty Twenty-Five. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Each theme’s `theme.json` schema version should be pinned to the version that was valid at the time it was released. Props im3dabasia1, poena, mukesh27. Fixes #62455. git-svn-id: https://develop.svn.wordpress.org/trunk@59448 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-content/themes/twentytwentyfive/theme.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-content/themes/twentytwentyfive/theme.json b/src/wp-content/themes/twentytwentyfive/theme.json index e43b5888af2aa..a8307078653da 100644 --- a/src/wp-content/themes/twentytwentyfive/theme.json +++ b/src/wp-content/themes/twentytwentyfive/theme.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "settings": { "appearanceTools": true, From 849db39fc7d2c8e7f3ddc64370b51483e08272c5 Mon Sep 17 00:00:00 2001 From: Sarah Norris Date: Fri, 22 Nov 2024 10:55:12 +0000 Subject: [PATCH 038/323] Editor: Warn about empty templates on the frontend for logged in users. Adds a new function, `wp_render_empty_block_template_warning`, that renders a warning for logged-in users when a block template is empty. Reviewed by get_dave, richtabor. Props vcanales, mikachan, peterwilsoncc, richtabor, get_dave, mrfoxtalbot, matveb, arielmaidana, seifradwane, annezazu. Fixes #62053. git-svn-id: https://develop.svn.wordpress.org/trunk@59449 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/block-template.php | 45 ++++++++++++++++--- .../css/wp-empty-template-alert.css | 23 ++++++++++ src/wp-includes/script-loader.php | 2 + 3 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 src/wp-includes/css/wp-empty-template-alert.css diff --git a/src/wp-includes/block-template.php b/src/wp-includes/block-template.php index 2a75231ae4e90..86e57d6550f31 100644 --- a/src/wp-includes/block-template.php +++ b/src/wp-includes/block-template.php @@ -17,6 +17,32 @@ function _add_template_loader_filters() { } } +/** + * Renders a warning screen for empty block templates. + * + * @since 6.8.0 + * + * @param WP_Block_Template $block_template The block template object. + * @return string The warning screen HTML. + */ +function wp_render_empty_block_template_warning( $block_template ) { + wp_enqueue_style( 'wp-empty-template-alert' ); + return sprintf( + /* translators: %1$s: Block template title. %2$s: Empty template warning message. %3$s: Edit template link. %4$s: Edit template button label. */ + '
+

%1$s

+

%2$s

+ + %4$s + +
', + esc_html( $block_template->title ), + __( 'This page is blank because the template is empty. You can reset or customize it in the Site Editor.' ), + get_edit_post_link( $block_template->wp_id, 'site-editor' ), + __( 'Edit template' ) + ); +} + /** * Finds a block template with equal or higher specificity than a given PHP template file. * @@ -68,13 +94,18 @@ function locate_block_template( $template, $type, array $templates ) { if ( $block_template ) { $_wp_current_template_id = $block_template->id; - if ( empty( $block_template->content ) && is_user_logged_in() ) { - $_wp_current_template_content = - sprintf( - /* translators: %s: Template title */ - __( 'Empty template: %s' ), - $block_template->title - ); + if ( empty( $block_template->content ) ) { + if ( is_user_logged_in() ) { + $_wp_current_template_content = wp_render_empty_block_template_warning( $block_template ); + } else { + if ( $block_template->has_theme_file ) { + // Show contents from theme template if user is not logged in. + $theme_template = _get_block_template_file( 'wp_template', $block_template->slug ); + $_wp_current_template_content = file_get_contents( $theme_template['path'] ); + } else { + $_wp_current_template_content = $block_template->content; + } + } } elseif ( ! empty( $block_template->content ) ) { $_wp_current_template_content = $block_template->content; } diff --git a/src/wp-includes/css/wp-empty-template-alert.css b/src/wp-includes/css/wp-empty-template-alert.css new file mode 100644 index 0000000000000..53142ec84c7db --- /dev/null +++ b/src/wp-includes/css/wp-empty-template-alert.css @@ -0,0 +1,23 @@ +#wp-empty-template-alert { + display: flex; + padding: var(--wp--style--root--padding-right, 2rem); + min-height: 60vh; + flex-direction: column; + align-items: center; + justify-content: center; + gap: var(--wp--style--block-gap, 2rem); +} + +#wp-empty-template-alert > * { + max-width: 400px; +} + +#wp-empty-template-alert h2, +#wp-empty-template-alert p { + margin: 0; + text-align: center; +} + +#wp-empty-template-alert a { + margin-top: 1rem; +} diff --git a/src/wp-includes/script-loader.php b/src/wp-includes/script-loader.php index 61409c477638f..d2c8dbe97e393 100644 --- a/src/wp-includes/script-loader.php +++ b/src/wp-includes/script-loader.php @@ -1627,6 +1627,7 @@ function wp_default_styles( $styles ) { $styles->add( 'wp-pointer', "/wp-includes/css/wp-pointer$suffix.css", array( 'dashicons' ) ); $styles->add( 'customize-preview', "/wp-includes/css/customize-preview$suffix.css", array( 'dashicons' ) ); $styles->add( 'wp-embed-template-ie', "/wp-includes/css/wp-embed-template-ie$suffix.css" ); + $styles->add( 'wp-empty-template-alert', "/wp-includes/css/wp-empty-template-alert$suffix.css" ); $styles->add_data( 'wp-embed-template-ie', 'conditional', 'lte IE 8' ); // External libraries and friends. @@ -1809,6 +1810,7 @@ function wp_default_styles( $styles ) { 'customize-preview', 'login', 'site-health', + 'wp-empty-template-alert', // Includes CSS. 'buttons', 'admin-bar', From 1563d8622dbd991683fd38ab07c827ff45e9d945 Mon Sep 17 00:00:00 2001 From: Carlos Bravo Date: Fri, 22 Nov 2024 12:50:48 +0000 Subject: [PATCH 039/323] HTML API: Prevent fragment creation on close tag. Prevent fragments from being created at tag closers. Follow-up to [59444]. Props jonsurrell, bernhard-reiter. Fixes #62357. git-svn-id: https://develop.svn.wordpress.org/trunk@59450 602fd350-edb4-49c9-b593-d223f7449a82 --- .../html-api/class-wp-html-processor.php | 2 +- .../phpunit/tests/html-api/wpHtmlProcessor.php | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/html-api/class-wp-html-processor.php b/src/wp-includes/html-api/class-wp-html-processor.php index 39196499fa5af..4bdb75fcac3eb 100644 --- a/src/wp-includes/html-api/class-wp-html-processor.php +++ b/src/wp-includes/html-api/class-wp-html-processor.php @@ -464,7 +464,7 @@ function ( WP_HTML_Token $token ): void { * @return static|null The created processor if successful, otherwise null. */ public function create_fragment_at_current_node( string $html ) { - if ( $this->get_token_type() !== '#tag' ) { + if ( $this->get_token_type() !== '#tag' || $this->is_tag_closer() ) { return null; } diff --git a/tests/phpunit/tests/html-api/wpHtmlProcessor.php b/tests/phpunit/tests/html-api/wpHtmlProcessor.php index a19af13c78925..f80260cbc1aa6 100644 --- a/tests/phpunit/tests/html-api/wpHtmlProcessor.php +++ b/tests/phpunit/tests/html-api/wpHtmlProcessor.php @@ -1103,6 +1103,23 @@ public function test_create_fragment_at_current_node_in_foreign_content_integrat $this->assertTrue( $fragment->expects_closer() ); } + /** + * @ticket 62357 + */ + public function test_prevent_fragment_creation_on_closers() { + $processor = WP_HTML_Processor::create_full_parser( '

' ); + $processor->next_tag( 'P' ); + $processor->next_tag( + array( + 'tag_name' => 'P', + 'tag_closers' => 'visit', + ) + ); + $this->assertSame( 'P', $processor->get_tag() ); + $this->assertTrue( $processor->is_tag_closer() ); + $this->assertNull( $processor->create_fragment_at_current_node( 'fragment HTML' ) ); + } + /** * Ensure that lowercased tag_name query matches tags case-insensitively. * From 5728ebbf7e039bcd7c23aa81532f3c0ffbe4d275 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Fri, 22 Nov 2024 13:48:12 +0000 Subject: [PATCH 040/323] Bundled Theme: Pin schema version to rest of Twenty Twenty-Five. All JSON files in the theme should be pinned to the appropriate schema version, not just `theme.json`. Follow up to [59448]. Props im3dabasia1, poena. Fixes #62455. git-svn-id: https://develop.svn.wordpress.org/trunk@59451 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-content/themes/twentytwentyfive/styles/01-evening.json | 2 +- src/wp-content/themes/twentytwentyfive/styles/02-noon.json | 2 +- src/wp-content/themes/twentytwentyfive/styles/03-dusk.json | 2 +- src/wp-content/themes/twentytwentyfive/styles/04-afternoon.json | 2 +- src/wp-content/themes/twentytwentyfive/styles/05-twilight.json | 2 +- src/wp-content/themes/twentytwentyfive/styles/06-morning.json | 2 +- src/wp-content/themes/twentytwentyfive/styles/07-sunrise.json | 2 +- src/wp-content/themes/twentytwentyfive/styles/08-midnight.json | 2 +- .../themes/twentytwentyfive/styles/blocks/01-display.json | 2 +- .../themes/twentytwentyfive/styles/blocks/02-subtitle.json | 2 +- .../themes/twentytwentyfive/styles/blocks/03-annotation.json | 2 +- .../themes/twentytwentyfive/styles/blocks/post-terms-1.json | 2 +- .../themes/twentytwentyfive/styles/colors/01-evening.json | 2 +- .../themes/twentytwentyfive/styles/colors/02-noon.json | 2 +- .../themes/twentytwentyfive/styles/colors/03-dusk.json | 2 +- .../themes/twentytwentyfive/styles/colors/04-afternoon.json | 2 +- .../themes/twentytwentyfive/styles/colors/05-twilight.json | 2 +- .../themes/twentytwentyfive/styles/colors/06-morning.json | 2 +- .../themes/twentytwentyfive/styles/colors/07-sunrise.json | 2 +- .../themes/twentytwentyfive/styles/colors/08-midnight.json | 2 +- .../themes/twentytwentyfive/styles/sections/section-1.json | 2 +- .../themes/twentytwentyfive/styles/sections/section-2.json | 2 +- .../themes/twentytwentyfive/styles/sections/section-3.json | 2 +- .../themes/twentytwentyfive/styles/sections/section-4.json | 2 +- .../themes/twentytwentyfive/styles/sections/section-5.json | 2 +- .../twentytwentyfive/styles/typography/typography-preset-1.json | 2 +- .../twentytwentyfive/styles/typography/typography-preset-2.json | 2 +- .../twentytwentyfive/styles/typography/typography-preset-3.json | 2 +- .../twentytwentyfive/styles/typography/typography-preset-4.json | 2 +- .../twentytwentyfive/styles/typography/typography-preset-5.json | 2 +- .../twentytwentyfive/styles/typography/typography-preset-6.json | 2 +- .../twentytwentyfive/styles/typography/typography-preset-7.json | 2 +- 32 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/wp-content/themes/twentytwentyfive/styles/01-evening.json b/src/wp-content/themes/twentytwentyfive/styles/01-evening.json index e270f9fe9b93d..6b9a11aa98589 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/01-evening.json +++ b/src/wp-content/themes/twentytwentyfive/styles/01-evening.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "title": "Evening", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/02-noon.json b/src/wp-content/themes/twentytwentyfive/styles/02-noon.json index aac33a46cfda1..32bed51c79303 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/02-noon.json +++ b/src/wp-content/themes/twentytwentyfive/styles/02-noon.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "title": "Noon", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/03-dusk.json b/src/wp-content/themes/twentytwentyfive/styles/03-dusk.json index 41ed777abdc11..bbcdf63a196e0 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/03-dusk.json +++ b/src/wp-content/themes/twentytwentyfive/styles/03-dusk.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "title": "Dusk", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/04-afternoon.json b/src/wp-content/themes/twentytwentyfive/styles/04-afternoon.json index 6a2840194b3a0..d1edf014d54b5 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/04-afternoon.json +++ b/src/wp-content/themes/twentytwentyfive/styles/04-afternoon.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "title": "Afternoon", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/05-twilight.json b/src/wp-content/themes/twentytwentyfive/styles/05-twilight.json index fede67ebd934c..833b4f313365b 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/05-twilight.json +++ b/src/wp-content/themes/twentytwentyfive/styles/05-twilight.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "title": "Twilight", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/06-morning.json b/src/wp-content/themes/twentytwentyfive/styles/06-morning.json index cb7ec98e4a73c..60d11737258c1 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/06-morning.json +++ b/src/wp-content/themes/twentytwentyfive/styles/06-morning.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "title": "Morning", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/07-sunrise.json b/src/wp-content/themes/twentytwentyfive/styles/07-sunrise.json index ed60e26b87d07..fa5b100370c4d 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/07-sunrise.json +++ b/src/wp-content/themes/twentytwentyfive/styles/07-sunrise.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "title": "Sunrise", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/08-midnight.json b/src/wp-content/themes/twentytwentyfive/styles/08-midnight.json index 48019bf2ae0a7..9272d14ef8cd4 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/08-midnight.json +++ b/src/wp-content/themes/twentytwentyfive/styles/08-midnight.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "title": "Midnight", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/blocks/01-display.json b/src/wp-content/themes/twentytwentyfive/styles/blocks/01-display.json index 253e45db48fe6..ff8eaae681406 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/blocks/01-display.json +++ b/src/wp-content/themes/twentytwentyfive/styles/blocks/01-display.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "title": "Display", "slug": "text-display", diff --git a/src/wp-content/themes/twentytwentyfive/styles/blocks/02-subtitle.json b/src/wp-content/themes/twentytwentyfive/styles/blocks/02-subtitle.json index 216f3b82750e3..bd9640c9d23d4 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/blocks/02-subtitle.json +++ b/src/wp-content/themes/twentytwentyfive/styles/blocks/02-subtitle.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "title": "Subtitle", "slug": "text-subtitle", diff --git a/src/wp-content/themes/twentytwentyfive/styles/blocks/03-annotation.json b/src/wp-content/themes/twentytwentyfive/styles/blocks/03-annotation.json index 6d29a840bc599..41391e3cefd18 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/blocks/03-annotation.json +++ b/src/wp-content/themes/twentytwentyfive/styles/blocks/03-annotation.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "title": "Annotation", "slug": "text-annotation", diff --git a/src/wp-content/themes/twentytwentyfive/styles/blocks/post-terms-1.json b/src/wp-content/themes/twentytwentyfive/styles/blocks/post-terms-1.json index 77430dcd9f037..5995fbb05c09d 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/blocks/post-terms-1.json +++ b/src/wp-content/themes/twentytwentyfive/styles/blocks/post-terms-1.json @@ -1,6 +1,6 @@ { "version": 3, - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "title": "Pill shaped", "slug": "post-terms-1", "blockTypes": ["core/post-terms"], diff --git a/src/wp-content/themes/twentytwentyfive/styles/colors/01-evening.json b/src/wp-content/themes/twentytwentyfive/styles/colors/01-evening.json index 02acc8ba363e3..56c88fb4be342 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/colors/01-evening.json +++ b/src/wp-content/themes/twentytwentyfive/styles/colors/01-evening.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "title": "Evening", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/colors/02-noon.json b/src/wp-content/themes/twentytwentyfive/styles/colors/02-noon.json index 555b25890ae6d..97b12a57d7e91 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/colors/02-noon.json +++ b/src/wp-content/themes/twentytwentyfive/styles/colors/02-noon.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "title": "Noon", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/colors/03-dusk.json b/src/wp-content/themes/twentytwentyfive/styles/colors/03-dusk.json index 7bbc63355bc61..705c827e19b43 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/colors/03-dusk.json +++ b/src/wp-content/themes/twentytwentyfive/styles/colors/03-dusk.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "title": "Dusk", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/colors/04-afternoon.json b/src/wp-content/themes/twentytwentyfive/styles/colors/04-afternoon.json index 2a5321a649a24..60da74976255d 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/colors/04-afternoon.json +++ b/src/wp-content/themes/twentytwentyfive/styles/colors/04-afternoon.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "title": "Afternoon", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/colors/05-twilight.json b/src/wp-content/themes/twentytwentyfive/styles/colors/05-twilight.json index e54b834d692c2..329164dae1d78 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/colors/05-twilight.json +++ b/src/wp-content/themes/twentytwentyfive/styles/colors/05-twilight.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "title": "Twilight", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/colors/06-morning.json b/src/wp-content/themes/twentytwentyfive/styles/colors/06-morning.json index 98f929904f3f7..43300455c6e4e 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/colors/06-morning.json +++ b/src/wp-content/themes/twentytwentyfive/styles/colors/06-morning.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "title": "Morning", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/colors/07-sunrise.json b/src/wp-content/themes/twentytwentyfive/styles/colors/07-sunrise.json index b320026d09c03..ee39df91eace7 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/colors/07-sunrise.json +++ b/src/wp-content/themes/twentytwentyfive/styles/colors/07-sunrise.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "title": "Sunrise", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/colors/08-midnight.json b/src/wp-content/themes/twentytwentyfive/styles/colors/08-midnight.json index 28151874b63d8..c995e2e7118d4 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/colors/08-midnight.json +++ b/src/wp-content/themes/twentytwentyfive/styles/colors/08-midnight.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "title": "Midnight", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/sections/section-1.json b/src/wp-content/themes/twentytwentyfive/styles/sections/section-1.json index fa153a40f7dae..642f3b2c838bf 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/sections/section-1.json +++ b/src/wp-content/themes/twentytwentyfive/styles/sections/section-1.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "slug": "section-1", "title": "Style 1", diff --git a/src/wp-content/themes/twentytwentyfive/styles/sections/section-2.json b/src/wp-content/themes/twentytwentyfive/styles/sections/section-2.json index e8608327a02c1..81459c04b1a8d 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/sections/section-2.json +++ b/src/wp-content/themes/twentytwentyfive/styles/sections/section-2.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "slug": "section-2", "title": "Style 2", diff --git a/src/wp-content/themes/twentytwentyfive/styles/sections/section-3.json b/src/wp-content/themes/twentytwentyfive/styles/sections/section-3.json index b706a319fc7c4..3d1c0a6e62ddd 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/sections/section-3.json +++ b/src/wp-content/themes/twentytwentyfive/styles/sections/section-3.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "slug": "section-3", "title": "Style 3", diff --git a/src/wp-content/themes/twentytwentyfive/styles/sections/section-4.json b/src/wp-content/themes/twentytwentyfive/styles/sections/section-4.json index 47208dc913fa3..226779b46c2db 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/sections/section-4.json +++ b/src/wp-content/themes/twentytwentyfive/styles/sections/section-4.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "slug": "section-4", "title": "Style 4", diff --git a/src/wp-content/themes/twentytwentyfive/styles/sections/section-5.json b/src/wp-content/themes/twentytwentyfive/styles/sections/section-5.json index c616a4258dc87..c9b37a8ad019a 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/sections/section-5.json +++ b/src/wp-content/themes/twentytwentyfive/styles/sections/section-5.json @@ -1,5 +1,5 @@ { - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "version": 3, "slug": "section-5", "title": "Style 5", diff --git a/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-1.json b/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-1.json index 574fc1f49b7cd..ad6c6cd12cb59 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-1.json +++ b/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-1.json @@ -1,6 +1,6 @@ { "version": 3, - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "title": "Beiruti & Literata", "slug": "typography-preset-1", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-2.json b/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-2.json index 1278ded18c108..e3e26b3aa40df 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-2.json +++ b/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-2.json @@ -1,6 +1,6 @@ { "version": 3, - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "title": "Vollkorn & Fira Code", "slug": "typography-preset-2", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-3.json b/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-3.json index b149377508750..6d64153e70100 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-3.json +++ b/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-3.json @@ -1,6 +1,6 @@ { "version": 3, - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "title": "Platypi & Ysabeau Office", "slug": "typography-preset-3", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-4.json b/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-4.json index b9f32698a5dc9..62a6362d25b4a 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-4.json +++ b/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-4.json @@ -1,6 +1,6 @@ { "version": 3, - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "title": "Roboto Slab & Manrope", "slug": "typography-preset-4", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-5.json b/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-5.json index afea028456d62..e30d03ebc392e 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-5.json +++ b/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-5.json @@ -1,6 +1,6 @@ { "version": 3, - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "title": "Literata & Ysabeau Office", "slug": "typography-preset-5", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-6.json b/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-6.json index 7abbadb278c5f..d9eb663e847b0 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-6.json +++ b/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-6.json @@ -1,6 +1,6 @@ { "version": 3, - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "title": "Platypi & Literata", "slug": "typography-preset-6", "settings": { diff --git a/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-7.json b/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-7.json index 1378aae692a40..69b1740ae6717 100644 --- a/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-7.json +++ b/src/wp-content/themes/twentytwentyfive/styles/typography/typography-preset-7.json @@ -1,6 +1,6 @@ { "version": 3, - "$schema": "https://schemas.wp.org/trunk/theme.json", + "$schema": "https://schemas.wp.org/wp/6.7/theme.json", "title": "Literata & Fira Sans", "slug": "typography-preset-7", "settings": { From bdeb21b2cb8471782bc3905cf9143757ae77db53 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Fri, 22 Nov 2024 16:58:55 +0000 Subject: [PATCH 041/323] Build/Test Tools: Create reusable workflow for parsing `.version-support-*.json` files. This extracts the logic responsible for parsing the `.version-support-*.json` files and returning a list of supported PHP and MySQL versions for a given branch of WordPress into a reusable workflow so that other workflows can make use of the functionality without repeating code. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59452 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/install-testing.yml | 72 +++-------- .../reusable-support-json-reader-v1.yml | 120 ++++++++++++++++++ 2 files changed, 135 insertions(+), 57 deletions(-) create mode 100644 .github/workflows/reusable-support-json-reader-v1.yml diff --git a/.github/workflows/install-testing.yml b/.github/workflows/install-testing.yml index 9b9036085cd89..c9de4a73abf25 100644 --- a/.github/workflows/install-testing.yml +++ b/.github/workflows/install-testing.yml @@ -14,8 +14,10 @@ on: pull_request: # Always test the workflow when changes are suggested. paths: - - '.github/workflows/install-testing.yml' - '.version-support-*.json' + - '.github/workflows/install-testing.yml' + - '.github/workflows/reusable-support-json-reader-v1.yml' + schedule: - cron: '0 0 * * 1' workflow_dispatch: @@ -37,60 +39,16 @@ concurrency: permissions: {} jobs: - # Determines the appropriate values for PHP and database versions based on the WordPress version being tested. - # - # Performs the following steps: - # - Checks out the repository. - # - Fetches the versions of PHP to test. - # - Fetches the versions of MySQL to test. - build-matrix: - name: Determine PHP Versions to test - runs-on: ubuntu-latest + # Determines the supported values for PHP and database versions based on the WordPress version being tested. + build-test-matrix: + name: Build Test Matrix + uses: WordPress/wordpress-develop/.github/workflows/reusable-support-json-reader-v1.yml@trunk + permissions: + contents: read + secrets: inherit if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} - timeout-minutes: 5 - outputs: - major-wp-version: ${{ steps.major-wp-version.outputs.version }} - php-versions: ${{ steps.php-versions.outputs.versions }} - mysql-versions: ${{ steps.mysql-versions.outputs.versions }} - - steps: - - name: Checkout repository - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 - with: - show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} - - - name: Determine the major WordPress version - id: major-wp-version - run: | - if [ "${{ inputs.wp-version }}" ] && [ "${{ inputs.wp-version }}" != "nightly" ] && [ "${{ inputs.wp-version }}" != "latest" ]; then - echo "version=$(echo "${{ inputs.wp-version }}" | tr '.' '-' | cut -d '-' -f1-2)" >> $GITHUB_OUTPUT - elif [ "${{ inputs.wp-version }}" ]; then - echo "version=$(echo "${{ inputs.wp-version }}")" >> $GITHUB_OUTPUT - else - echo "version=nightly" >> $GITHUB_OUTPUT - fi - - # Look up the major version's specific PHP support policy when a version is provided. - # Otherwise, use the current PHP support policy. - - name: Get supported PHP versions - id: php-versions - run: | - if [ "${{ steps.major-wp-version.outputs.version }}" != "latest" ] && [ "${{ steps.major-wp-version.outputs.version }}" != "nightly" ]; then - echo "versions=$(jq -r '.["${{ steps.major-wp-version.outputs.version }}"] | @json' .version-support-php.json)" >> $GITHUB_OUTPUT - else - echo "versions=$(jq -r '.[ (keys[-1]) ] | @json' .version-support-php.json)" >> $GITHUB_OUTPUT - fi - - # Look up the major version's specific MySQL support policy when a version is provided. - # Otherwise, use the current MySQL support policy. - - name: Get supported MySQL versions - id: mysql-versions - run: | - if [ "${{ steps.major-wp-version.outputs.version }}" != "latest" ] && [ "${{ steps.major-wp-version.outputs.version }}" != "nightly" ]; then - echo "versions=$(jq -r '.["${{ steps.major-wp-version.outputs.version }}"] | @json' .version-support-mysql.json)" >> $GITHUB_OUTPUT - else - echo "versions=$(jq -r '.[ (keys[-1]) ] | @json' .version-support-mysql.json)" >> $GITHUB_OUTPUT - fi + with: + wp-version: ${{ inputs.wp-version }} # Test the WordPress installation process through WP-CLI. # @@ -106,14 +64,14 @@ jobs: runs-on: ${{ matrix.os }} if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} timeout-minutes: 10 - needs: [ build-matrix ] + needs: [ build-test-matrix ] strategy: fail-fast: false matrix: os: [ ubuntu-latest ] - php: ${{ fromJSON( needs.build-matrix.outputs.php-versions ) }} + php: ${{ fromJSON( needs.build-test-matrix.outputs.php-versions ) }} db-type: [ 'mysql' ] - db-version: ${{ fromJSON( needs.build-matrix.outputs.mysql-versions ) }} + db-version: ${{ fromJSON( needs.build-test-matrix.outputs.mysql-versions ) }} multisite: [ false, true ] memcached: [ false ] diff --git a/.github/workflows/reusable-support-json-reader-v1.yml b/.github/workflows/reusable-support-json-reader-v1.yml new file mode 100644 index 0000000000000..2adc15cebdee1 --- /dev/null +++ b/.github/workflows/reusable-support-json-reader-v1.yml @@ -0,0 +1,120 @@ +## +# A reusable workflow that reads the .version-support-*.json files and returns values for use in a +# test matrix based on a given WordPress version. +## +name: Determine test matrix values + +on: + workflow_call: + inputs: + wp-version: + description: 'The WordPress version to test . Accepts major and minor versions, "latest", or "nightly". Major releases must not end with ".0".' + type: string + default: 'nightly' + outputs: + major-wp-version: + description: "The major WordPress version based on the version provided in wp-version" + value: ${{ jobs.major-wp-version.outputs.version }} + php-versions: + description: "The PHP versions to test for the given wp-version" + value: ${{ jobs.php-versions.outputs.versions }} + mysql-versions: + description: "The MySQL versions to test for the given wp-version" + value: ${{ jobs.mysql-versions.outputs.versions }} + +jobs: + # Determines the major version of WordPress being tested. + # + # The data in the JSON files are indexed by major version, so this is used to look up the appropriate support policy. + # + # Performs the following steps: + # - Checks out the repository + # - Returns the major WordPress version as an output based on the value passed to the wp-version input. + major-wp-version: + name: Determine major WordPress version + runs-on: ubuntu-latest + if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} + timeout-minutes: 5 + outputs: + version: ${{ steps.major-wp-version.outputs.version }} + + steps: + - name: Checkout repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + + - name: Determine the major WordPress version + id: major-wp-version + run: | + if [ "${{ inputs.wp-version }}" ] && [ "${{ inputs.wp-version }}" != "nightly" ] && [ "${{ inputs.wp-version }}" != "latest" ]; then + echo "version=$(echo "${{ inputs.wp-version }}" | tr '.' '-' | cut -d '-' -f1-2)" >> $GITHUB_OUTPUT + elif [ "${{ inputs.wp-version }}" ]; then + echo "version=$(echo "${{ inputs.wp-version }}")" >> $GITHUB_OUTPUT + else + echo "version=nightly" >> $GITHUB_OUTPUT + fi + + # Determines the versions of PHP supported for a version of WordPress. + # + # Performs the following steps: + # - Checks out the repository + # - Returns the versions of PHP supported for the major version of WordPress by parsing the + # .version-support-php.json file and returning the values in that version's index. + php-versions: + name: Determine PHP versions + runs-on: ubuntu-latest + if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} + needs: [ major-wp-version ] + timeout-minutes: 5 + outputs: + versions: ${{ steps.php-versions.outputs.versions }} + + steps: + - name: Checkout repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + + # Look up the major version's specific PHP support policy when a version is provided. + # Otherwise, use the current PHP support policy. + - name: Get supported PHP versions + id: php-versions + run: | + if [ "${{ needs.major-wp-version.outputs.version }}" != "latest" ] && [ "${{ needs.major-wp-version.outputs.version }}" != "nightly" ]; then + echo "versions=$(jq -r '.["${{ needs.major-wp-version.outputs.version }}"] | @json' .version-support-php.json)" >> $GITHUB_OUTPUT + else + echo "versions=$(jq -r '.[ (keys[-1]) ] | @json' .version-support-php.json)" >> $GITHUB_OUTPUT + fi + + # Determines the versions of MySQL supported for a version of WordPress. + # + # Performs the following steps: + # - Checks out the repository + # - Returns the versions of MySQL supported for the major version of WordPress by parsing the + # .version-support-mysql.json file and returning the values in that version's index. + mysql-versions: + name: Determine MySQL versions + runs-on: ubuntu-latest + if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} + needs: [ major-wp-version ] + timeout-minutes: 5 + outputs: + versions: ${{ steps.mysql-versions.outputs.versions }} + + steps: + - name: Checkout repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + + # Look up the major version's specific MySQL support policy when a version is provided. + # Otherwise, use the current MySQL support policy. + - name: Get supported MySQL versions + id: mysql-versions + run: | + if [ "${{ needs.major-wp-version.outputs.version }}" != "latest" ] && [ "${{ needs.major-wp-version.outputs.version }}" != "nightly" ]; then + echo "versions=$(jq -r '.["${{ needs.major-wp-version.outputs.version }}"] | @json' .version-support-mysql.json)" >> $GITHUB_OUTPUT + else + echo "versions=$(jq -r '.[ (keys[-1]) ] | @json' .version-support-mysql.json)" >> $GITHUB_OUTPUT + fi From af1682d4d327655781bc0b18db0f5f31f06d9b2b Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Fri, 22 Nov 2024 19:17:35 +0000 Subject: [PATCH 042/323] Coding Standards: Explicitly return `null` instead of coercing `void`. This addresses two instances where a function that is documented as returning `{someType}|null` doesn't explicitly return `null`. Affected functions: * `array_key_first()` * `WP_REST_Posts_Controller::handle_terms()` Follow-up to [38832], [52038]. Props justlevine. See #52217. git-svn-id: https://develop.svn.wordpress.org/trunk@59453 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/compat.php | 4 ++++ .../rest-api/endpoints/class-wp-rest-posts-controller.php | 2 ++ 2 files changed, 6 insertions(+) diff --git a/src/wp-includes/compat.php b/src/wp-includes/compat.php index 531c76fe1b2b3..6a393f7c984e3 100644 --- a/src/wp-includes/compat.php +++ b/src/wp-includes/compat.php @@ -415,6 +415,10 @@ function is_countable( $value ) { * is not empty; `null` otherwise. */ function array_key_first( array $array ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.arrayFound + if ( empty( $array ) ) { + return null; + } + foreach ( $array as $key => $value ) { return $key; } diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php index c4db4871df644..8852519ec45c9 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php @@ -1649,6 +1649,8 @@ protected function handle_terms( $post_id, $request ) { return $result; } } + + return null; } /** From aa2b4fd6eded4e229335765c6f87ffc2353f5638 Mon Sep 17 00:00:00 2001 From: Andrew Ozz Date: Fri, 22 Nov 2024 20:08:55 +0000 Subject: [PATCH 043/323] Editor: Fix selecting/deselecting multiple unwanted categories when clicking on a Category checkbox on the old Edit Post screen. Props ffffelix, desrosj, ironprogrammer, neotrope, narenin, zaoyao, im3dabasia1, cbravobernal, azaozz. Fixes #62504. git-svn-id: https://develop.svn.wordpress.org/trunk@59454 602fd350-edb4-49c9-b593-d223f7449a82 --- src/js/_enqueues/admin/post.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/_enqueues/admin/post.js b/src/js/_enqueues/admin/post.js index 95c2fa0400fe7..3f8b42e261e8b 100644 --- a/src/js/_enqueues/admin/post.js +++ b/src/js/_enqueues/admin/post.js @@ -660,7 +660,7 @@ jQuery( function($) { function() { var t = $(this), c = t.is(':checked'), id = t.val(); if ( id && t.parents('#taxonomy-'+taxonomy).length ) { - $('input[id^="in-' + taxonomy + '-' + id + '"]').prop('checked', c); + $('input#in-' + taxonomy + '-' + id + ', input[id^="in-' + taxonomy + '-' + id + '-"]').prop('checked', c); $('input#in-popular-' + taxonomy + '-' + id).prop('checked', c); } } From 2d9937a61c1279a2c8ba3f586fb5b9ee1c103c55 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Sat, 23 Nov 2024 22:56:05 +0000 Subject: [PATCH 044/323] Coding Standards: Replace usage of deprecated `wp_get_duotone_filter_svg()`. This updates `WP_Theme_JSON::get_svg_filters()` to use `WP_Duotone::get_filter_svg_from_preset()` instead of the `wp_get_duotone_filter_svg()` function, deprecated in WordPress 6.3. Follow-up to [52757], [56101]. Props justlevine. See #52217. git-svn-id: https://develop.svn.wordpress.org/trunk@59455 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-theme-json.php | 2 +- src/wp-includes/deprecated.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/class-wp-theme-json.php b/src/wp-includes/class-wp-theme-json.php index 7885f27b420c5..d87d3c5c0124d 100644 --- a/src/wp-includes/class-wp-theme-json.php +++ b/src/wp-includes/class-wp-theme-json.php @@ -3325,7 +3325,7 @@ public function get_svg_filters( $origins ) { continue; } foreach ( $duotone_presets[ $origin ] as $duotone_preset ) { - $filters .= wp_get_duotone_filter_svg( $duotone_preset ); + $filters .= WP_Duotone::get_filter_svg_from_preset( $duotone_preset ); } } } diff --git a/src/wp-includes/deprecated.php b/src/wp-includes/deprecated.php index 121a070656d58..348267b6a5b80 100644 --- a/src/wp-includes/deprecated.php +++ b/src/wp-includes/deprecated.php @@ -5190,7 +5190,7 @@ function wp_get_duotone_filter_property( $preset ) { * Returns the duotone filter SVG string for the preset. * * @since 5.9.1 - * @deprecated 6.3.0 + * @deprecated 6.3.0 Use WP_Duotone::get_filter_svg_from_preset() instead. * * @access private * @@ -5198,7 +5198,7 @@ function wp_get_duotone_filter_property( $preset ) { * @return string Duotone SVG filter. */ function wp_get_duotone_filter_svg( $preset ) { - _deprecated_function( __FUNCTION__, '6.3.0' ); + _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Duotone::get_filter_svg_from_preset()' ); return WP_Duotone::get_filter_svg_from_preset( $preset ); } From e80aa0038b80e06dbf4eb76c903925bb2e9f594d Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Sun, 24 Nov 2024 18:35:44 +0000 Subject: [PATCH 045/323] Coding Standards: Remove extra `unset()` in `rest_handle_options_request()`. `$args` is defined in the immediately preceding code block, and only contains non-integer keys, so there is never an `$args[0]` to unset. Follow-up to [44933]. Props justlevine. See #52217. git-svn-id: https://develop.svn.wordpress.org/trunk@59456 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/rest-api.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/wp-includes/rest-api.php b/src/wp-includes/rest-api.php index 242b317ca1fc7..401a3b9f1725a 100644 --- a/src/wp-includes/rest-api.php +++ b/src/wp-includes/rest-api.php @@ -818,9 +818,6 @@ function rest_handle_options_request( $response, $handler, $request ) { } foreach ( $endpoints as $endpoint ) { - // Remove the redundant preg_match() argument. - unset( $args[0] ); - $request->set_url_params( $args ); $request->set_attributes( $endpoint ); } From 27c566f1ac6d587b9d2d72a279e71a14c4763454 Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Mon, 25 Nov 2024 10:08:05 +0000 Subject: [PATCH 046/323] REST API: Remove trailing slashes when preloading requests and there is a query string. Follow-up to [51648], see #51636. Props antonvlasenko, swissspidy, spacedmonkey. Fixes #57048. git-svn-id: https://develop.svn.wordpress.org/trunk@59457 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/rest-api.php | 9 +++++++ tests/phpunit/tests/rest-api.php | 46 +++++++++++++++++++++----------- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/wp-includes/rest-api.php b/src/wp-includes/rest-api.php index 401a3b9f1725a..c990f11adaebd 100644 --- a/src/wp-includes/rest-api.php +++ b/src/wp-includes/rest-api.php @@ -2935,6 +2935,7 @@ function rest_preload_api_request( $memo, $path ) { } } + // Remove trailing slashes at the end of the REST API path (query part). $path = untrailingslashit( $path ); if ( empty( $path ) ) { $path = '/'; @@ -2945,6 +2946,14 @@ function rest_preload_api_request( $memo, $path ) { return $memo; } + if ( isset( $path_parts['path'] ) && '/' !== $path_parts['path'] ) { + // Remove trailing slashes from the "path" part of the REST API path. + $path_parts['path'] = untrailingslashit( $path_parts['path'] ); + $path = str_contains( $path, '?' ) ? + $path_parts['path'] . '?' . ( $path_parts['query'] ?? '' ) : + $path_parts['path']; + } + $request = new WP_REST_Request( $method, $path_parts['path'] ); if ( ! empty( $path_parts['query'] ) ) { parse_str( $path_parts['query'], $query_params ); diff --git a/tests/phpunit/tests/rest-api.php b/tests/phpunit/tests/rest-api.php index 7b0ee18f68b66..472e6a9b9d819 100644 --- a/tests/phpunit/tests/rest-api.php +++ b/tests/phpunit/tests/rest-api.php @@ -960,30 +960,46 @@ public function test_rest_preload_api_request_with_method() { } /** + * @dataProvider data_rest_preload_api_request_removes_trailing_slashes + * * @ticket 51636 + * @ticket 57048 + * + * @param string $preload_path The path to preload. + * @param array|string $expected_preload_path Expected path after preloading. */ - public function test_rest_preload_api_request_removes_trailing_slashes() { + public function test_rest_preload_api_request_removes_trailing_slashes( $preload_path, $expected_preload_path ) { $rest_server = $GLOBALS['wp_rest_server']; $GLOBALS['wp_rest_server'] = null; - $preload_paths = array( - '/wp/v2/types//', - array( '/wp/v2/media///', 'OPTIONS' ), - '////', - ); - - $preload_data = array_reduce( - $preload_paths, - 'rest_preload_api_request', - array() - ); - - $this->assertSame( array_keys( $preload_data ), array( '/wp/v2/types', 'OPTIONS', '/' ) ); - $this->assertArrayHasKey( '/wp/v2/media', $preload_data['OPTIONS'] ); + $actual_preload_path = rest_preload_api_request( array(), $preload_path ); + if ( '' !== $preload_path ) { + $actual_preload_path = key( $actual_preload_path ); + } + $this->assertSame( $expected_preload_path, $actual_preload_path ); $GLOBALS['wp_rest_server'] = $rest_server; } + /** + * Data provider. + * + * @return array + */ + public static function data_rest_preload_api_request_removes_trailing_slashes() { + return array( + 'no query part' => array( '/wp/v2/types//', '/wp/v2/types' ), + 'no query part, more slashes' => array( '/wp/v2/media///', '/wp/v2/media' ), + 'only slashes' => array( '////', '/' ), + 'empty path' => array( '', array() ), + 'no query parameters' => array( '/wp/v2/types//?////', '/wp/v2/types?' ), + 'no query parameters, with slashes' => array( '/wp/v2/types//?fields////', '/wp/v2/types?fields' ), + 'query parameters with no values' => array( '/wp/v2/types//?fields=////', '/wp/v2/types?fields=' ), + 'single query parameter' => array( '/wp/v2/types//?_fields=foo,bar////', '/wp/v2/types?_fields=foo,bar' ), + 'multiple query parameters' => array( '/wp/v2/types////?_fields=foo,bar&limit=1000////', '/wp/v2/types?_fields=foo,bar&limit=1000' ), + ); + } + /** * @ticket 40614 */ From 1aa41dea3345c57cffce9059bbad728c86d1471a Mon Sep 17 00:00:00 2001 From: bernhard-reiter Date: Mon, 25 Nov 2024 11:14:37 +0000 Subject: [PATCH 047/323] REST API: Terms: Respect taxonomy's default query args. It is possible to supply a set of default query `args` to `register_taxonomy()` which will be used when querying a list of terms -- for example, `orderby` in order to specify how the resulting list of terms should be sorted. The Terms REST API controller previously respected these default query args only if the request included a post ID. This changeset makes it so that the default args will also be respected if no post ID is provided. Props bernhard-reiter, jsnajdr. Fixes #62500. git-svn-id: https://develop.svn.wordpress.org/trunk@59458 602fd350-edb4-49c9-b593-d223f7449a82 --- .../class-wp-rest-terms-controller.php | 17 +++++++ .../tests/rest-api/rest-tags-controller.php | 49 +++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php index 78c9d1ca2b0d8..455c83a68d605 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php @@ -227,6 +227,7 @@ public function get_items_permissions_check( $request ) { * Retrieves terms associated with a taxonomy. * * @since 4.7.0 + * @since 6.8.0 Respect default query arguments set for the taxonomy upon registration. * * @param WP_REST_Request $request Full details about the request. * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. @@ -295,6 +296,22 @@ public function get_items( $request ) { } } + /* + * When a taxonomy is registered with an 'args' array, + * those params override the `$args` passed to this function. + * + * We only need to do this if no `post` argument is provided. + * Otherwise, terms will be fetched using `wp_get_object_terms()`, + * which respects the default query arguments set for the taxonomy. + */ + if ( + empty( $prepared_args['post'] ) && + isset( $taxonomy_obj->args ) && + is_array( $taxonomy_obj->args ) + ) { + $prepared_args = array_merge( $prepared_args, $taxonomy_obj->args ); + } + /** * Filters get_terms() arguments when querying terms via the REST API. * diff --git a/tests/phpunit/tests/rest-api/rest-tags-controller.php b/tests/phpunit/tests/rest-api/rest-tags-controller.php index 843faadea3992..cd593578a9836 100644 --- a/tests/phpunit/tests/rest-api/rest-tags-controller.php +++ b/tests/phpunit/tests/rest-api/rest-tags-controller.php @@ -482,6 +482,55 @@ public function test_get_items_custom_tax_post_args() { $this->assertSame( 'Cape', $data[0]['name'] ); } + /** + * @ticket 62500 + */ + public function test_get_items_custom_tax_without_post_arg_respects_tax_query_args() { + register_taxonomy( + 'batman', + 'post', + array( + 'show_in_rest' => true, + 'sort' => true, + 'args' => array( + 'order' => 'DESC', + 'orderby' => 'name', + ), + ) + ); + $controller = new WP_REST_Terms_Controller( 'batman' ); + $controller->register_routes(); + $term1 = self::factory()->term->create( + array( + 'name' => 'Cycle', + 'taxonomy' => 'batman', + ) + ); + $term2 = self::factory()->term->create( + array( + 'name' => 'Pod', + 'taxonomy' => 'batman', + ) + ); + $term3 = self::factory()->term->create( + array( + 'name' => 'Cave', + 'taxonomy' => 'batman', + ) + ); + + $request = new WP_REST_Request( 'GET', '/wp/v2/batman' ); + $response = rest_get_server()->dispatch( $request ); + $this->assertSame( 200, $response->get_status() ); + + $data = $response->get_data(); + $this->assertCount( 3, $data ); + $this->assertSame( + array( 'Pod', 'Cycle', 'Cave' ), + array_column( $data, 'name' ) + ); + } + public function test_get_items_search_args() { $tag1 = self::factory()->tag->create( array( 'name' => 'Apple' ) ); $tag2 = self::factory()->tag->create( array( 'name' => 'Banana' ) ); From 75c587f022116c17d03bbbf56b8e4db42ed1ebf4 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Mon, 25 Nov 2024 19:01:57 +0000 Subject: [PATCH 048/323] Coding Standards: Cast `$expired` to an integer in `wp_validate_auth_cookie()`. This resolves an issue where the string `$expired` value is used both in a comparison and addition with integer values. Follow-up to [6387], [28424], [45590]. Props justlevine. See #52217. git-svn-id: https://develop.svn.wordpress.org/trunk@59459 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/pluggable.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/pluggable.php b/src/wp-includes/pluggable.php index cc16e8c8bde37..3dd629fa1990c 100644 --- a/src/wp-includes/pluggable.php +++ b/src/wp-includes/pluggable.php @@ -710,9 +710,10 @@ function wp_validate_auth_cookie( $cookie = '', $scheme = '' ) { $username = $cookie_elements['username']; $hmac = $cookie_elements['hmac']; $token = $cookie_elements['token']; - $expired = $cookie_elements['expiration']; $expiration = $cookie_elements['expiration']; + $expired = (int) $expiration; + // Allow a grace period for POST and Ajax requests. if ( wp_doing_ajax() || 'POST' === $_SERVER['REQUEST_METHOD'] ) { $expired += HOUR_IN_SECONDS; From bd21a8af90412a7dd98c898d6089171ee085f70c Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Tue, 26 Nov 2024 10:01:08 +0000 Subject: [PATCH 049/323] I18N: Switch locale to admin locale when sending auto update emails. If sending an auto update email to the site administrator's email address, look up if a user with the same email exists and switch to that user's locale. If not, explicitly switches to the site locale. This is a follow-up to [59128] where this was previously added for other types of emails. Props benniledl, swissspidy. Fixes #62496. git-svn-id: https://develop.svn.wordpress.org/trunk@59460 602fd350-edb4-49c9-b593-d223f7449a82 --- .../includes/class-wp-automatic-updater.php | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/wp-admin/includes/class-wp-automatic-updater.php b/src/wp-admin/includes/class-wp-automatic-updater.php index b497b8324d41b..4dccd94ccddbd 100644 --- a/src/wp-admin/includes/class-wp-automatic-updater.php +++ b/src/wp-admin/includes/class-wp-automatic-updater.php @@ -936,6 +936,14 @@ protected function send_email( $type, $core_update, $result = null ) { return; } + $admin_user = get_user_by( 'email', get_site_option( 'admin_email' ) ); + + if ( $admin_user ) { + $switched_locale = switch_to_user_locale( $admin_user->ID ); + } else { + $switched_locale = switch_to_locale( get_locale() ); + } + switch ( $type ) { case 'success': // We updated. /* translators: Site updated notification email subject. 1: Site title, 2: WordPress version. */ @@ -1139,8 +1147,11 @@ protected function send_email( $type, $core_update, $result = null ) { $email = apply_filters( 'auto_core_update_email', $email, $type, $core_update, $result ); wp_mail( $email['to'], wp_specialchars_decode( $email['subject'] ), $email['body'], $email['headers'] ); - } + if ( $switched_locale ) { + restore_previous_locale(); + } + } /** * Checks whether an email should be sent after attempting plugin or theme updates. @@ -1255,6 +1266,14 @@ protected function send_plugin_theme_email( $type, $successful_updates, $failed_ } } + $admin_user = get_user_by( 'email', get_site_option( 'admin_email' ) ); + + if ( $admin_user ) { + $switched_locale = switch_to_user_locale( $admin_user->ID ); + } else { + $switched_locale = switch_to_locale( get_locale() ); + } + $body = array(); $successful_plugins = ( ! empty( $successful_updates['plugin'] ) ); $successful_themes = ( ! empty( $successful_updates['theme'] ) ); @@ -1526,6 +1545,10 @@ protected function send_plugin_theme_email( $type, $successful_updates, $failed_ if ( $result ) { update_option( 'auto_plugin_theme_update_emails', $past_failure_emails ); } + + if ( $switched_locale ) { + restore_previous_locale(); + } } /** @@ -1534,9 +1557,12 @@ protected function send_plugin_theme_email( $type, $successful_updates, $failed_ * @since 3.7.0 */ protected function send_debug_email() { - $update_count = 0; - foreach ( $this->update_results as $type => $updates ) { - $update_count += count( $updates ); + $admin_user = get_user_by( 'email', get_site_option( 'admin_email' ) ); + + if ( $admin_user ) { + $switched_locale = switch_to_user_locale( $admin_user->ID ); + } else { + $switched_locale = switch_to_locale( get_locale() ); } $body = array(); @@ -1715,6 +1741,10 @@ protected function send_debug_email() { $email = apply_filters( 'automatic_updates_debug_email', $email, $failures, $this->update_results ); wp_mail( $email['to'], wp_specialchars_decode( $email['subject'] ), $email['body'], $email['headers'] ); + + if ( $switched_locale ) { + restore_previous_locale(); + } } /** From c344148315693d6592283b67e232e8609169c2f9 Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Tue, 26 Nov 2024 10:14:07 +0000 Subject: [PATCH 050/323] I18N: Load translations just-in-time for custom themes and plugins. In #34114, just-in-time (JIT) translation loading was implemented for projects hosted on WordPress.org. This is now expanded to all other plugins/themes. Projects with a custom `Text Domain` and `Domain Path` header no longer need to call `load_plugin_textdomain()` or `load_theme_textdomain()`. This reduces the risk of calling them too late, after some translation calls already happened, and generally makes it easier to properly internationalize a plugin or theme. This moves the `get_plugin_data()` from `wp-admin/includes/plugin.php` to `wp-includes/functions.php` so it's available during the plugin loading process. Props swissspidy. Fixes #62244. git-svn-id: https://develop.svn.wordpress.org/trunk@59461 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/plugin.php | 215 ------------------ src/wp-includes/functions.php | 215 ++++++++++++++++++ .../class-wp-rest-templates-controller.php | 2 +- src/wp-settings.php | 16 +- 4 files changed, 231 insertions(+), 217 deletions(-) diff --git a/src/wp-admin/includes/plugin.php b/src/wp-admin/includes/plugin.php index de1468352b3d9..0969f956577ed 100644 --- a/src/wp-admin/includes/plugin.php +++ b/src/wp-admin/includes/plugin.php @@ -6,221 +6,6 @@ * @subpackage Administration */ -/** - * Parses the plugin contents to retrieve plugin's metadata. - * - * All plugin headers must be on their own line. Plugin description must not have - * any newlines, otherwise only parts of the description will be displayed. - * The below is formatted for printing. - * - * /* - * Plugin Name: Name of the plugin. - * Plugin URI: The home page of the plugin. - * Description: Plugin description. - * Author: Plugin author's name. - * Author URI: Link to the author's website. - * Version: Plugin version. - * Text Domain: Optional. Unique identifier, should be same as the one used in - * load_plugin_textdomain(). - * Domain Path: Optional. Only useful if the translations are located in a - * folder above the plugin's base path. For example, if .mo files are - * located in the locale folder then Domain Path will be "/locale/" and - * must have the first slash. Defaults to the base folder the plugin is - * located in. - * Network: Optional. Specify "Network: true" to require that a plugin is activated - * across all sites in an installation. This will prevent a plugin from being - * activated on a single site when Multisite is enabled. - * Requires at least: Optional. Specify the minimum required WordPress version. - * Requires PHP: Optional. Specify the minimum required PHP version. - * * / # Remove the space to close comment. - * - * The first 8 KB of the file will be pulled in and if the plugin data is not - * within that first 8 KB, then the plugin author should correct their plugin - * and move the plugin data headers to the top. - * - * The plugin file is assumed to have permissions to allow for scripts to read - * the file. This is not checked however and the file is only opened for - * reading. - * - * @since 1.5.0 - * @since 5.3.0 Added support for `Requires at least` and `Requires PHP` headers. - * @since 5.8.0 Added support for `Update URI` header. - * @since 6.5.0 Added support for `Requires Plugins` header. - * - * @param string $plugin_file Absolute path to the main plugin file. - * @param bool $markup Optional. If the returned data should have HTML markup applied. - * Default true. - * @param bool $translate Optional. If the returned data should be translated. Default true. - * @return array { - * Plugin data. Values will be empty if not supplied by the plugin. - * - * @type string $Name Name of the plugin. Should be unique. - * @type string $PluginURI Plugin URI. - * @type string $Version Plugin version. - * @type string $Description Plugin description. - * @type string $Author Plugin author's name. - * @type string $AuthorURI Plugin author's website address (if set). - * @type string $TextDomain Plugin textdomain. - * @type string $DomainPath Plugin's relative directory path to .mo files. - * @type bool $Network Whether the plugin can only be activated network-wide. - * @type string $RequiresWP Minimum required version of WordPress. - * @type string $RequiresPHP Minimum required version of PHP. - * @type string $UpdateURI ID of the plugin for update purposes, should be a URI. - * @type string $RequiresPlugins Comma separated list of dot org plugin slugs. - * @type string $Title Title of the plugin and link to the plugin's site (if set). - * @type string $AuthorName Plugin author's name. - * } - */ -function get_plugin_data( $plugin_file, $markup = true, $translate = true ) { - - $default_headers = array( - 'Name' => 'Plugin Name', - 'PluginURI' => 'Plugin URI', - 'Version' => 'Version', - 'Description' => 'Description', - 'Author' => 'Author', - 'AuthorURI' => 'Author URI', - 'TextDomain' => 'Text Domain', - 'DomainPath' => 'Domain Path', - 'Network' => 'Network', - 'RequiresWP' => 'Requires at least', - 'RequiresPHP' => 'Requires PHP', - 'UpdateURI' => 'Update URI', - 'RequiresPlugins' => 'Requires Plugins', - // Site Wide Only is deprecated in favor of Network. - '_sitewide' => 'Site Wide Only', - ); - - $plugin_data = get_file_data( $plugin_file, $default_headers, 'plugin' ); - - // Site Wide Only is the old header for Network. - if ( ! $plugin_data['Network'] && $plugin_data['_sitewide'] ) { - /* translators: 1: Site Wide Only: true, 2: Network: true */ - _deprecated_argument( __FUNCTION__, '3.0.0', sprintf( __( 'The %1$s plugin header is deprecated. Use %2$s instead.' ), 'Site Wide Only: true', 'Network: true' ) ); - $plugin_data['Network'] = $plugin_data['_sitewide']; - } - $plugin_data['Network'] = ( 'true' === strtolower( $plugin_data['Network'] ) ); - unset( $plugin_data['_sitewide'] ); - - // If no text domain is defined fall back to the plugin slug. - if ( ! $plugin_data['TextDomain'] ) { - $plugin_slug = dirname( plugin_basename( $plugin_file ) ); - if ( '.' !== $plugin_slug && ! str_contains( $plugin_slug, '/' ) ) { - $plugin_data['TextDomain'] = $plugin_slug; - } - } - - if ( $markup || $translate ) { - $plugin_data = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup, $translate ); - } else { - $plugin_data['Title'] = $plugin_data['Name']; - $plugin_data['AuthorName'] = $plugin_data['Author']; - } - - return $plugin_data; -} - -/** - * Sanitizes plugin data, optionally adds markup, optionally translates. - * - * @since 2.7.0 - * - * @see get_plugin_data() - * - * @access private - * - * @param string $plugin_file Path to the main plugin file. - * @param array $plugin_data An array of plugin data. See get_plugin_data(). - * @param bool $markup Optional. If the returned data should have HTML markup applied. - * Default true. - * @param bool $translate Optional. If the returned data should be translated. Default true. - * @return array Plugin data. Values will be empty if not supplied by the plugin. - * See get_plugin_data() for the list of possible values. - */ -function _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup = true, $translate = true ) { - - // Sanitize the plugin filename to a WP_PLUGIN_DIR relative path. - $plugin_file = plugin_basename( $plugin_file ); - - // Translate fields. - if ( $translate ) { - $textdomain = $plugin_data['TextDomain']; - if ( $textdomain ) { - if ( ! is_textdomain_loaded( $textdomain ) ) { - if ( $plugin_data['DomainPath'] ) { - load_plugin_textdomain( $textdomain, false, dirname( $plugin_file ) . $plugin_data['DomainPath'] ); - } else { - load_plugin_textdomain( $textdomain, false, dirname( $plugin_file ) ); - } - } - } elseif ( 'hello.php' === basename( $plugin_file ) ) { - $textdomain = 'default'; - } - if ( $textdomain ) { - foreach ( array( 'Name', 'PluginURI', 'Description', 'Author', 'AuthorURI', 'Version' ) as $field ) { - if ( ! empty( $plugin_data[ $field ] ) ) { - // phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain - $plugin_data[ $field ] = translate( $plugin_data[ $field ], $textdomain ); - } - } - } - } - - // Sanitize fields. - $allowed_tags_in_links = array( - 'abbr' => array( 'title' => true ), - 'acronym' => array( 'title' => true ), - 'code' => true, - 'em' => true, - 'strong' => true, - ); - - $allowed_tags = $allowed_tags_in_links; - $allowed_tags['a'] = array( - 'href' => true, - 'title' => true, - ); - - /* - * Name is marked up inside tags. Don't allow these. - * Author is too, but some plugins have used here (omitting Author URI). - */ - $plugin_data['Name'] = wp_kses( $plugin_data['Name'], $allowed_tags_in_links ); - $plugin_data['Author'] = wp_kses( $plugin_data['Author'], $allowed_tags ); - - $plugin_data['Description'] = wp_kses( $plugin_data['Description'], $allowed_tags ); - $plugin_data['Version'] = wp_kses( $plugin_data['Version'], $allowed_tags ); - - $plugin_data['PluginURI'] = esc_url( $plugin_data['PluginURI'] ); - $plugin_data['AuthorURI'] = esc_url( $plugin_data['AuthorURI'] ); - - $plugin_data['Title'] = $plugin_data['Name']; - $plugin_data['AuthorName'] = $plugin_data['Author']; - - // Apply markup. - if ( $markup ) { - if ( $plugin_data['PluginURI'] && $plugin_data['Name'] ) { - $plugin_data['Title'] = '' . $plugin_data['Name'] . ''; - } - - if ( $plugin_data['AuthorURI'] && $plugin_data['Author'] ) { - $plugin_data['Author'] = '' . $plugin_data['Author'] . ''; - } - - $plugin_data['Description'] = wptexturize( $plugin_data['Description'] ); - - if ( $plugin_data['Author'] ) { - $plugin_data['Description'] .= sprintf( - /* translators: %s: Plugin author. */ - ' ' . __( 'By %s.' ) . '', - $plugin_data['Author'] - ); - } - } - - return $plugin_data; -} - /** * Gets a list of a plugin's files. * diff --git a/src/wp-includes/functions.php b/src/wp-includes/functions.php index d9303083bfaa9..a4cfa13cd20dc 100644 --- a/src/wp-includes/functions.php +++ b/src/wp-includes/functions.php @@ -6929,6 +6929,221 @@ function get_file_data( $file, $default_headers, $context = '' ) { return $all_headers; } +/** + * Parses the plugin contents to retrieve plugin's metadata. + * + * All plugin headers must be on their own line. Plugin description must not have + * any newlines, otherwise only parts of the description will be displayed. + * The below is formatted for printing. + * + * /* + * Plugin Name: Name of the plugin. + * Plugin URI: The home page of the plugin. + * Description: Plugin description. + * Author: Plugin author's name. + * Author URI: Link to the author's website. + * Version: Plugin version. + * Text Domain: Optional. Unique identifier, should be same as the one used in + * load_plugin_textdomain(). + * Domain Path: Optional. Only useful if the translations are located in a + * folder above the plugin's base path. For example, if .mo files are + * located in the locale folder then Domain Path will be "/locale/" and + * must have the first slash. Defaults to the base folder the plugin is + * located in. + * Network: Optional. Specify "Network: true" to require that a plugin is activated + * across all sites in an installation. This will prevent a plugin from being + * activated on a single site when Multisite is enabled. + * Requires at least: Optional. Specify the minimum required WordPress version. + * Requires PHP: Optional. Specify the minimum required PHP version. + * * / # Remove the space to close comment. + * + * The first 8 KB of the file will be pulled in and if the plugin data is not + * within that first 8 KB, then the plugin author should correct their plugin + * and move the plugin data headers to the top. + * + * The plugin file is assumed to have permissions to allow for scripts to read + * the file. This is not checked however and the file is only opened for + * reading. + * + * @since 1.5.0 + * @since 5.3.0 Added support for `Requires at least` and `Requires PHP` headers. + * @since 5.8.0 Added support for `Update URI` header. + * @since 6.5.0 Added support for `Requires Plugins` header. + * + * @param string $plugin_file Absolute path to the main plugin file. + * @param bool $markup Optional. If the returned data should have HTML markup applied. + * Default true. + * @param bool $translate Optional. If the returned data should be translated. Default true. + * @return array { + * Plugin data. Values will be empty if not supplied by the plugin. + * + * @type string $Name Name of the plugin. Should be unique. + * @type string $PluginURI Plugin URI. + * @type string $Version Plugin version. + * @type string $Description Plugin description. + * @type string $Author Plugin author's name. + * @type string $AuthorURI Plugin author's website address (if set). + * @type string $TextDomain Plugin textdomain. + * @type string $DomainPath Plugin's relative directory path to .mo files. + * @type bool $Network Whether the plugin can only be activated network-wide. + * @type string $RequiresWP Minimum required version of WordPress. + * @type string $RequiresPHP Minimum required version of PHP. + * @type string $UpdateURI ID of the plugin for update purposes, should be a URI. + * @type string $RequiresPlugins Comma separated list of dot org plugin slugs. + * @type string $Title Title of the plugin and link to the plugin's site (if set). + * @type string $AuthorName Plugin author's name. + * } + */ +function get_plugin_data( $plugin_file, $markup = true, $translate = true ) { + + $default_headers = array( + 'Name' => 'Plugin Name', + 'PluginURI' => 'Plugin URI', + 'Version' => 'Version', + 'Description' => 'Description', + 'Author' => 'Author', + 'AuthorURI' => 'Author URI', + 'TextDomain' => 'Text Domain', + 'DomainPath' => 'Domain Path', + 'Network' => 'Network', + 'RequiresWP' => 'Requires at least', + 'RequiresPHP' => 'Requires PHP', + 'UpdateURI' => 'Update URI', + 'RequiresPlugins' => 'Requires Plugins', + // Site Wide Only is deprecated in favor of Network. + '_sitewide' => 'Site Wide Only', + ); + + $plugin_data = get_file_data( $plugin_file, $default_headers, 'plugin' ); + + // Site Wide Only is the old header for Network. + if ( ! $plugin_data['Network'] && $plugin_data['_sitewide'] ) { + /* translators: 1: Site Wide Only: true, 2: Network: true */ + _deprecated_argument( __FUNCTION__, '3.0.0', sprintf( __( 'The %1$s plugin header is deprecated. Use %2$s instead.' ), 'Site Wide Only: true', 'Network: true' ) ); + $plugin_data['Network'] = $plugin_data['_sitewide']; + } + $plugin_data['Network'] = ( 'true' === strtolower( $plugin_data['Network'] ) ); + unset( $plugin_data['_sitewide'] ); + + // If no text domain is defined fall back to the plugin slug. + if ( ! $plugin_data['TextDomain'] ) { + $plugin_slug = dirname( plugin_basename( $plugin_file ) ); + if ( '.' !== $plugin_slug && ! str_contains( $plugin_slug, '/' ) ) { + $plugin_data['TextDomain'] = $plugin_slug; + } + } + + if ( $markup || $translate ) { + $plugin_data = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup, $translate ); + } else { + $plugin_data['Title'] = $plugin_data['Name']; + $plugin_data['AuthorName'] = $plugin_data['Author']; + } + + return $plugin_data; +} + +/** + * Sanitizes plugin data, optionally adds markup, optionally translates. + * + * @since 2.7.0 + * + * @see get_plugin_data() + * + * @access private + * + * @param string $plugin_file Path to the main plugin file. + * @param array $plugin_data An array of plugin data. See get_plugin_data(). + * @param bool $markup Optional. If the returned data should have HTML markup applied. + * Default true. + * @param bool $translate Optional. If the returned data should be translated. Default true. + * @return array Plugin data. Values will be empty if not supplied by the plugin. + * See get_plugin_data() for the list of possible values. + */ +function _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup = true, $translate = true ) { + + // Sanitize the plugin filename to a WP_PLUGIN_DIR relative path. + $plugin_file = plugin_basename( $plugin_file ); + + // Translate fields. + if ( $translate ) { + $textdomain = $plugin_data['TextDomain']; + if ( $textdomain ) { + if ( ! is_textdomain_loaded( $textdomain ) ) { + if ( $plugin_data['DomainPath'] ) { + load_plugin_textdomain( $textdomain, false, dirname( $plugin_file ) . $plugin_data['DomainPath'] ); + } else { + load_plugin_textdomain( $textdomain, false, dirname( $plugin_file ) ); + } + } + } elseif ( 'hello.php' === basename( $plugin_file ) ) { + $textdomain = 'default'; + } + if ( $textdomain ) { + foreach ( array( 'Name', 'PluginURI', 'Description', 'Author', 'AuthorURI', 'Version' ) as $field ) { + if ( ! empty( $plugin_data[ $field ] ) ) { + // phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain + $plugin_data[ $field ] = translate( $plugin_data[ $field ], $textdomain ); + } + } + } + } + + // Sanitize fields. + $allowed_tags_in_links = array( + 'abbr' => array( 'title' => true ), + 'acronym' => array( 'title' => true ), + 'code' => true, + 'em' => true, + 'strong' => true, + ); + + $allowed_tags = $allowed_tags_in_links; + $allowed_tags['a'] = array( + 'href' => true, + 'title' => true, + ); + + /* + * Name is marked up inside tags. Don't allow these. + * Author is too, but some plugins have used here (omitting Author URI). + */ + $plugin_data['Name'] = wp_kses( $plugin_data['Name'], $allowed_tags_in_links ); + $plugin_data['Author'] = wp_kses( $plugin_data['Author'], $allowed_tags ); + + $plugin_data['Description'] = wp_kses( $plugin_data['Description'], $allowed_tags ); + $plugin_data['Version'] = wp_kses( $plugin_data['Version'], $allowed_tags ); + + $plugin_data['PluginURI'] = esc_url( $plugin_data['PluginURI'] ); + $plugin_data['AuthorURI'] = esc_url( $plugin_data['AuthorURI'] ); + + $plugin_data['Title'] = $plugin_data['Name']; + $plugin_data['AuthorName'] = $plugin_data['Author']; + + // Apply markup. + if ( $markup ) { + if ( $plugin_data['PluginURI'] && $plugin_data['Name'] ) { + $plugin_data['Title'] = '' . $plugin_data['Name'] . ''; + } + + if ( $plugin_data['AuthorURI'] && $plugin_data['Author'] ) { + $plugin_data['Author'] = '' . $plugin_data['Author'] . ''; + } + + $plugin_data['Description'] = wptexturize( $plugin_data['Description'] ); + + if ( $plugin_data['Author'] ) { + $plugin_data['Description'] .= sprintf( + /* translators: %s: Plugin author. */ + ' ' . __( 'By %s.' ) . '', + $plugin_data['Author'] + ); + } + } + + return $plugin_data; +} + /** * Returns true. * diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-templates-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-templates-controller.php index 43780fb4e677b..267f40e77fd0f 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-templates-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-templates-controller.php @@ -872,7 +872,7 @@ private static function get_wp_templates_author_text_field( $template_object ) { $theme_name = wp_get_theme( $template_object->theme )->get( 'Name' ); return empty( $theme_name ) ? $template_object->theme : $theme_name; case 'plugin': - if ( ! function_exists( 'get_plugins' ) || ! function_exists( 'get_plugin_data' ) ) { + if ( ! function_exists( 'get_plugins' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } if ( isset( $template_object->plugin ) ) { diff --git a/src/wp-settings.php b/src/wp-settings.php index 62ba4d5dee6ca..98ab4d68d0efc 100644 --- a/src/wp-settings.php +++ b/src/wp-settings.php @@ -534,8 +534,19 @@ * @param string $plugin Full path to the plugin's main file. */ do_action( 'plugin_loaded', $plugin ); + + $plugin_data = get_plugin_data( $plugin, false, false ); + + $textdomain = $plugin_data['TextDomain']; + if ( $textdomain ) { + if ( $plugin_data['DomainPath'] ) { + $GLOBALS['wp_textdomain_registry']->set_custom_path( $textdomain, dirname( $plugin ) . $plugin_data['DomainPath'] ); + } else { + $GLOBALS['wp_textdomain_registry']->set_custom_path( $textdomain, dirname( $plugin ) ); + } + } } -unset( $plugin, $_wp_plugin_file ); +unset( $plugin, $_wp_plugin_file, $plugin_data, $textdomain ); // Load pluggable functions. require ABSPATH . WPINC . '/pluggable.php'; @@ -671,6 +682,9 @@ if ( file_exists( $theme . '/functions.php' ) ) { include $theme . '/functions.php'; } + + $theme = wp_get_theme( basename( $theme ) ); + $theme->load_textdomain(); } unset( $theme ); From 520e61dd75356edd1cba85f263767ad4a581e22d Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Tue, 26 Nov 2024 21:15:31 +0000 Subject: [PATCH 051/323] Coding Standards: Cast `wp_count_terms()` result to `int` before using in `ceil()`. This addresses two instances of the (numeric string) return value from `wp_count_terms()` being used directly in `ceil()`, which expects an `int|float`. Affected methods: * `WP_Sitemaps_Taxonomies::get_max_num_pages()` * `wp_nav_menu_item_taxonomy_meta_box()` Reference: [https://www.php.net/manual/en/function.ceil.php PHP Manual: ceil()]. Follow-up to [14248], [14291], [14569], [14943], [48072], [57648]. Props justlevine. See #52217. git-svn-id: https://develop.svn.wordpress.org/trunk@59462 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/nav-menu.php | 2 +- .../sitemaps/providers/class-wp-sitemaps-taxonomies.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-admin/includes/nav-menu.php b/src/wp-admin/includes/nav-menu.php index 5ba3276b3aea5..c3b1244f47fd9 100644 --- a/src/wp-admin/includes/nav-menu.php +++ b/src/wp-admin/includes/nav-menu.php @@ -875,7 +875,7 @@ function wp_nav_menu_item_taxonomy_meta_box( $data_object, $box ) { } $num_pages = (int) ceil( - wp_count_terms( + (int) wp_count_terms( array_merge( $args, array( diff --git a/src/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php b/src/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php index 5571ff4ed95f3..0c53e95a42d6c 100644 --- a/src/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php +++ b/src/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php @@ -171,7 +171,7 @@ public function get_max_num_pages( $object_subtype = '' ) { $term_count = wp_count_terms( $this->get_taxonomies_query_args( $taxonomy ) ); - return (int) ceil( $term_count / wp_sitemaps_get_max_urls( $this->object_type ) ); + return (int) ceil( (int) $term_count / wp_sitemaps_get_max_urls( $this->object_type ) ); } /** From 6ed24099457f33c6e929a1eb9ce5f91000cd3305 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Greg=20Zi=C3=83=C2=B3=C3=85=E2=80=9Akowski?= Date: Wed, 27 Nov 2024 09:52:21 +0000 Subject: [PATCH 052/323] HTML API: Remove unused processor state context_node property The HTML Processor State `context_node` is redundant and can be deprecated. The property has been superseded by `WP_HTML_Processor->context_node` since [58304]. Props jonsurrell, gziolo. Fixes #62518. git-svn-id: https://develop.svn.wordpress.org/trunk@59463 602fd350-edb4-49c9-b593-d223f7449a82 --- .../html-api/class-wp-html-processor-state.php | 5 ++--- src/wp-includes/html-api/class-wp-html-processor.php | 12 +----------- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/src/wp-includes/html-api/class-wp-html-processor-state.php b/src/wp-includes/html-api/class-wp-html-processor-state.php index b7cdd347ca85b..b257aa809da75 100644 --- a/src/wp-includes/html-api/class-wp-html-processor-state.php +++ b/src/wp-includes/html-api/class-wp-html-processor-state.php @@ -360,10 +360,9 @@ class WP_HTML_Processor_State { * Context node initializing fragment parser, if created as a fragment parser. * * @since 6.4.0 + * @deprecated 6.8.0 WP_HTML_Processor tracks the context_node internally. * - * @see https://html.spec.whatwg.org/#concept-frag-parse-context - * - * @var [string, array]|null + * @var null */ public $context_node = null; diff --git a/src/wp-includes/html-api/class-wp-html-processor.php b/src/wp-includes/html-api/class-wp-html-processor.php index 4bdb75fcac3eb..48f7d7fe8c781 100644 --- a/src/wp-includes/html-api/class-wp-html-processor.php +++ b/src/wp-includes/html-api/class-wp-html-processor.php @@ -298,7 +298,6 @@ public static function create_fragment( $html, $context = '', $encoding = } $processor = new static( $html, self::CONSTRUCTOR_UNLOCK_CODE ); - $processor->state->context_node = array( 'BODY', array() ); $processor->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY; $processor->state->encoding = $encoding; $processor->state->encoding_confidence = 'certain'; @@ -317,7 +316,7 @@ public static function create_fragment( $html, $context = '', $encoding = $context_node = new WP_HTML_Token( 'context-node', - $processor->state->context_node[0], + 'BODY', false ); @@ -492,15 +491,6 @@ public function create_fragment_at_current_node( string $html ) { $fragment_processor->context_node->bookmark_name = 'context-node'; $fragment_processor->context_node->on_destroy = null; - $fragment_processor->state->context_node = array( $fragment_processor->context_node->node_name, array() ); - - $attribute_names = $this->get_attribute_names_with_prefix( '' ); - if ( null !== $attribute_names ) { - foreach ( $attribute_names as $name ) { - $fragment_processor->state->context_node[1][ $name ] = $this->get_attribute( $name ); - } - } - $fragment_processor->breadcrumbs = array( 'HTML', $fragment_processor->context_node->node_name ); if ( 'TEMPLATE' === $fragment_processor->context_node->node_name ) { From 9840f032815c0f427ae729a02d038cd5b0d2c919 Mon Sep 17 00:00:00 2001 From: Carlos Bravo Date: Wed, 27 Nov 2024 09:55:53 +0000 Subject: [PATCH 053/323] HTML API: Recognize all uppercase tag names in tag processor. Fixes a missing "D" in the character list used by strspn to find tag openers, causing tags starting with D to be skipped by the tag processor in some circumstances. Follow-up to [58613]. Props jonsurrell, santosguillamot, wongjn, cbravobernal. Fixes #62522. git-svn-id: https://develop.svn.wordpress.org/trunk@59464 602fd350-edb4-49c9-b593-d223f7449a82 --- .../html-api/class-wp-html-tag-processor.php | 2 +- .../tests/html-api/wpHtmlTagProcessor.php | 62 +++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/html-api/class-wp-html-tag-processor.php b/src/wp-includes/html-api/class-wp-html-tag-processor.php index e2632c80f6da5..39390621e86a6 100644 --- a/src/wp-includes/html-api/class-wp-html-tag-processor.php +++ b/src/wp-includes/html-api/class-wp-html-tag-processor.php @@ -1668,7 +1668,7 @@ private function parse_next_tag(): bool { * * @see https://html.spec.whatwg.org/#tag-open-state */ - if ( 1 !== strspn( $html, '!/?abcdefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ', $at + 1, 1 ) ) { + if ( 1 !== strspn( $html, '!/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1, 1 ) ) { ++$at; continue; } diff --git a/tests/phpunit/tests/html-api/wpHtmlTagProcessor.php b/tests/phpunit/tests/html-api/wpHtmlTagProcessor.php index 393fd2cda06db..cd8faee4ed6a4 100644 --- a/tests/phpunit/tests/html-api/wpHtmlTagProcessor.php +++ b/tests/phpunit/tests/html-api/wpHtmlTagProcessor.php @@ -2984,4 +2984,66 @@ public function test_doctype_doc_name() { $this->assertNull( $doctype->public_identifier ); $this->assertNull( $doctype->system_identifier ); } + + /** + * @ticket 62522 + * + * @dataProvider data_alphabet_by_characters_lowercase + */ + public function test_recognizes_lowercase_tag_name( string $char ) { + /* + * The spacing in the HTML string is important to the problematic + * codepath in ticket #62522. + */ + $html = " <{$char}> "; + $processor = new WP_HTML_Tag_Processor( $html ); + $this->assertTrue( $processor->next_tag(), "Failed to find open tag in '{$html}'." ); + $this->assertTrue( + $processor->next_tag( array( 'tag_closers' => 'visit' ) ), + "Failed to find close tag in '{$html}'." + ); + } + + /** + * @ticket 62522 + * + * @dataProvider data_alphabet_by_characters_uppercase + */ + public function test_recognizes_uppercase_tag_name( string $char ) { + /* + * The spacing in the HTML string is important to the problematic + * codepath in ticket #62522. + */ + $html = " <{$char}> "; + $processor = new WP_HTML_Tag_Processor( $html ); + $this->assertTrue( $processor->next_tag(), "Failed to find open tag in '{$html}'." ); + $this->assertTrue( + $processor->next_tag( array( 'tag_closers' => 'visit' ) ), + "Failed to find close tag in '{$html}'." + ); + } + + /** + * Data provider. + * + * @return Generator + */ + public static function data_alphabet_by_characters_lowercase() { + $char = 'a'; + while ( $char <= 'z' ) { + yield $char => array( $char ); + $char = chr( ord( $char ) + 1 ); + } + } + + /** + * Data provider. + * + * @return Generator + */ + public static function data_alphabet_by_characters_uppercase() { + foreach ( self::data_alphabet_by_characters_lowercase() as $data ) { + yield strtoupper( $data[0] ) => array( strtoupper( $data[0] ) ); + } + } } From b72334e97620733637d05048589b3ef94c7458a0 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Wed, 27 Nov 2024 11:38:10 +0000 Subject: [PATCH 054/323] Coding Standards: Cast `gmdate( 'Z' )` to an integer before addition. This addresses two instances of the (numeric string) `gmdate( 'Z' )` being added to an `int` value. Affected functions: * `upgrade_110()` * `WP_Date_Query::validate_date_values()` Follow-up to [942], [29925], [45424]. Props justlevine. See #52217. git-svn-id: https://develop.svn.wordpress.org/trunk@59465 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/upgrade.php | 2 +- src/wp-includes/class-wp-date-query.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-admin/includes/upgrade.php b/src/wp-admin/includes/upgrade.php index 090a5f1853e6f..068e28b040e33 100644 --- a/src/wp-admin/includes/upgrade.php +++ b/src/wp-admin/includes/upgrade.php @@ -992,7 +992,7 @@ function upgrade_110() { $time_difference = $all_options->time_difference; - $server_time = time() + gmdate( 'Z' ); + $server_time = time() + (int) gmdate( 'Z' ); $weblogger_time = $server_time + $time_difference * HOUR_IN_SECONDS; $gmt_time = time(); diff --git a/src/wp-includes/class-wp-date-query.php b/src/wp-includes/class-wp-date-query.php index b8ae95461c1a9..76b70849493dd 100644 --- a/src/wp-includes/class-wp-date-query.php +++ b/src/wp-includes/class-wp-date-query.php @@ -317,7 +317,7 @@ public function validate_date_values( $date_query = array() ) { $_year = $date_query['year']; } - $max_days_of_year = gmdate( 'z', mktime( 0, 0, 0, 12, 31, $_year ) ) + 1; + $max_days_of_year = (int) gmdate( 'z', mktime( 0, 0, 0, 12, 31, $_year ) ) + 1; } else { // Otherwise we use the max of 366 (leap-year). $max_days_of_year = 366; From e904637059bbb66e1d9215d6664399c2d43cebce Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Wed, 27 Nov 2024 14:28:55 +0000 Subject: [PATCH 055/323] I18N: Do not reuse `$theme` variable name after loading a theme's `functions.php` file. The file could declare its own `$theme` variable, which would override the one used in the `foreach` loop. To prevent this, call `wp_get_theme()` before loading the file and store the instance in a different variable. Props neo2k23, swissspidy. See #62244. git-svn-id: https://develop.svn.wordpress.org/trunk@59466 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-settings.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/wp-settings.php b/src/wp-settings.php index 98ab4d68d0efc..44c04a3a7bead 100644 --- a/src/wp-settings.php +++ b/src/wp-settings.php @@ -679,14 +679,15 @@ // Load the functions for the active theme, for both parent and child theme if applicable. foreach ( wp_get_active_and_valid_themes() as $theme ) { + $wp_theme = wp_get_theme( basename( $theme ) ); + if ( file_exists( $theme . '/functions.php' ) ) { include $theme . '/functions.php'; } - $theme = wp_get_theme( basename( $theme ) ); - $theme->load_textdomain(); + $wp_theme->load_textdomain(); } -unset( $theme ); +unset( $theme, $wp_theme ); /** * Fires after the theme is loaded. From 4b3436968d60fc4dc301f3fe1ac888fbe6d59bce Mon Sep 17 00:00:00 2001 From: bernhard-reiter Date: Wed, 27 Nov 2024 14:33:46 +0000 Subject: [PATCH 056/323] HTML API: Allow more contexts in `create_fragment`. This changeset modifies `WP_HTML_Processor::create_fragment( $html, $context )` to use a full processor and `create_fragment_at_node` instead of the other way around. This makes more sense and makes the main factory methods more clear, where the state required for fragments is set up in `create_fragment_at_node` instead of in both `create_fragment` and `create_fragment_at_current_node`. This allows for more HTML contexts to be provided to the basic `create_fragment` where the provided context HTML is appended to ``, a full processor is created, the last tag opener is found, and a fragment parser is created at that node via `create_fragment_at_current_node`. The HTML5lib tests are updated accordingly to use this new method to create fragments. Props jonsurrell, dmsnell, bernhard-reiter. Fixes #62584. git-svn-id: https://develop.svn.wordpress.org/trunk@59467 602fd350-edb4-49c9-b593-d223f7449a82 --- .../html-api/class-wp-html-processor.php | 126 +++++++++---- .../tests/html-api/wpHtmlProcessor.php | 77 -------- .../wpHtmlProcessorFragmentParsing.php | 178 ++++++++++++++++++ .../html-api/wpHtmlProcessorHtml5lib.php | 98 +++++----- 4 files changed, 307 insertions(+), 172 deletions(-) create mode 100644 tests/phpunit/tests/html-api/wpHtmlProcessorFragmentParsing.php diff --git a/src/wp-includes/html-api/class-wp-html-processor.php b/src/wp-includes/html-api/class-wp-html-processor.php index 48f7d7fe8c781..1be795c5c7de2 100644 --- a/src/wp-includes/html-api/class-wp-html-processor.php +++ b/src/wp-includes/html-api/class-wp-html-processor.php @@ -279,51 +279,62 @@ class WP_HTML_Processor extends WP_HTML_Tag_Processor { * form is provided because a context element may have attributes that * impact the parse, such as with a SCRIPT tag and its `type` attribute. * - * ## Current HTML Support + * Example: + * + * // Usually, snippets of HTML ought to be processed in the default `` context: + * $processor = WP_HTML_Processor::create_fragment( '

Hi

' ); + * + * // Some fragments should be processed in the correct context like this SVG: + * $processor = WP_HTML_Processor::create_fragment( '', '' ); + * + * // This fragment with TD tags should be processed in a TR context: + * $processor = WP_HTML_Processor::create_fragment( + * '123', + * '
' + * ); * - * - The only supported context is ``, which is the default value. - * - The only supported document encoding is `UTF-8`, which is the default value. + * In order to create a fragment processor at the correct location, the + * provided fragment will be processed as part of a full HTML document. + * The processor will search for the last opener tag in the document and + * create a fragment processor at that location. The document will be + * forced into "no-quirks" mode by including the HTML5 doctype. + * + * For advanced usage and precise control over the context element, use + * `WP_HTML_Processor::create_full_processor()` and + * `WP_HTML_Processor::create_fragment_at_current_node()`. + * + * UTF-8 is the only allowed encoding. If working with a document that + * isn't UTF-8, first convert the document to UTF-8, then pass in the + * converted HTML. * * @since 6.4.0 * @since 6.6.0 Returns `static` instead of `self` so it can create subclass instances. + * @since 6.8.0 Can create fragments with any context element. * * @param string $html Input HTML fragment to process. - * @param string $context Context element for the fragment, must be default of ``. + * @param string $context Context element for the fragment. Defaults to ``. * @param string $encoding Text encoding of the document; must be default of 'UTF-8'. * @return static|null The created processor if successful, otherwise null. */ public static function create_fragment( $html, $context = '', $encoding = 'UTF-8' ) { - if ( '' !== $context || 'UTF-8' !== $encoding ) { + $context_processor = static::create_full_parser( "{$context}", $encoding ); + if ( null === $context_processor ) { return null; } - $processor = new static( $html, self::CONSTRUCTOR_UNLOCK_CODE ); - $processor->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_IN_BODY; - $processor->state->encoding = $encoding; - $processor->state->encoding_confidence = 'certain'; - - // @todo Create "fake" bookmarks for non-existent but implied nodes. - $processor->bookmarks['root-node'] = new WP_HTML_Span( 0, 0 ); - $processor->bookmarks['context-node'] = new WP_HTML_Span( 0, 0 ); - - $root_node = new WP_HTML_Token( - 'root-node', - 'HTML', - false - ); - - $processor->state->stack_of_open_elements->push( $root_node ); - - $context_node = new WP_HTML_Token( - 'context-node', - 'BODY', - false - ); + while ( $context_processor->next_tag() ) { + $context_processor->set_bookmark( 'final_node' ); + } - $processor->context_node = $context_node; - $processor->breadcrumbs = array( 'HTML', $context_node->node_name ); + if ( + ! $context_processor->has_bookmark( 'final_node' ) || + ! $context_processor->seek( 'final_node' ) + ) { + _doing_it_wrong( __METHOD__, __( 'No valid context element was detected.' ), '6.8.0' ); + return null; + } - return $processor; + return $context_processor->create_fragment_at_current_node( $html ); } /** @@ -333,9 +344,9 @@ public static function create_fragment( $html, $context = '', $encoding = * entire HTML document from start to finish. Consider a fragment parser with * a context node of ``. * - * Since UTF-8 is the only currently-accepted charset, if working with a - * document that isn't UTF-8, it's important to convert the document before - * creating the processor: pass in the converted HTML. + * UTF-8 is the only allowed encoding. If working with a document that + * isn't UTF-8, first convert the document to UTF-8, then pass in the + * converted HTML. * * @param string $html Input HTML document to process. * @param string|null $known_definite_encoding Optional. If provided, specifies the charset used @@ -459,35 +470,72 @@ function ( WP_HTML_Token $token ): void { * * @see https://html.spec.whatwg.org/multipage/parsing.html#html-fragment-parsing-algorithm * + * @since 6.8.0 + * * @param string $html Input HTML fragment to process. * @return static|null The created processor if successful, otherwise null. */ public function create_fragment_at_current_node( string $html ) { if ( $this->get_token_type() !== '#tag' || $this->is_tag_closer() ) { + _doing_it_wrong( + __METHOD__, + __( 'The context element must be a start tag.' ), + '6.8.0' + ); return null; } + $tag_name = $this->current_element->token->node_name; $namespace = $this->current_element->token->namespace; + if ( 'html' === $namespace && self::is_void( $tag_name ) ) { + _doing_it_wrong( + __METHOD__, + sprintf( + // translators: %s: A tag name like INPUT or BR. + __( 'The context element cannot be a void element, found "%s".' ), + $tag_name + ), + '6.8.0' + ); + return null; + } + /* * Prevent creating fragments at nodes that require a special tokenizer state. * This is unsupported by the HTML Processor. */ if ( 'html' === $namespace && - in_array( $this->current_element->token->node_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP', 'PLAINTEXT' ), true ) + in_array( $tag_name, array( 'IFRAME', 'NOEMBED', 'NOFRAMES', 'SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE', 'XMP', 'PLAINTEXT' ), true ) ) { + _doing_it_wrong( + __METHOD__, + sprintf( + // translators: %s: A tag name like IFRAME or TEXTAREA. + __( 'The context element "%s" is not supported.' ), + $tag_name + ), + '6.8.0' + ); return null; } - $fragment_processor = static::create_fragment( $html ); - if ( null === $fragment_processor ) { - return null; - } + $fragment_processor = new static( $html, self::CONSTRUCTOR_UNLOCK_CODE ); $fragment_processor->compat_mode = $this->compat_mode; - $fragment_processor->context_node = clone $this->state->current_token; + // @todo Create "fake" bookmarks for non-existent but implied nodes. + $fragment_processor->bookmarks['root-node'] = new WP_HTML_Span( 0, 0 ); + $root_node = new WP_HTML_Token( + 'root-node', + 'HTML', + false + ); + $fragment_processor->state->stack_of_open_elements->push( $root_node ); + + $fragment_processor->bookmarks['context-node'] = new WP_HTML_Span( 0, 0 ); + $fragment_processor->context_node = clone $this->current_element->token; $fragment_processor->context_node->bookmark_name = 'context-node'; $fragment_processor->context_node->on_destroy = null; diff --git a/tests/phpunit/tests/html-api/wpHtmlProcessor.php b/tests/phpunit/tests/html-api/wpHtmlProcessor.php index f80260cbc1aa6..1ca60e691f03e 100644 --- a/tests/phpunit/tests/html-api/wpHtmlProcessor.php +++ b/tests/phpunit/tests/html-api/wpHtmlProcessor.php @@ -1043,83 +1043,6 @@ public function test_ensure_next_token_method_extensibility( $html, $expected_to $this->assertEquals( $expected_token_counts, $processor->token_seen_count, 'Snapshot: ' . var_export( $processor->token_seen_count, true ) ); } - /** - * @ticket 62357 - */ - public function test_create_fragment_at_current_node_in_foreign_content() { - $processor = WP_HTML_Processor::create_full_parser( '' ); - $this->assertTrue( $processor->next_tag( 'SVG' ) ); - - $fragment = $processor->create_fragment_at_current_node( "\0preceded-by-nul-byte
" ); - - $this->assertSame( 'svg', $fragment->get_namespace() ); - $this->assertTrue( $fragment->next_token() ); - - /* - * In HTML parsing, a nul byte would be ignored. - * In SVG it should be replaced with a replacement character. - */ - $this->assertSame( '#text', $fragment->get_token_type() ); - $this->assertSame( "\u{FFFD}", $fragment->get_modifiable_text() ); - - $this->assertTrue( $fragment->next_tag( 'RECT' ) ); - $this->assertSame( 'svg', $fragment->get_namespace() ); - - $this->assertTrue( $fragment->next_tag( 'CIRCLE' ) ); - $this->assertSame( array( 'HTML', 'SVG', 'CIRCLE' ), $fragment->get_breadcrumbs() ); - $this->assertTrue( $fragment->next_tag( 'foreignObject' ) ); - $this->assertSame( 'svg', $fragment->get_namespace() ); - } - - /** - * @ticket 62357 - */ - public function test_create_fragment_at_current_node_in_foreign_content_integration_point() { - $processor = WP_HTML_Processor::create_full_parser( '' ); - $this->assertTrue( $processor->next_tag( 'foreignObject' ) ); - - $fragment = $processor->create_fragment_at_current_node( "\0not-preceded-by-nul-byte" ); - - // Nothing has been processed, the html namespace should be used for parsing as an integration point. - $this->assertSame( 'html', $fragment->get_namespace() ); - - // HTML parsing transforms IMAGE into IMG. - $this->assertTrue( $fragment->next_tag( 'IMG' ) ); - - $this->assertTrue( $fragment->next_token() ); - - // In HTML parsing, the nul byte is ignored and the text is reached. - $this->assertSame( '#text', $fragment->get_token_type() ); - $this->assertSame( 'not-preceded-by-nul-byte', $fragment->get_modifiable_text() ); - - /* - * svg:foreignObject is an HTML integration point, so the processor should be in the HTML namespace. - * RECT is an HTML element here, meaning it may have the self-closing flag but does not self-close. - */ - $this->assertTrue( $fragment->next_tag( 'RECT' ) ); - $this->assertSame( array( 'HTML', 'FOREIGNOBJECT', 'RECT' ), $fragment->get_breadcrumbs() ); - $this->assertSame( 'html', $fragment->get_namespace() ); - $this->assertTrue( $fragment->has_self_closing_flag() ); - $this->assertTrue( $fragment->expects_closer() ); - } - - /** - * @ticket 62357 - */ - public function test_prevent_fragment_creation_on_closers() { - $processor = WP_HTML_Processor::create_full_parser( '

' ); - $processor->next_tag( 'P' ); - $processor->next_tag( - array( - 'tag_name' => 'P', - 'tag_closers' => 'visit', - ) - ); - $this->assertSame( 'P', $processor->get_tag() ); - $this->assertTrue( $processor->is_tag_closer() ); - $this->assertNull( $processor->create_fragment_at_current_node( 'fragment HTML' ) ); - } - /** * Ensure that lowercased tag_name query matches tags case-insensitively. * diff --git a/tests/phpunit/tests/html-api/wpHtmlProcessorFragmentParsing.php b/tests/phpunit/tests/html-api/wpHtmlProcessorFragmentParsing.php new file mode 100644 index 0000000000000..4913fa07eb412 --- /dev/null +++ b/tests/phpunit/tests/html-api/wpHtmlProcessorFragmentParsing.php @@ -0,0 +1,178 @@ +' ); + $this->assertTrue( $processor->next_tag( 'SVG' ) ); + + $fragment = $processor->create_fragment_at_current_node( "\0preceded-by-nul-byte
" ); + + $this->assertSame( 'svg', $fragment->get_namespace() ); + $this->assertTrue( $fragment->next_token() ); + + /* + * In HTML parsing, a nul byte would be ignored. + * In SVG it should be replaced with a replacement character. + */ + $this->assertSame( '#text', $fragment->get_token_type() ); + $this->assertSame( "\u{FFFD}", $fragment->get_modifiable_text() ); + + $this->assertTrue( $fragment->next_tag( 'RECT' ) ); + $this->assertSame( 'svg', $fragment->get_namespace() ); + + $this->assertTrue( $fragment->next_tag( 'CIRCLE' ) ); + $this->assertSame( array( 'HTML', 'SVG', 'CIRCLE' ), $fragment->get_breadcrumbs() ); + $this->assertTrue( $fragment->next_tag( 'foreignObject' ) ); + $this->assertSame( 'svg', $fragment->get_namespace() ); + } + + /** + * @ticket 62357 + */ + public function test_create_fragment_at_current_node_in_foreign_content_integration_point() { + $processor = WP_HTML_Processor::create_full_parser( '' ); + $this->assertTrue( $processor->next_tag( 'foreignObject' ) ); + + $fragment = $processor->create_fragment_at_current_node( "\0not-preceded-by-nul-byte" ); + + // Nothing has been processed, the html namespace should be used for parsing as an integration point. + $this->assertSame( 'html', $fragment->get_namespace() ); + + // HTML parsing transforms IMAGE into IMG. + $this->assertTrue( $fragment->next_tag( 'IMG' ) ); + + $this->assertTrue( $fragment->next_token() ); + + // In HTML parsing, the nul byte is ignored and the text is reached. + $this->assertSame( '#text', $fragment->get_token_type() ); + $this->assertSame( 'not-preceded-by-nul-byte', $fragment->get_modifiable_text() ); + + /* + * svg:foreignObject is an HTML integration point, so the processor should be in the HTML namespace. + * RECT is an HTML element here, meaning it may have the self-closing flag but does not self-close. + */ + $this->assertTrue( $fragment->next_tag( 'RECT' ) ); + $this->assertSame( array( 'HTML', 'FOREIGNOBJECT', 'RECT' ), $fragment->get_breadcrumbs() ); + $this->assertSame( 'html', $fragment->get_namespace() ); + $this->assertTrue( $fragment->has_self_closing_flag() ); + $this->assertTrue( $fragment->expects_closer() ); + } + + /** + * @expectedIncorrectUsage WP_HTML_Processor::create_fragment_at_current_node + * @ticket 62357 + */ + public function test_prevent_fragment_creation_on_closers() { + $processor = WP_HTML_Processor::create_full_parser( '

' ); + $processor->next_tag( 'P' ); + $processor->next_tag( + array( + 'tag_name' => 'P', + 'tag_closers' => 'visit', + ) + ); + $this->assertSame( 'P', $processor->get_tag() ); + $this->assertTrue( $processor->is_tag_closer() ); + $this->assertNull( $processor->create_fragment_at_current_node( 'fragment HTML' ) ); + } + + /** + * Verifies that the fragment parser doesn't allow invalid context nodes. + * + * This includes void elements and self-contained elements because they can + * contain no inner HTML. Operations on self-contained elements should occur + * through methods such as {@see WP_HTML_Tag_Processor::set_modifiable_text}. + * + * @ticket 62584 + * + * @dataProvider data_invalid_fragment_contexts + * + * @param string $context Invalid context node for fragment parser. + */ + public function test_rejects_invalid_fragment_contexts( string $context, string $doing_it_wrong_method_name ) { + $this->setExpectedIncorrectUsage( "WP_HTML_Processor::{$doing_it_wrong_method_name}" ); + $this->assertNull( + WP_HTML_Processor::create_fragment( 'just a test', $context ), + "Should not have been able to create a fragment parser with context node {$context}" + ); + } + + /** + * Data provider. + * + * @return array[] + */ + public static function data_invalid_fragment_contexts() { + return array( + /* + * Invalid contexts. + */ + /* + * The text node is confused with a virtual body open tag. + * This should fail to set a bookmark in `create_fragment` + * but currently does not, it slips through and fails in + * `create_fragment_at_current_node`. + */ + 'Invalid text' => array( 'just some text', 'create_fragment_at_current_node' ), + 'Invalid comment' => array( '', 'create_fragment' ), + 'Invalid closing' => array( '', 'create_fragment' ), + 'Invalid DOCTYPE' => array( '', 'create_fragment' ), + /* + * PLAINTEXT should appear in the unsupported elements, but at the + * moment it's completely unsupported by the processor so + * the context element cannot be found. + */ + 'Unsupported PLAINTEXT' => array( '', 'create_fragment' ), + + /* + * Invalid contexts. + */ + 'AREA' => array( '<area>', 'create_fragment_at_current_node' ), + 'BASE' => array( '<base>', 'create_fragment_at_current_node' ), + 'BASEFONT' => array( '<basefont>', 'create_fragment_at_current_node' ), + 'BGSOUND' => array( '<bgsound>', 'create_fragment_at_current_node' ), + 'BR' => array( '<br>', 'create_fragment_at_current_node' ), + 'COL' => array( '<table><colgroup><col>', 'create_fragment_at_current_node' ), + 'EMBED' => array( '<embed>', 'create_fragment_at_current_node' ), + 'FRAME' => array( '<frameset><frame>', 'create_fragment_at_current_node' ), + 'HR' => array( '<hr>', 'create_fragment_at_current_node' ), + 'IMG' => array( '<img>', 'create_fragment_at_current_node' ), + 'INPUT' => array( '<input>', 'create_fragment_at_current_node' ), + 'KEYGEN' => array( '<keygen>', 'create_fragment_at_current_node' ), + 'LINK' => array( '<link>', 'create_fragment_at_current_node' ), + 'META' => array( '<meta>', 'create_fragment_at_current_node' ), + 'PARAM' => array( '<param>', 'create_fragment_at_current_node' ), + 'SOURCE' => array( '<source>', 'create_fragment_at_current_node' ), + 'TRACK' => array( '<track>', 'create_fragment_at_current_node' ), + 'WBR' => array( '<wbr>', 'create_fragment_at_current_node' ), + + /* + * Unsupported elements. Include a tag closer to ensure the element can be found + * and does not pause the parser at an incomplete token. + */ + 'IFRAME' => array( '<iframe></iframe>', 'create_fragment_at_current_node' ), + 'NOEMBED' => array( '<noembed></noembed>', 'create_fragment_at_current_node' ), + 'NOFRAMES' => array( '<noframes></noframes>', 'create_fragment_at_current_node' ), + 'SCRIPT' => array( '<script></script>', 'create_fragment_at_current_node' ), + 'SCRIPT with type' => array( '<script type="javascript"></script>', 'create_fragment_at_current_node' ), + 'STYLE' => array( '<style></style>', 'create_fragment_at_current_node' ), + 'TEXTAREA' => array( '<textarea></textarea>', 'create_fragment_at_current_node' ), + 'TITLE' => array( '<title></title>', 'create_fragment_at_current_node' ), + 'XMP' => array( '<xmp></xmp>', 'create_fragment_at_current_node' ), + ); + } +} diff --git a/tests/phpunit/tests/html-api/wpHtmlProcessorHtml5lib.php b/tests/phpunit/tests/html-api/wpHtmlProcessorHtml5lib.php index 7abe63a859954..5e0c3b77f8732 100644 --- a/tests/phpunit/tests/html-api/wpHtmlProcessorHtml5lib.php +++ b/tests/phpunit/tests/html-api/wpHtmlProcessorHtml5lib.php @@ -153,69 +153,55 @@ private static function should_skip_test( ?string $test_context_element, string * @return string|null Tree structure of parsed HTML, if supported, else null. */ private static function build_tree_representation( ?string $fragment_context, string $html ) { - $processor = null; if ( $fragment_context ) { - if ( 'body' === $fragment_context ) { - $processor = WP_HTML_Processor::create_fragment( $html ); - } else { - - /* - * If the string of characters starts with "svg ", the context - * element is in the SVG namespace and the substring after - * "svg " is the local name. If the string of characters starts - * with "math ", the context element is in the MathML namespace - * and the substring after "math " is the local name. - * Otherwise, the context element is in the HTML namespace and - * the string is the local name. - */ - if ( str_starts_with( $fragment_context, 'svg ' ) ) { - $tag_name = substr( $fragment_context, 4 ); - if ( 'svg' === $tag_name ) { - $parent_processor = WP_HTML_Processor::create_full_parser( '<!DOCTYPE html><svg>' ); - } else { - $parent_processor = WP_HTML_Processor::create_full_parser( "<!DOCTYPE html><svg><{$tag_name}>" ); - } - $parent_processor->next_tag( $tag_name ); - } elseif ( str_starts_with( $fragment_context, 'math ' ) ) { - $tag_name = substr( $fragment_context, 5 ); - if ( 'math' === $tag_name ) { - $parent_processor = WP_HTML_Processor::create_full_parser( '<!DOCTYPE html><math>' ); - } else { - $parent_processor = WP_HTML_Processor::create_full_parser( "<!DOCTYPE html><math><{$tag_name}>" ); - } - $parent_processor->next_tag( $tag_name ); + /* + * If the string of characters starts with "svg ", the context + * element is in the SVG namespace and the substring after + * "svg " is the local name. If the string of characters starts + * with "math ", the context element is in the MathML namespace + * and the substring after "math " is the local name. + * Otherwise, the context element is in the HTML namespace and + * the string is the local name. + */ + if ( str_starts_with( $fragment_context, 'svg ' ) ) { + $tag_name = substr( $fragment_context, 4 ); + if ( 'svg' === $tag_name ) { + $fragment_context_html = '<svg>'; } else { - if ( in_array( - $fragment_context, - array( - 'caption', - 'col', - 'colgroup', - 'tbody', - 'td', - 'tfoot', - 'th', - 'thead', - 'tr', - ), - true - ) ) { - $parent_processor = WP_HTML_Processor::create_full_parser( "<!DOCTYPE html><table><{$fragment_context}>" ); - $parent_processor->next_tag(); - } else { - $parent_processor = WP_HTML_Processor::create_full_parser( "<!DOCTYPE html><{$fragment_context}>" ); - } - $parent_processor->next_tag( $fragment_context ); + $fragment_context_html = "<svg><{$tag_name}>"; } - if ( null !== $parent_processor->get_unsupported_exception() ) { - throw $parent_processor->get_unsupported_exception(); + } elseif ( str_starts_with( $fragment_context, 'math ' ) ) { + $tag_name = substr( $fragment_context, 5 ); + if ( 'math' === $tag_name ) { + $fragment_context_html = '<math>'; + } else { + $fragment_context_html = "<math><{$tag_name}>"; } - if ( null !== $parent_processor->get_last_error() ) { - throw new Exception( $parent_processor->get_last_error() ); + } else { + // Tags that only appear in tables need a special case. + if ( in_array( + $fragment_context, + array( + 'caption', + 'col', + 'colgroup', + 'tbody', + 'td', + 'tfoot', + 'th', + 'thead', + 'tr', + ), + true + ) ) { + $fragment_context_html = "<table><{$fragment_context}>"; + } else { + $fragment_context_html = "<{$fragment_context}>"; } - $processor = $parent_processor->create_fragment_at_current_node( $html ); } + $processor = WP_HTML_Processor::create_fragment( $html, $fragment_context_html ); + if ( null === $processor ) { throw new WP_HTML_Unsupported_Exception( "Could not create a parser with the given fragment context: {$fragment_context}.", '', 0, '', array(), array() ); } From e99d83918a1158b1d60a6946377347da19571cbf Mon Sep 17 00:00:00 2001 From: bernhard-reiter <bernhard-reiter@git.wordpress.org> Date: Thu, 28 Nov 2024 14:25:51 +0000 Subject: [PATCH 057/323] HTML API: Make non-body fragment creation methods private. The current implementation of `create_fragment` (and the underlying `create_fragment_at_current_node`) allows passing in a context that might result in a tree that cannot be represented by HTML. For example, a user might use `<p>` as context, and attempt to create a fragment that also consists of a paragraph element, `<p>like this`. This would result in a paragraph node nested inside another -- something that can never result from parsing HTML. To prevent this, this changeset makes `create_fragment_at_current_node` private and limits `create_fragment` to only `<body>` as context, while a comprehensive solution to allow other contexts is being worked on. Follow-up to [59444], [59467]. Props jonsurrell, dmsnell, bernhard-reiter. Fixes #62584. git-svn-id: https://develop.svn.wordpress.org/trunk@59469 602fd350-edb4-49c9-b593-d223f7449a82 --- .../html-api/class-wp-html-processor.php | 38 +--- .../wpHtmlProcessorFragmentParsing.php | 178 ------------------ .../html-api/wpHtmlProcessorHtml5lib.php | 66 +------ 3 files changed, 18 insertions(+), 264 deletions(-) delete mode 100644 tests/phpunit/tests/html-api/wpHtmlProcessorFragmentParsing.php diff --git a/src/wp-includes/html-api/class-wp-html-processor.php b/src/wp-includes/html-api/class-wp-html-processor.php index 1be795c5c7de2..e88757ec7b4c2 100644 --- a/src/wp-includes/html-api/class-wp-html-processor.php +++ b/src/wp-includes/html-api/class-wp-html-processor.php @@ -279,44 +279,24 @@ class WP_HTML_Processor extends WP_HTML_Tag_Processor { * form is provided because a context element may have attributes that * impact the parse, such as with a SCRIPT tag and its `type` attribute. * - * Example: - * - * // Usually, snippets of HTML ought to be processed in the default `<body>` context: - * $processor = WP_HTML_Processor::create_fragment( '<p>Hi</p>' ); - * - * // Some fragments should be processed in the correct context like this SVG: - * $processor = WP_HTML_Processor::create_fragment( '<rect width="10" height="10" />', '<svg>' ); - * - * // This fragment with TD tags should be processed in a TR context: - * $processor = WP_HTML_Processor::create_fragment( - * '<td>1<td>2<td>3', - * '<table><tbody><tr>' - * ); - * - * In order to create a fragment processor at the correct location, the - * provided fragment will be processed as part of a full HTML document. - * The processor will search for the last opener tag in the document and - * create a fragment processor at that location. The document will be - * forced into "no-quirks" mode by including the HTML5 doctype. - * - * For advanced usage and precise control over the context element, use - * `WP_HTML_Processor::create_full_processor()` and - * `WP_HTML_Processor::create_fragment_at_current_node()`. + * ## Current HTML Support * - * UTF-8 is the only allowed encoding. If working with a document that - * isn't UTF-8, first convert the document to UTF-8, then pass in the - * converted HTML. + * - The only supported context is `<body>`, which is the default value. + * - The only supported document encoding is `UTF-8`, which is the default value. * * @since 6.4.0 * @since 6.6.0 Returns `static` instead of `self` so it can create subclass instances. - * @since 6.8.0 Can create fragments with any context element. * * @param string $html Input HTML fragment to process. - * @param string $context Context element for the fragment. Defaults to `<body>`. + * @param string $context Context element for the fragment, must be default of `<body>`. * @param string $encoding Text encoding of the document; must be default of 'UTF-8'. * @return static|null The created processor if successful, otherwise null. */ public static function create_fragment( $html, $context = '<body>', $encoding = 'UTF-8' ) { + if ( '<body>' !== $context || 'UTF-8' !== $encoding ) { + return null; + } + $context_processor = static::create_full_parser( "<!DOCTYPE html>{$context}", $encoding ); if ( null === $context_processor ) { return null; @@ -475,7 +455,7 @@ function ( WP_HTML_Token $token ): void { * @param string $html Input HTML fragment to process. * @return static|null The created processor if successful, otherwise null. */ - public function create_fragment_at_current_node( string $html ) { + private function create_fragment_at_current_node( string $html ) { if ( $this->get_token_type() !== '#tag' || $this->is_tag_closer() ) { _doing_it_wrong( __METHOD__, diff --git a/tests/phpunit/tests/html-api/wpHtmlProcessorFragmentParsing.php b/tests/phpunit/tests/html-api/wpHtmlProcessorFragmentParsing.php deleted file mode 100644 index 4913fa07eb412..0000000000000 --- a/tests/phpunit/tests/html-api/wpHtmlProcessorFragmentParsing.php +++ /dev/null @@ -1,178 +0,0 @@ -<?php -/** - * Unit tests covering WP_HTML_Processor fragment parsing functionality. - * - * @package WordPress - * @subpackage HTML-API - * - * @since 6.8.0 - * - * @group html-api - * - * @coversDefaultClass WP_HTML_Processor - */ -class Tests_HtmlApi_WpHtmlProcessorFragmentParsing extends WP_UnitTestCase { - /** - * @ticket 62357 - */ - public function test_create_fragment_at_current_node_in_foreign_content() { - $processor = WP_HTML_Processor::create_full_parser( '<svg>' ); - $this->assertTrue( $processor->next_tag( 'SVG' ) ); - - $fragment = $processor->create_fragment_at_current_node( "\0preceded-by-nul-byte<rect /><circle></circle><foreignobject><div></div></foreignobject><g>" ); - - $this->assertSame( 'svg', $fragment->get_namespace() ); - $this->assertTrue( $fragment->next_token() ); - - /* - * In HTML parsing, a nul byte would be ignored. - * In SVG it should be replaced with a replacement character. - */ - $this->assertSame( '#text', $fragment->get_token_type() ); - $this->assertSame( "\u{FFFD}", $fragment->get_modifiable_text() ); - - $this->assertTrue( $fragment->next_tag( 'RECT' ) ); - $this->assertSame( 'svg', $fragment->get_namespace() ); - - $this->assertTrue( $fragment->next_tag( 'CIRCLE' ) ); - $this->assertSame( array( 'HTML', 'SVG', 'CIRCLE' ), $fragment->get_breadcrumbs() ); - $this->assertTrue( $fragment->next_tag( 'foreignObject' ) ); - $this->assertSame( 'svg', $fragment->get_namespace() ); - } - - /** - * @ticket 62357 - */ - public function test_create_fragment_at_current_node_in_foreign_content_integration_point() { - $processor = WP_HTML_Processor::create_full_parser( '<svg><foreignObject>' ); - $this->assertTrue( $processor->next_tag( 'foreignObject' ) ); - - $fragment = $processor->create_fragment_at_current_node( "<image>\0not-preceded-by-nul-byte<rect />" ); - - // Nothing has been processed, the html namespace should be used for parsing as an integration point. - $this->assertSame( 'html', $fragment->get_namespace() ); - - // HTML parsing transforms IMAGE into IMG. - $this->assertTrue( $fragment->next_tag( 'IMG' ) ); - - $this->assertTrue( $fragment->next_token() ); - - // In HTML parsing, the nul byte is ignored and the text is reached. - $this->assertSame( '#text', $fragment->get_token_type() ); - $this->assertSame( 'not-preceded-by-nul-byte', $fragment->get_modifiable_text() ); - - /* - * svg:foreignObject is an HTML integration point, so the processor should be in the HTML namespace. - * RECT is an HTML element here, meaning it may have the self-closing flag but does not self-close. - */ - $this->assertTrue( $fragment->next_tag( 'RECT' ) ); - $this->assertSame( array( 'HTML', 'FOREIGNOBJECT', 'RECT' ), $fragment->get_breadcrumbs() ); - $this->assertSame( 'html', $fragment->get_namespace() ); - $this->assertTrue( $fragment->has_self_closing_flag() ); - $this->assertTrue( $fragment->expects_closer() ); - } - - /** - * @expectedIncorrectUsage WP_HTML_Processor::create_fragment_at_current_node - * @ticket 62357 - */ - public function test_prevent_fragment_creation_on_closers() { - $processor = WP_HTML_Processor::create_full_parser( '<p></p>' ); - $processor->next_tag( 'P' ); - $processor->next_tag( - array( - 'tag_name' => 'P', - 'tag_closers' => 'visit', - ) - ); - $this->assertSame( 'P', $processor->get_tag() ); - $this->assertTrue( $processor->is_tag_closer() ); - $this->assertNull( $processor->create_fragment_at_current_node( '<i>fragment HTML</i>' ) ); - } - - /** - * Verifies that the fragment parser doesn't allow invalid context nodes. - * - * This includes void elements and self-contained elements because they can - * contain no inner HTML. Operations on self-contained elements should occur - * through methods such as {@see WP_HTML_Tag_Processor::set_modifiable_text}. - * - * @ticket 62584 - * - * @dataProvider data_invalid_fragment_contexts - * - * @param string $context Invalid context node for fragment parser. - */ - public function test_rejects_invalid_fragment_contexts( string $context, string $doing_it_wrong_method_name ) { - $this->setExpectedIncorrectUsage( "WP_HTML_Processor::{$doing_it_wrong_method_name}" ); - $this->assertNull( - WP_HTML_Processor::create_fragment( 'just a test', $context ), - "Should not have been able to create a fragment parser with context node {$context}" - ); - } - - /** - * Data provider. - * - * @return array[] - */ - public static function data_invalid_fragment_contexts() { - return array( - /* - * Invalid contexts. - */ - /* - * The text node is confused with a virtual body open tag. - * This should fail to set a bookmark in `create_fragment` - * but currently does not, it slips through and fails in - * `create_fragment_at_current_node`. - */ - 'Invalid text' => array( 'just some text', 'create_fragment_at_current_node' ), - 'Invalid comment' => array( '<!-- comment -->', 'create_fragment' ), - 'Invalid closing' => array( '</div>', 'create_fragment' ), - 'Invalid DOCTYPE' => array( '<!DOCTYPE html>', 'create_fragment' ), - /* - * PLAINTEXT should appear in the unsupported elements, but at the - * moment it's completely unsupported by the processor so - * the context element cannot be found. - */ - 'Unsupported PLAINTEXT' => array( '<plaintext>', 'create_fragment' ), - - /* - * Invalid contexts. - */ - 'AREA' => array( '<area>', 'create_fragment_at_current_node' ), - 'BASE' => array( '<base>', 'create_fragment_at_current_node' ), - 'BASEFONT' => array( '<basefont>', 'create_fragment_at_current_node' ), - 'BGSOUND' => array( '<bgsound>', 'create_fragment_at_current_node' ), - 'BR' => array( '<br>', 'create_fragment_at_current_node' ), - 'COL' => array( '<table><colgroup><col>', 'create_fragment_at_current_node' ), - 'EMBED' => array( '<embed>', 'create_fragment_at_current_node' ), - 'FRAME' => array( '<frameset><frame>', 'create_fragment_at_current_node' ), - 'HR' => array( '<hr>', 'create_fragment_at_current_node' ), - 'IMG' => array( '<img>', 'create_fragment_at_current_node' ), - 'INPUT' => array( '<input>', 'create_fragment_at_current_node' ), - 'KEYGEN' => array( '<keygen>', 'create_fragment_at_current_node' ), - 'LINK' => array( '<link>', 'create_fragment_at_current_node' ), - 'META' => array( '<meta>', 'create_fragment_at_current_node' ), - 'PARAM' => array( '<param>', 'create_fragment_at_current_node' ), - 'SOURCE' => array( '<source>', 'create_fragment_at_current_node' ), - 'TRACK' => array( '<track>', 'create_fragment_at_current_node' ), - 'WBR' => array( '<wbr>', 'create_fragment_at_current_node' ), - - /* - * Unsupported elements. Include a tag closer to ensure the element can be found - * and does not pause the parser at an incomplete token. - */ - 'IFRAME' => array( '<iframe></iframe>', 'create_fragment_at_current_node' ), - 'NOEMBED' => array( '<noembed></noembed>', 'create_fragment_at_current_node' ), - 'NOFRAMES' => array( '<noframes></noframes>', 'create_fragment_at_current_node' ), - 'SCRIPT' => array( '<script></script>', 'create_fragment_at_current_node' ), - 'SCRIPT with type' => array( '<script type="javascript"></script>', 'create_fragment_at_current_node' ), - 'STYLE' => array( '<style></style>', 'create_fragment_at_current_node' ), - 'TEXTAREA' => array( '<textarea></textarea>', 'create_fragment_at_current_node' ), - 'TITLE' => array( '<title></title>', 'create_fragment_at_current_node' ), - 'XMP' => array( '<xmp></xmp>', 'create_fragment_at_current_node' ), - ); - } -} diff --git a/tests/phpunit/tests/html-api/wpHtmlProcessorHtml5lib.php b/tests/phpunit/tests/html-api/wpHtmlProcessorHtml5lib.php index 5e0c3b77f8732..a03a9ab806a93 100644 --- a/tests/phpunit/tests/html-api/wpHtmlProcessorHtml5lib.php +++ b/tests/phpunit/tests/html-api/wpHtmlProcessorHtml5lib.php @@ -138,6 +138,10 @@ public function data_external_html5lib_tests() { * @return bool True if the test case should be skipped. False otherwise. */ private static function should_skip_test( ?string $test_context_element, string $test_name ): bool { + if ( null !== $test_context_element && 'body' !== $test_context_element ) { + return true; + } + if ( array_key_exists( $test_name, self::SKIP_TESTS ) ) { return true; } @@ -153,63 +157,11 @@ private static function should_skip_test( ?string $test_context_element, string * @return string|null Tree structure of parsed HTML, if supported, else null. */ private static function build_tree_representation( ?string $fragment_context, string $html ) { - if ( $fragment_context ) { - /* - * If the string of characters starts with "svg ", the context - * element is in the SVG namespace and the substring after - * "svg " is the local name. If the string of characters starts - * with "math ", the context element is in the MathML namespace - * and the substring after "math " is the local name. - * Otherwise, the context element is in the HTML namespace and - * the string is the local name. - */ - if ( str_starts_with( $fragment_context, 'svg ' ) ) { - $tag_name = substr( $fragment_context, 4 ); - if ( 'svg' === $tag_name ) { - $fragment_context_html = '<svg>'; - } else { - $fragment_context_html = "<svg><{$tag_name}>"; - } - } elseif ( str_starts_with( $fragment_context, 'math ' ) ) { - $tag_name = substr( $fragment_context, 5 ); - if ( 'math' === $tag_name ) { - $fragment_context_html = '<math>'; - } else { - $fragment_context_html = "<math><{$tag_name}>"; - } - } else { - // Tags that only appear in tables need a special case. - if ( in_array( - $fragment_context, - array( - 'caption', - 'col', - 'colgroup', - 'tbody', - 'td', - 'tfoot', - 'th', - 'thead', - 'tr', - ), - true - ) ) { - $fragment_context_html = "<table><{$fragment_context}>"; - } else { - $fragment_context_html = "<{$fragment_context}>"; - } - } - - $processor = WP_HTML_Processor::create_fragment( $html, $fragment_context_html ); - - if ( null === $processor ) { - throw new WP_HTML_Unsupported_Exception( "Could not create a parser with the given fragment context: {$fragment_context}.", '', 0, '', array(), array() ); - } - } else { - $processor = WP_HTML_Processor::create_full_parser( $html ); - if ( null === $processor ) { - throw new Exception( 'Could not create a full parser.' ); - } + $processor = $fragment_context + ? WP_HTML_Processor::create_fragment( $html, "<{$fragment_context}>" ) + : WP_HTML_Processor::create_full_parser( $html ); + if ( null === $processor ) { + throw new WP_HTML_Unsupported_Exception( "Could not create a parser with the given fragment context: {$fragment_context}.", '', 0, '', array(), array() ); } $output = ''; From 8834f5783c344a141a8cd01e660cd27ae7e64e83 Mon Sep 17 00:00:00 2001 From: Tammie Lister <karmatosed@git.wordpress.org> Date: Thu, 28 Nov 2024 18:39:10 +0000 Subject: [PATCH 058/323] Twenty-Twenty: Fixes space between post content on front. The post author and post date did not have space between them and the post content. This brings in 1em of top margin. Of note is that this only is if the first element is a paragraph that the issue was caused. Props abcd95, sabernhardt, desrosj, sainathpoojary, viralsampat. Fixes #62243. git-svn-id: https://develop.svn.wordpress.org/trunk@59470 602fd350-edb4-49c9-b593-d223f7449a82 --- .../themes/twentytwenty/assets/css/editor-style-block-rtl.css | 4 ++++ .../themes/twentytwenty/assets/css/editor-style-block.css | 4 ++++ src/wp-content/themes/twentytwenty/style-rtl.css | 4 ++++ src/wp-content/themes/twentytwenty/style.css | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/src/wp-content/themes/twentytwenty/assets/css/editor-style-block-rtl.css b/src/wp-content/themes/twentytwenty/assets/css/editor-style-block-rtl.css index fd8868212b324..8a5f813502b72 100644 --- a/src/wp-content/themes/twentytwenty/assets/css/editor-style-block-rtl.css +++ b/src/wp-content/themes/twentytwenty/assets/css/editor-style-block-rtl.css @@ -1065,6 +1065,10 @@ hr.wp-block-separator.is-style-dots::before { margin-top: 15px; } +.wp-block-latest-posts__post-full-content > p:first-child { + margin-top: 1em; +} + /* Block: Shortcode -------------------------- */ .editor-styles-wrapper .wp-block-shortcode textarea { diff --git a/src/wp-content/themes/twentytwenty/assets/css/editor-style-block.css b/src/wp-content/themes/twentytwenty/assets/css/editor-style-block.css index 19a11cf3f0ee6..7f18f4772441e 100644 --- a/src/wp-content/themes/twentytwenty/assets/css/editor-style-block.css +++ b/src/wp-content/themes/twentytwenty/assets/css/editor-style-block.css @@ -1069,6 +1069,10 @@ hr.wp-block-separator.is-style-dots::before { margin-top: 15px; } +.wp-block-latest-posts__post-full-content > p:first-child { + margin-top: 1em; +} + /* Block: Shortcode -------------------------- */ .editor-styles-wrapper .wp-block-shortcode textarea { diff --git a/src/wp-content/themes/twentytwenty/style-rtl.css b/src/wp-content/themes/twentytwenty/style-rtl.css index 6225738578934..6806c9104b068 100644 --- a/src/wp-content/themes/twentytwenty/style-rtl.css +++ b/src/wp-content/themes/twentytwenty/style-rtl.css @@ -3525,6 +3525,10 @@ figure.wp-block-table.is-style-stripes { margin-top: 0; } +.wp-block-latest-posts__post-full-content > p:first-child { + margin-top: 1em; +} + /* Block: Post Template ---------------- */ .wp-block-post-template, diff --git a/src/wp-content/themes/twentytwenty/style.css b/src/wp-content/themes/twentytwenty/style.css index 9a6da4ea71eda..08843cefe43a4 100644 --- a/src/wp-content/themes/twentytwenty/style.css +++ b/src/wp-content/themes/twentytwenty/style.css @@ -3549,6 +3549,10 @@ figure.wp-block-table.is-style-stripes { margin-top: 0; } +.wp-block-latest-posts__post-full-content > p:first-child { + margin-top: 1em; +} + /* Block: Post Template ---------------- */ .wp-block-post-template, From ce4627f67feb608f8528f74709c8dc9aeed234e3 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Thu, 28 Nov 2024 22:50:21 +0000 Subject: [PATCH 059/323] Coding Standards: Cast `gmdate( 'w' )` to `int` before using as integer. This addresses several instances of `gmdate( 'w' )` being used directly as an integer, when it's actually a numeric string. The issue is remediated by casting the value to `int` before use. Affected functions: * `get_calendar()` * `get_weekstartend()` Follow-up to [508], [1632]. Props justlevine. See #52217. git-svn-id: https://develop.svn.wordpress.org/trunk@59471 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/functions.php | 5 +++-- src/wp-includes/general-template.php | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/wp-includes/functions.php b/src/wp-includes/functions.php index a4cfa13cd20dc..dd0066cf3fb63 100644 --- a/src/wp-includes/functions.php +++ b/src/wp-includes/functions.php @@ -594,10 +594,10 @@ function get_weekstartend( $mysqlstring, $start_of_week = '' ) { $day = mktime( 0, 0, 0, $md, $mm, $my ); // The day of the week from the timestamp. - $weekday = gmdate( 'w', $day ); + $weekday = (int) gmdate( 'w', $day ); if ( ! is_numeric( $start_of_week ) ) { - $start_of_week = get_option( 'start_of_week' ); + $start_of_week = (int) get_option( 'start_of_week' ); } if ( $weekday < $start_of_week ) { @@ -609,6 +609,7 @@ function get_weekstartend( $mysqlstring, $start_of_week = '' ) { // $start + 1 week - 1 second. $end = $start + WEEK_IN_SECONDS - 1; + return compact( 'start', 'end' ); } diff --git a/src/wp-includes/general-template.php b/src/wp-includes/general-template.php index 1d9fc98b843f7..e96f0f7c37429 100644 --- a/src/wp-includes/general-template.php +++ b/src/wp-includes/general-template.php @@ -2373,7 +2373,7 @@ function get_calendar( $initial = true, $display = true ) { } // See how much we should pad in the beginning. - $pad = calendar_week_mod( gmdate( 'w', $unixmonth ) - $week_begins ); + $pad = calendar_week_mod( (int) gmdate( 'w', $unixmonth ) - $week_begins ); if ( 0 != $pad ) { $calendar_output .= "\n\t\t" . '<td colspan="' . esc_attr( $pad ) . '" class="pad">&nbsp;</td>'; } @@ -2412,12 +2412,12 @@ function get_calendar( $initial = true, $display = true ) { $calendar_output .= '</td>'; - if ( 6 == calendar_week_mod( gmdate( 'w', mktime( 0, 0, 0, $thismonth, $day, $thisyear ) ) - $week_begins ) ) { + if ( 6 == calendar_week_mod( (int) gmdate( 'w', mktime( 0, 0, 0, $thismonth, $day, $thisyear ) ) - $week_begins ) ) { $newrow = true; } } - $pad = 7 - calendar_week_mod( gmdate( 'w', mktime( 0, 0, 0, $thismonth, $day, $thisyear ) ) - $week_begins ); + $pad = 7 - calendar_week_mod( (int) gmdate( 'w', mktime( 0, 0, 0, $thismonth, $day, $thisyear ) ) - $week_begins ); if ( 0 != $pad && 7 != $pad ) { $calendar_output .= "\n\t\t" . '<td class="pad" colspan="' . esc_attr( $pad ) . '">&nbsp;</td>'; } From dfcdeafd0c8459d0f4ccb5e093682b3001911ae1 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Fri, 29 Nov 2024 22:44:36 +0000 Subject: [PATCH 060/323] Editor: Add description for Banners block pattern category. Follow-up to [55098]. Props parinpanjari, youknowriad, Joen, dhruvang21, apermo, mukesh27. Fixes #62115. git-svn-id: https://develop.svn.wordpress.org/trunk@59472 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/block-patterns.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/block-patterns.php b/src/wp-includes/block-patterns.php index f1a24cdf72fe1..4a2886cdfd38f 100644 --- a/src/wp-includes/block-patterns.php +++ b/src/wp-includes/block-patterns.php @@ -35,7 +35,13 @@ function _register_core_block_patterns_and_categories() { } } - register_block_pattern_category( 'banner', array( 'label' => _x( 'Banners', 'Block pattern category' ) ) ); + register_block_pattern_category( + 'banner', + array( + 'label' => _x( 'Banners', 'Block pattern category' ), + 'description' => __( 'Bold sections designed to showcase key content.' ), + ) + ); register_block_pattern_category( 'buttons', array( From 0671dfd5b4888026874c12ccba9a6cb03f38aaf0 Mon Sep 17 00:00:00 2001 From: Adam Silverstein <adamsilverstein@git.wordpress.org> Date: Fri, 29 Nov 2024 23:46:50 +0000 Subject: [PATCH 061/323] Media: improve filter to enable setting output quality by image size. Add a new $size parameter to the wp_editor_set_quality filter. $size is an array with 'width' and 'height' keys. Developers can use this information to set image quality based on the image size. Props adamsilverstein, joemcgill, Mte90, codekraft, birgire, azaozz, sppramodh. Fixes #54648. git-svn-id: https://develop.svn.wordpress.org/trunk@59473 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-image-editor-gd.php | 18 ++++++-- .../class-wp-image-editor-imagick.php | 16 +++++-- src/wp-includes/class-wp-image-editor.php | 16 +++++-- tests/phpunit/tests/media.php | 45 +++++++++++++++++++ 4 files changed, 85 insertions(+), 10 deletions(-) diff --git a/src/wp-includes/class-wp-image-editor-gd.php b/src/wp-includes/class-wp-image-editor-gd.php index e4f065537639d..47ba91a367d9f 100644 --- a/src/wp-includes/class-wp-image-editor-gd.php +++ b/src/wp-includes/class-wp-image-editor-gd.php @@ -221,6 +221,14 @@ protected function _resize( $max_w, $max_h, $crop = false ) { list( $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h ) = $dims; + $this->set_quality( + null, + array( + 'width' => $dst_w, + 'height' => $dst_h, + ) + ); + $resized = wp_imagecreatetruecolor( $dst_w, $dst_h ); imagecopyresampled( $resized, $this->image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h ); @@ -568,12 +576,14 @@ protected function _save( $image, $filename = null, $mime_type = null ) { * Sets Image Compression quality on a 1-100% scale. Handles WebP lossless images. * * @since 6.7.0 + * @since 6.8.0 The `$dims` parameter was added. * - * @param int $quality Compression Quality. Range: [1,100] + * @param int $quality Compression Quality. Range: [1,100] + * @param array $dims Optional. Image dimensions array with 'width' and 'height' keys. * @return true|WP_Error True if set successfully; WP_Error on failure. */ - public function set_quality( $quality = null ) { - $quality_result = parent::set_quality( $quality ); + public function set_quality( $quality = null, $dims = array() ) { + $quality_result = parent::set_quality( $quality, $dims ); if ( is_wp_error( $quality_result ) ) { return $quality_result; } else { @@ -586,7 +596,7 @@ public function set_quality( $quality = null ) { $webp_info = wp_get_webp_info( $this->file ); if ( ! empty( $webp_info['type'] ) && 'lossless' === $webp_info['type'] ) { $quality = IMG_WEBP_LOSSLESS; - parent::set_quality( $quality ); + parent::set_quality( $quality, $dims ); } } } catch ( Exception $e ) { diff --git a/src/wp-includes/class-wp-image-editor-imagick.php b/src/wp-includes/class-wp-image-editor-imagick.php index 45b0e3a5a48ef..dd8b9ad5191ee 100644 --- a/src/wp-includes/class-wp-image-editor-imagick.php +++ b/src/wp-includes/class-wp-image-editor-imagick.php @@ -190,12 +190,14 @@ public function load() { * Sets Image Compression quality on a 1-100% scale. * * @since 3.5.0 + * @since 6.8.0 The `$dims` parameter was added. * - * @param int $quality Compression Quality. Range: [1,100] + * @param int $quality Compression Quality. Range: [1,100] + * @param array $dims Optional. Image dimensions array with 'width' and 'height' keys. * @return true|WP_Error True if set successfully; WP_Error on failure. */ - public function set_quality( $quality = null ) { - $quality_result = parent::set_quality( $quality ); + public function set_quality( $quality = null, $dims = array() ) { + $quality_result = parent::set_quality( $quality, $dims ); if ( is_wp_error( $quality_result ) ) { return $quality_result; } else { @@ -367,6 +369,14 @@ public function resize( $max_w, $max_h, $crop = false ) { return $this->crop( $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h ); } + $this->set_quality( + null, + array( + 'width' => $dst_w, + 'height' => $dst_h, + ) + ); + // Execute the resize. $thumb_result = $this->thumbnail_image( $dst_w, $dst_h ); if ( is_wp_error( $thumb_result ) ) { diff --git a/src/wp-includes/class-wp-image-editor.php b/src/wp-includes/class-wp-image-editor.php index dc2420507800d..f9f58fcd50c6b 100644 --- a/src/wp-includes/class-wp-image-editor.php +++ b/src/wp-includes/class-wp-image-editor.php @@ -240,11 +240,14 @@ public function get_quality() { * Sets Image Compression quality on a 1-100% scale. * * @since 3.5.0 + * @since 6.8.0 The `$dims` parameter was added. * - * @param int $quality Compression Quality. Range: [1,100] + * @param int $quality Compression Quality. Range: [1,100] + * @param array $dims Optional. Image dimensions array with 'width' and 'height' keys. * @return true|WP_Error True if set successfully; WP_Error on failure. + */ - public function set_quality( $quality = null ) { + public function set_quality( $quality = null, $dims = array() ) { // Use the output mime type if present. If not, fall back to the input/initial mime type. $mime_type = ! empty( $this->output_mime_type ) ? $this->output_mime_type : $this->mime_type; // Get the default quality setting for the mime type. @@ -260,11 +263,18 @@ public function set_quality( $quality = null ) { * The WP_Image_Editor::set_quality() method has priority over the filter. * * @since 3.5.0 + * @since 6.8.0 Added the size parameter. * * @param int $quality Quality level between 1 (low) and 100 (high). * @param string $mime_type Image mime type. + * @param array $size { + * Dimensions of the image. + * + * @type int $width The image width. + * @type int $height The image height. + * } */ - $quality = apply_filters( 'wp_editor_set_quality', $default_quality, $mime_type ); + $quality = apply_filters( 'wp_editor_set_quality', $default_quality, $mime_type, $dims ? $dims : $this->size ); if ( 'image/jpeg' === $mime_type ) { /** diff --git a/tests/phpunit/tests/media.php b/tests/phpunit/tests/media.php index 41ae8ef216401..7b6dc5002f106 100644 --- a/tests/phpunit/tests/media.php +++ b/tests/phpunit/tests/media.php @@ -5433,6 +5433,51 @@ public function test_quality_with_avif_conversion_file_sizes() { } } + /** + * Test that the `wp_editor_set_quality` filter includes the dimensions in the `$dims` parameter. + * + * @ticket 54648 + */ + public function test_wp_editor_set_quality_includes_dimensions() { + // Before loading an image, set up the callback filter with the assertions. + add_filter( 'wp_editor_set_quality', array( $this, 'assert_dimensions_in_wp_editor_set_quality' ), 10, 3 ); + + $temp_dir = get_temp_dir(); + $file = $temp_dir . '/33772.jpg'; + copy( DIR_TESTDATA . '/images/33772.jpg', $file ); + + $editor = wp_get_image_editor( $file ); + + $attachment_id = self::factory()->attachment->create_object( + array( + 'post_mime_type' => 'image/jpeg', + 'file' => $file, + ) + ); + + // Generate all sizes. + wp_generate_attachment_metadata( $attachment_id, $file ); + + // Clean up the filter. + remove_filter( 'wp_editor_set_quality', array( $this, 'assert_dimensions_in_wp_editor_set_quality' ), 10, 3 ); + } + + /** + * Helper callback to assert that the dimensions are included in the `$dims` parameter. + * + * @param int $quality The quality level. + * @param array $dims The dimensions array. + */ + public function assert_dimensions_in_wp_editor_set_quality( $quality, $mime_type, $dims ) { + // Assert that the array has non empty width and height values. + $this->assertArrayHasKey( 'width', $dims ); + $this->assertArrayHasKey( 'height', $dims ); + $this->assertGreaterThan( 0, $dims['width'] ); + $this->assertGreaterThan( 0, $dims['height'] ); + + return $quality; + } + /** * Test that an image size isn't generated if it matches the original image size. * From ad9505b575bd8f624ee449230d913be4b975be32 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sat, 30 Nov 2024 13:51:45 +0000 Subject: [PATCH 062/323] Docs: Correct DocBlock formatting for `WP_Theme_JSON::FONT_FAMILY_SCHEMA`. Follow-up to [57496]. Props marian1. Fixes #62621. git-svn-id: https://develop.svn.wordpress.org/trunk@59474 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-theme-json.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/class-wp-theme-json.php b/src/wp-includes/class-wp-theme-json.php index d87d3c5c0124d..cb48672c438bb 100644 --- a/src/wp-includes/class-wp-theme-json.php +++ b/src/wp-includes/class-wp-theme-json.php @@ -470,7 +470,7 @@ class WP_Theme_JSON { ), ); - /* + /** * The valid properties for fontFamilies under settings key. * * @since 6.5.0 From cc5c5b85afde54fefb57c49cbb60e1bdb97dd1d9 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sun, 1 Dec 2024 18:37:02 +0000 Subject: [PATCH 063/323] Date/Time: Add `d.m.Y` to date format presets on General Settings screen. This gives users another option when selecting how dates are displayed on their site. This change is relevant for better localization, providing more date format choices for users in regions where this format is common. The `array_unique()` call ensures that if this format was already added by a plugin or theme, it won't be duplicated. Follow-up to [9131], [22299], [28820], [28848]. Props Daedalon, pbearne, fierevere, im3dabasia1, SergeyBiryukov. Fixes #55685. git-svn-id: https://develop.svn.wordpress.org/trunk@59475 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/options-general.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/wp-admin/options-general.php b/src/wp-admin/options-general.php index 5d4abae030193..45d371cf6bf6e 100644 --- a/src/wp-admin/options-general.php +++ b/src/wp-admin/options-general.php @@ -476,11 +476,12 @@ class="<?php echo esc_attr( $classes_for_button ); ?>" * Filters the default date formats. * * @since 2.7.0 - * @since 4.0.0 Added ISO date standard YYYY-MM-DD format. + * @since 4.0.0 Replaced the `Y/m/d` format with `Y-m-d` (ISO date standard YYYY-MM-DD). + * @since 6.8.0 Added the `d.m.Y` format. * * @param string[] $default_date_formats Array of default date formats. */ - $date_formats = array_unique( apply_filters( 'date_formats', array( __( 'F j, Y' ), 'Y-m-d', 'm/d/Y', 'd/m/Y' ) ) ); + $date_formats = array_unique( apply_filters( 'date_formats', array( __( 'F j, Y' ), 'Y-m-d', 'm/d/Y', 'd/m/Y', 'd.m.Y' ) ) ); $custom = true; From c5a5d9b0940c0a1186f866d4a9558a74d16dc5f5 Mon Sep 17 00:00:00 2001 From: Carolina Nymark <poena@git.wordpress.org> Date: Mon, 2 Dec 2024 05:42:44 +0000 Subject: [PATCH 064/323] Twenty Thirteen & Twenty Sixteen: Correct the border of the latest comments block in the editor. This change hides the top border of the first comment in the latest comments block, so that the design in the editor and the front looks the same. Props viralsampat, sabernhardt, aishwarryapande, parthvataliya, imranhasanraaz. Fixes #62282. git-svn-id: https://develop.svn.wordpress.org/trunk@59476 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-content/themes/twentysixteen/css/editor-blocks.css | 4 ++-- src/wp-content/themes/twentythirteen/css/editor-blocks.css | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wp-content/themes/twentysixteen/css/editor-blocks.css b/src/wp-content/themes/twentysixteen/css/editor-blocks.css index 4135fbb9b97ef..0ab68afe8a930 100644 --- a/src/wp-content/themes/twentysixteen/css/editor-blocks.css +++ b/src/wp-content/themes/twentysixteen/css/editor-blocks.css @@ -617,7 +617,7 @@ figure[class*="wp-block-"] > figcaption { /* Latest Comments */ -.editor-block-list__block .wp-block-latest-comments__comment-meta a { +.editor-styles-wrapper .wp-block-latest-comments__comment-meta a { box-shadow: none; font-weight: 700; text-decoration: none; @@ -631,7 +631,7 @@ figure[class*="wp-block-"] > figcaption { line-height: 1.6153846154; } -.wp-block-latest-comments .wp-block-latest-comments__comment { +.wp-block-latest-comments .wp-block-latest-comments__comment:not(:first-child) { border-top: 1px solid #d1d1d1; margin-bottom: 0; padding: 1.75em 0; diff --git a/src/wp-content/themes/twentythirteen/css/editor-blocks.css b/src/wp-content/themes/twentythirteen/css/editor-blocks.css index d92efb9754ba8..1aa453dfa8886 100644 --- a/src/wp-content/themes/twentythirteen/css/editor-blocks.css +++ b/src/wp-content/themes/twentythirteen/css/editor-blocks.css @@ -437,7 +437,7 @@ p.has-drop-cap:not(:focus)::first-letter { font-size: 16px; } -.wp-block-latest-comments .wp-block-latest-comments__comment { +.wp-block-latest-comments .wp-block-latest-comments__comment:not(:first-child) { background: url(../images/dotted-line.png) repeat-x left top; margin-bottom: 0; padding: 24px 0; From e89e279e0328eca38cd9cc4baff36e042afe3373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Greg=20Zi=C3=83=C2=B3=C3=85=E2=80=9Akowski?= <gziolo@git.wordpress.org> Date: Mon, 2 Dec 2024 08:08:34 +0000 Subject: [PATCH 065/323] Interactivity API: Support length property on strings and arrays on the server The Interactivity API tries to align client and server rendering so that the behavior is the same. Adds missing handling for `.length` to directives processing on the server on strings and numeric arrays which is inherently supported through JavaScript language on the client. Props jonsurrell, gziolo, luisherranz. Fixes #62582. git-svn-id: https://develop.svn.wordpress.org/trunk@59477 602fd350-edb4-49c9-b593-d223f7449a82 --- .../class-wp-interactivity-api.php | 30 +++++++++++++ .../interactivity-api/wpInteractivityAPI.php | 44 +++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/src/wp-includes/interactivity-api/class-wp-interactivity-api.php b/src/wp-includes/interactivity-api/class-wp-interactivity-api.php index f6764736f9e8a..8283349868d64 100644 --- a/src/wp-includes/interactivity-api/class-wp-interactivity-api.php +++ b/src/wp-includes/interactivity-api/class-wp-interactivity-api.php @@ -579,6 +579,36 @@ private function evaluate( $directive_value ) { $path_segments = explode( '.', $path ); $current = $store; foreach ( $path_segments as $path_segment ) { + /* + * Special case for numeric arrays and strings. Add length + * property mimicking JavaScript behavior. + * + * @since 6.8.0 + */ + if ( 'length' === $path_segment ) { + if ( is_array( $current ) && array_is_list( $current ) ) { + $current = count( $current ); + break; + } + + if ( is_string( $current ) ) { + /* + * Differences in encoding between PHP strings and + * JavaScript mean that it's complicated to calculate + * the string length JavaScript would see from PHP. + * `strlen` is a reasonable approximation. + * + * Users that desire a more precise length likely have + * more precise needs than "bytelength" and should + * implement their own length calculation in derived + * state taking into account encoding and their desired + * output (codepoints, graphemes, bytes, etc.). + */ + $current = strlen( $current ); + break; + } + } + if ( ( is_array( $current ) || $current instanceof ArrayAccess ) && isset( $current[ $path_segment ] ) ) { $current = $current[ $path_segment ]; } elseif ( is_object( $current ) && isset( $current->$path_segment ) ) { diff --git a/tests/phpunit/tests/interactivity-api/wpInteractivityAPI.php b/tests/phpunit/tests/interactivity-api/wpInteractivityAPI.php index c63c64c6888e6..bcc4ba6bdf149 100644 --- a/tests/phpunit/tests/interactivity-api/wpInteractivityAPI.php +++ b/tests/phpunit/tests/interactivity-api/wpInteractivityAPI.php @@ -1541,4 +1541,48 @@ public function test_get_element_outside_of_directive_processing() { $element = $this->interactivity->get_element(); $this->assertNull( $element ); } + + /** + * Verify behavior of .length directive access. + * + * @ticket 62582 + * + * @covers ::process_directives + * + * @dataProvider data_length_directives + * + * @param mixed $value The property value. + * @param string $expected The expected property length as a string, + * or "" if no length is expected. + */ + public function test_process_directives_string_array_length( $value, string $expected ) { + $this->interactivity->state( + 'myPlugin', + array( 'prop' => $value ) + ); + $html = '<div data-wp-text="myPlugin::state.prop.length"></div>'; + $processed_html = $this->interactivity->process_directives( $html ); + $processor = new WP_HTML_Tag_Processor( $processed_html ); + $processor->next_tag( 'DIV' ); + $processor->next_token(); + $this->assertSame( $expected, $processor->get_modifiable_text() ); + } + + /** + * Data provider. + * + * @return array + */ + public static function data_length_directives(): array { + return array( + 'numeric array' => array( array( 'a', 'b', 'c' ), '3' ), + 'empty array' => array( array(), '0' ), + 'string' => array( 'abc', '3' ), + 'empty string' => array( '', '0' ), + + // Failure cases resulting in empty string. + 'non-numeric array' => array( array( 'a' => 'a' ), '' ), + 'object' => array( new stdClass(), '' ), + ); + } } From 6383964a542f52093262d94262e4bd4cdfb8cb9d Mon Sep 17 00:00:00 2001 From: Pascal Birchler <swissspidy@git.wordpress.org> Date: Mon, 2 Dec 2024 17:06:29 +0000 Subject: [PATCH 066/323] I18N: Load admin translations for auto update emails. As a follow-up to [59460], make sure that admin strings are loaded when switching locales for auto update notification emails, as those strings are in a separate translation file. Props benniledl, swissspidy. Fixes #62496. git-svn-id: https://develop.svn.wordpress.org/trunk@59478 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/l10n.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/l10n.php b/src/wp-includes/l10n.php index f9239f84b9e03..1ed9a6a1a88c9 100644 --- a/src/wp-includes/l10n.php +++ b/src/wp-includes/l10n.php @@ -963,7 +963,7 @@ function load_default_textdomain( $locale = null ) { return $return; } - if ( is_admin() || wp_installing() || ( defined( 'WP_REPAIRING' ) && WP_REPAIRING ) ) { + if ( is_admin() || wp_installing() || ( defined( 'WP_REPAIRING' ) && WP_REPAIRING ) || doing_action( 'wp_maybe_auto_update' ) ) { load_textdomain( 'default', WP_LANG_DIR . "/admin-$locale.mo", $locale ); } From daad8631f707f730530711ed874efe94c7fec968 Mon Sep 17 00:00:00 2001 From: Pascal Birchler <swissspidy@git.wordpress.org> Date: Mon, 2 Dec 2024 17:08:19 +0000 Subject: [PATCH 067/323] Plugins: Make more plugin-related functions available early on. This is a follow-up to [59461], which moved `get_plugin_data()` from `wp-admin/includes/plugin.php` to `wp-includes/functions.php` so it's available during the plugin loading process. Related functions like `is_plugin_active()` are often used together and should therefore be moved as well, to improve backward compatibility for plugins which load `wp-admin/includes/plugin.php` only conditionally. Props johnbillion, dd32, swissspidy. See #62244. git-svn-id: https://develop.svn.wordpress.org/trunk@59479 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/plugin.php | 91 -------------------------------- src/wp-includes/functions.php | 91 ++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 91 deletions(-) diff --git a/src/wp-admin/includes/plugin.php b/src/wp-admin/includes/plugin.php index 0969f956577ed..977801d92b010 100644 --- a/src/wp-admin/includes/plugin.php +++ b/src/wp-admin/includes/plugin.php @@ -304,97 +304,6 @@ function _get_dropins() { return $dropins; } -/** - * Determines whether a plugin is active. - * - * Only plugins installed in the plugins/ folder can be active. - * - * Plugins in the mu-plugins/ folder can't be "activated," so this function will - * return false for those plugins. - * - * For more information on this and similar theme functions, check out - * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ - * Conditional Tags} article in the Theme Developer Handbook. - * - * @since 2.5.0 - * - * @param string $plugin Path to the plugin file relative to the plugins directory. - * @return bool True, if in the active plugins list. False, not in the list. - */ -function is_plugin_active( $plugin ) { - return in_array( $plugin, (array) get_option( 'active_plugins', array() ), true ) || is_plugin_active_for_network( $plugin ); -} - -/** - * Determines whether the plugin is inactive. - * - * Reverse of is_plugin_active(). Used as a callback. - * - * For more information on this and similar theme functions, check out - * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ - * Conditional Tags} article in the Theme Developer Handbook. - * - * @since 3.1.0 - * - * @see is_plugin_active() - * - * @param string $plugin Path to the plugin file relative to the plugins directory. - * @return bool True if inactive. False if active. - */ -function is_plugin_inactive( $plugin ) { - return ! is_plugin_active( $plugin ); -} - -/** - * Determines whether the plugin is active for the entire network. - * - * Only plugins installed in the plugins/ folder can be active. - * - * Plugins in the mu-plugins/ folder can't be "activated," so this function will - * return false for those plugins. - * - * For more information on this and similar theme functions, check out - * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ - * Conditional Tags} article in the Theme Developer Handbook. - * - * @since 3.0.0 - * - * @param string $plugin Path to the plugin file relative to the plugins directory. - * @return bool True if active for the network, otherwise false. - */ -function is_plugin_active_for_network( $plugin ) { - if ( ! is_multisite() ) { - return false; - } - - $plugins = get_site_option( 'active_sitewide_plugins' ); - if ( isset( $plugins[ $plugin ] ) ) { - return true; - } - - return false; -} - -/** - * Checks for "Network: true" in the plugin header to see if this should - * be activated only as a network wide plugin. The plugin would also work - * when Multisite is not enabled. - * - * Checks for "Site Wide Only: true" for backward compatibility. - * - * @since 3.0.0 - * - * @param string $plugin Path to the plugin file relative to the plugins directory. - * @return bool True if plugin is network only, false otherwise. - */ -function is_network_only_plugin( $plugin ) { - $plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ); - if ( $plugin_data ) { - return $plugin_data['Network']; - } - return false; -} - /** * Attempts activation of plugin in a "sandbox" and redirects on success. * diff --git a/src/wp-includes/functions.php b/src/wp-includes/functions.php index dd0066cf3fb63..44f908a301f75 100644 --- a/src/wp-includes/functions.php +++ b/src/wp-includes/functions.php @@ -7145,6 +7145,97 @@ function _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup return $plugin_data; } +/** + * Determines whether a plugin is active. + * + * Only plugins installed in the plugins/ folder can be active. + * + * Plugins in the mu-plugins/ folder can't be "activated," so this function will + * return false for those plugins. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 2.5.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @return bool True, if in the active plugins list. False, not in the list. + */ +function is_plugin_active( $plugin ) { + return in_array( $plugin, (array) get_option( 'active_plugins', array() ), true ) || is_plugin_active_for_network( $plugin ); +} + +/** + * Determines whether the plugin is inactive. + * + * Reverse of is_plugin_active(). Used as a callback. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 3.1.0 + * + * @see is_plugin_active() + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @return bool True if inactive. False if active. + */ +function is_plugin_inactive( $plugin ) { + return ! is_plugin_active( $plugin ); +} + +/** + * Determines whether the plugin is active for the entire network. + * + * Only plugins installed in the plugins/ folder can be active. + * + * Plugins in the mu-plugins/ folder can't be "activated," so this function will + * return false for those plugins. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 3.0.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @return bool True if active for the network, otherwise false. + */ +function is_plugin_active_for_network( $plugin ) { + if ( ! is_multisite() ) { + return false; + } + + $plugins = get_site_option( 'active_sitewide_plugins' ); + if ( isset( $plugins[ $plugin ] ) ) { + return true; + } + + return false; +} + +/** + * Checks for "Network: true" in the plugin header to see if this should + * be activated only as a network wide plugin. The plugin would also work + * when Multisite is not enabled. + * + * Checks for "Site Wide Only: true" for backward compatibility. + * + * @since 3.0.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @return bool True if plugin is network only, false otherwise. + */ +function is_network_only_plugin( $plugin ) { + $plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ); + if ( $plugin_data ) { + return $plugin_data['Network']; + } + return false; +} + /** * Returns true. * From d93b275c3a5bbbbaf74690c1894d54da64fb3467 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Mon, 2 Dec 2024 23:34:02 +0000 Subject: [PATCH 068/323] Customize: Begin HTML markup before Customizer script hooks. This prevents printing styles and scripts before the `<!DOCTYPE>`. The `_wp_admin_html_begin()` function should precede Customizer script hooks, in case a plugin prints markup inside a hook such as `admin_enqueue_scripts`. Follow-up to [19995], [27907]. Props sabernhardt. Fixes #62629. git-svn-id: https://develop.svn.wordpress.org/trunk@59480 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/customize.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/wp-admin/customize.php b/src/wp-admin/customize.php index 40857031a7ef8..b27292d9eb949 100644 --- a/src/wp-admin/customize.php +++ b/src/wp-admin/customize.php @@ -100,6 +100,12 @@ $wp_customize->set_autofocus( $autofocus ); } +// Let's roll. +header( 'Content-Type: ' . get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ) ); + +wp_user_settings(); +_wp_admin_html_begin(); + $registered = $wp_scripts->registered; $wp_scripts = new WP_Scripts(); $wp_scripts->registered = $registered; @@ -126,12 +132,6 @@ */ do_action( 'customize_controls_enqueue_scripts' ); -// Let's roll. -header( 'Content-Type: ' . get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ) ); - -wp_user_settings(); -_wp_admin_html_begin(); - $body_class = 'wp-core-ui wp-customizer js'; if ( wp_is_mobile() ) : From 8eb8d634095e9b6716e977abd1085bab8d703e6f Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Tue, 3 Dec 2024 15:20:13 +0000 Subject: [PATCH 069/323] External Libraries: Upgrade PHPMailer to version 6.9.3. This is a maintenance release, adding support for the release version of PHP 8.4, and experimental support for PHP 8.5. References: * [https://github.com/PHPMailer/PHPMailer/releases/tag/v6.9.3 PHPMailer 6.9.3 release notes] * [https://github.com/PHPMailer/PHPMailer/compare/v6.9.2...v6.9.3 Full list of changes in PHPMailer 6.9.3] Follow-up to [50628], [50799], [51169], [51634], [51635], [52252], [52749], [52811], [53500], [53535], [53917], [54427], [54937], [55557], [56484], [57137], [59246]. Props desrosj, yogeshbhutkar, ayeshrajans. Fixes #62632. git-svn-id: https://develop.svn.wordpress.org/trunk@59481 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/PHPMailer/PHPMailer.php | 20 ++++++++++---------- src/wp-includes/PHPMailer/SMTP.php | 12 ++++++------ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/wp-includes/PHPMailer/PHPMailer.php b/src/wp-includes/PHPMailer/PHPMailer.php index 0bc29b7832e6e..31731594f12ec 100644 --- a/src/wp-includes/PHPMailer/PHPMailer.php +++ b/src/wp-includes/PHPMailer/PHPMailer.php @@ -253,7 +253,7 @@ class PHPMailer * You can set your own, but it must be in the format "<id@domain>", * as defined in RFC5322 section 3.6.4 or it will be ignored. * - * @see https://tools.ietf.org/html/rfc5322#section-3.6.4 + * @see https://www.rfc-editor.org/rfc/rfc5322#section-3.6.4 * * @var string */ @@ -387,7 +387,7 @@ class PHPMailer * 'DELAY' will notify you if there is an unusual delay in delivery, but the actual * delivery's outcome (success or failure) is not yet decided. * - * @see https://tools.ietf.org/html/rfc3461 See section 4.1 for more information about NOTIFY + * @see https://www.rfc-editor.org/rfc/rfc3461.html#section-4.1 for more information about NOTIFY */ public $dsn = ''; @@ -756,7 +756,7 @@ class PHPMailer * * @var string */ - const VERSION = '6.9.2'; + const VERSION = '6.9.3'; /** * Error severity: message only, continue processing. @@ -1873,7 +1873,7 @@ protected static function isShellSafe($string) */ protected static function isPermittedPath($path) { - //Matches scheme definition from https://tools.ietf.org/html/rfc3986#section-3.1 + //Matches scheme definition from https://www.rfc-editor.org/rfc/rfc3986#section-3.1 return !preg_match('#^[a-z][a-z\d+.-]*://#i', $path); } @@ -2707,7 +2707,7 @@ public function createHeader() } //Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4 - //https://tools.ietf.org/html/rfc5322#section-3.6.4 + //https://www.rfc-editor.org/rfc/rfc5322#section-3.6.4 if ( '' !== $this->MessageID && preg_match( @@ -4912,7 +4912,7 @@ public function DKIM_Sign($signHeader) * Uses the 'relaxed' algorithm from RFC6376 section 3.4.2. * Canonicalized headers should *always* use CRLF, regardless of mailer setting. * - * @see https://tools.ietf.org/html/rfc6376#section-3.4.2 + * @see https://www.rfc-editor.org/rfc/rfc6376#section-3.4.2 * * @param string $signHeader Header * @@ -4924,7 +4924,7 @@ public function DKIM_HeaderC($signHeader) $signHeader = static::normalizeBreaks($signHeader, self::CRLF); //Unfold header lines //Note PCRE \s is too broad a definition of whitespace; RFC5322 defines it as `[ \t]` - //@see https://tools.ietf.org/html/rfc5322#section-2.2 + //@see https://www.rfc-editor.org/rfc/rfc5322#section-2.2 //That means this may break if you do something daft like put vertical tabs in your headers. $signHeader = preg_replace('/\r\n[ \t]+/', ' ', $signHeader); //Break headers out into an array @@ -4956,7 +4956,7 @@ public function DKIM_HeaderC($signHeader) * Uses the 'simple' algorithm from RFC6376 section 3.4.3. * Canonicalized bodies should *always* use CRLF, regardless of mailer setting. * - * @see https://tools.ietf.org/html/rfc6376#section-3.4.3 + * @see https://www.rfc-editor.org/rfc/rfc6376#section-3.4.3 * * @param string $body Message Body * @@ -4992,7 +4992,7 @@ public function DKIM_Add($headers_line, $subject, $body) $DKIMquery = 'dns/txt'; //Query method $DKIMtime = time(); //Always sign these headers without being asked - //Recommended list from https://tools.ietf.org/html/rfc6376#section-5.4.1 + //Recommended list from https://www.rfc-editor.org/rfc/rfc6376#section-5.4.1 $autoSignHeaders = [ 'from', 'to', @@ -5098,7 +5098,7 @@ public function DKIM_Add($headers_line, $subject, $body) } //The DKIM-Signature header is included in the signature *except for* the value of the `b` tag //which is appended after calculating the signature - //https://tools.ietf.org/html/rfc6376#section-3.5 + //https://www.rfc-editor.org/rfc/rfc6376#section-3.5 $dkimSignatureHeader = 'DKIM-Signature: v=1;' . ' d=' . $this->DKIM_domain . ';' . ' s=' . $this->DKIM_selector . ';' . static::$LE . diff --git a/src/wp-includes/PHPMailer/SMTP.php b/src/wp-includes/PHPMailer/SMTP.php index 5b238b5279758..b4eff40424ffc 100644 --- a/src/wp-includes/PHPMailer/SMTP.php +++ b/src/wp-includes/PHPMailer/SMTP.php @@ -35,7 +35,7 @@ class SMTP * * @var string */ - const VERSION = '6.9.2'; + const VERSION = '6.9.3'; /** * SMTP line break constant. @@ -62,7 +62,7 @@ class SMTP * The maximum line length allowed by RFC 5321 section 4.5.3.1.6, * *excluding* a trailing CRLF break. * - * @see https://tools.ietf.org/html/rfc5321#section-4.5.3.1.6 + * @see https://www.rfc-editor.org/rfc/rfc5321#section-4.5.3.1.6 * * @var int */ @@ -72,7 +72,7 @@ class SMTP * The maximum line length allowed for replies in RFC 5321 section 4.5.3.1.5, * *including* a trailing CRLF line break. * - * @see https://tools.ietf.org/html/rfc5321#section-4.5.3.1.5 + * @see https://www.rfc-editor.org/rfc/rfc5321#section-4.5.3.1.5 * * @var int */ @@ -373,7 +373,7 @@ public function connect($host, $port = null, $timeout = 30, $options = []) } //Anything other than a 220 response means something went wrong //RFC 5321 says the server will wait for us to send a QUIT in response to a 554 error - //https://tools.ietf.org/html/rfc5321#section-3.1 + //https://www.rfc-editor.org/rfc/rfc5321#section-3.1 if ($responseCode === 554) { $this->quit(); } @@ -582,7 +582,7 @@ public function authenticate( } //Send encoded username and password if ( - //Format from https://tools.ietf.org/html/rfc4616#section-2 + //Format from https://www.rfc-editor.org/rfc/rfc4616#section-2 //We skip the first field (it's forgery), so the string starts with a null byte !$this->sendCommand( 'User & Password', @@ -795,7 +795,7 @@ public function data($msg_data) //Send the lines to the server foreach ($lines_out as $line_out) { //Dot-stuffing as per RFC5321 section 4.5.2 - //https://tools.ietf.org/html/rfc5321#section-4.5.2 + //https://www.rfc-editor.org/rfc/rfc5321#section-4.5.2 if (!empty($line_out) && $line_out[0] === '.') { $line_out = '.' . $line_out; } From 1d49212bb97622e0773652cf1972b86fd08fca22 Mon Sep 17 00:00:00 2001 From: bernhard-reiter <bernhard-reiter@git.wordpress.org> Date: Wed, 4 Dec 2024 12:05:33 +0000 Subject: [PATCH 070/323] Block Hooks: Fix context in `update_ignored_hooked_blocks_postmeta`. Ensure that the `$context` arg passed from `update_ignored_hooked_blocks_postmeta` to `apply_block_hooks_to_content` (and from there, to filters such as `hooked_block_types` and `hooked_block`) has the correct type (`WP_Post`). Filters hooked to `hooked_block_types` etc can typically include checks that conditionally insert a hooked block depending on `$context`. Prior to this changeset, a check like `if ( $context instanceof WP_Post )` would incorrectly fail, as `$context` would be a `stdClass` instance rather than a `WP_Post`. As a consequence, a hooked block inside of a Navigation post object that was modified by the user would not be marked as ignored by `update_ignored_hooked_blocks_postmeta`, and thus be erroneosly re-inserted by the Block Hooks algorithm. Props bernhard-reiter. Fixes #62639. git-svn-id: https://develop.svn.wordpress.org/trunk@59482 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/blocks.php | 1 + .../updateIgnoredHookedBlocksPostMeta.php | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index 9d8f4bfaf9845..94c4dfa43afb6 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -1217,6 +1217,7 @@ function update_ignored_hooked_blocks_postmeta( $post ) { $existing_post = get_post( $post->ID ); // Merge the existing post object with the updated post object to pass to the block hooks algorithm for context. $context = (object) array_merge( (array) $existing_post, (array) $post ); + $context = new WP_Post( $context ); // Convert to WP_Post object. $serialized_block = apply_block_hooks_to_content( $markup, $context, 'set_ignored_hooked_blocks_metadata' ); $root_block = parse_blocks( $serialized_block )[0]; diff --git a/tests/phpunit/tests/blocks/updateIgnoredHookedBlocksPostMeta.php b/tests/phpunit/tests/blocks/updateIgnoredHookedBlocksPostMeta.php index 7b0a830dd52dd..18b5eff08ba79 100644 --- a/tests/phpunit/tests/blocks/updateIgnoredHookedBlocksPostMeta.php +++ b/tests/phpunit/tests/blocks/updateIgnoredHookedBlocksPostMeta.php @@ -193,4 +193,31 @@ public function test_update_ignored_hooked_blocks_postmeta_dont_modify_if_no_pos 'Post content did not match the original markup.' ); } + + /** + * @ticket 62639 + */ + public function test_update_ignored_hooked_blocks_postmeta_sets_correct_context_type() { + $action = new MockAction(); + add_filter( 'hooked_block_types', array( $action, 'filter' ), 10, 4 ); + + $original_markup = '<!-- wp:navigation-link {"label":"News","type":"page","id":2,"url":"http://localhost:8888/?page_id=2","kind":"post-type"} /-->'; + $post = new stdClass(); + $post->ID = self::$navigation_post->ID; + $post->post_content = $original_markup; + $post->post_type = 'wp_navigation'; + + $post = update_ignored_hooked_blocks_postmeta( $post ); + + $args = $action->get_args(); + $contexts = array_column( $args, 3 ); + + foreach ( $contexts as $context ) { + $this->assertInstanceOf( + WP_Post::class, + $context, + 'The context passed to the hooked_block_types filter is not a WP_Post instance.' + ); + } + } } From d576e249754ee902dfbb2d07364e694307396be0 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Wed, 4 Dec 2024 14:41:26 +0000 Subject: [PATCH 071/323] Build/Test Tools: Add `repository` input to support JSON reading workflow. `actions/checkout` will always checkout the current repository unless the `repository` input is specified. This updates the `reusable-support-json-reader-v1.yml` workflow to always default to reading the JSON files from `wordpress-develop`. A `repository` has also been added to the workflow to allow a different set of JSON files to be read if desired. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59483 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-support-json-reader-v1.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/reusable-support-json-reader-v1.yml b/.github/workflows/reusable-support-json-reader-v1.yml index 2adc15cebdee1..f1843cd5aa79b 100644 --- a/.github/workflows/reusable-support-json-reader-v1.yml +++ b/.github/workflows/reusable-support-json-reader-v1.yml @@ -11,6 +11,10 @@ on: description: 'The WordPress version to test . Accepts major and minor versions, "latest", or "nightly". Major releases must not end with ".0".' type: string default: 'nightly' + repository: + description: 'The repository to read support JSON files from.' + type: string + default: 'WordPress/wordpress-develop' outputs: major-wp-version: description: "The major WordPress version based on the version provided in wp-version" @@ -42,6 +46,7 @@ jobs: - name: Checkout repository uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: + repository: ${{ inputs.repository }} show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} - name: Determine the major WordPress version @@ -74,6 +79,7 @@ jobs: - name: Checkout repository uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: + repository: ${{ inputs.repository }} show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} # Look up the major version's specific PHP support policy when a version is provided. @@ -106,6 +112,7 @@ jobs: - name: Checkout repository uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: + repository: ${{ inputs.repository }} show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} # Look up the major version's specific MySQL support policy when a version is provided. From ea80ac8082ab983b91324836f466a8b585fe8590 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Wed, 4 Dec 2024 15:16:02 +0000 Subject: [PATCH 072/323] Build/Test Tools: Support older MariaDB versions in local Docker environment. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Older versions of MariaDB did not contain the `mariadb-admin` command. This command is configured as the `healthcheck` used by the local Docker environment to confirm that the database container has successfully started and is reporting as “healthy”. The current result is a failure when starting the environment while using one of the affected older versions. For MariaDB versions 10.3 and earlier, the `mysqladmin` command was used instead. Since WordPress still technically supports back to MariaDB 5.5, the local environment should support running these versions. This updates the environment configuration to take this into account when performing a `healthcheck` test. The README file is also updated to reflect that the same workaround added in [57568] for MySQL <= 5.7 is required when using MariaDB 5.5 on an Apple silicon machine. Props johnbillion. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59484 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-phpunit-tests-v3.yml | 2 +- README.md | 9 ++++++--- docker-compose.yml | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index 56e40e762cd27..fd21b3a9b48f5 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -171,7 +171,7 @@ jobs: - name: WordPress Docker container debug information run: | - docker compose run --rm mysql ${{ env.LOCAL_DB_TYPE }} --version + docker compose run --rm mysql ${{ env.LOCAL_DB_TYPE == 'mariadb' && contains( fromJSON('["5.5", "10.0", "10.1", "10.2", "10.3"]'), env.LOCAL_DB_VERSION ) && 'mysql' || env.LOCAL_DB_TYPE }} --version docker compose run --rm php php --version docker compose run --rm php php -m docker compose run --rm php php -i diff --git a/README.md b/README.md index adb4fc946d9a8..fc8c00f6821af 100644 --- a/README.md +++ b/README.md @@ -139,11 +139,14 @@ The development environment can be reset. This will destroy the database and att npm run env:reset ``` -### Apple Silicon machines and old MySQL versions +### Apple Silicon machines and old MySQL/MariaDB versions -The MySQL Docker images do not support Apple Silicon processors (M1, M2, etc.) for MySQL versions 5.7 and earlier. +Older MySQL and MariaDB Docker images do not support Apple Silicon processors (M1, M2, etc.). This is true for: -When using MySQL <= 5.7 on an Apple Silicon machine, you must create a `docker-compose.override.yml` file with the following contents: +- MySQL versions 5.7 and earlier +- MariaDB 5.5 + +When using these versions on an Apple Silicon machine, you must create a `docker-compose.override.yml` file with the following contents: ``` services: diff --git a/docker-compose.yml b/docker-compose.yml index 8b90b678a00a2..a95735fdd35a0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -82,7 +82,7 @@ services: command: ${LOCAL_DB_AUTH_OPTION-} healthcheck: - test: [ "CMD-SHELL", "if [ \"$LOCAL_DB_TYPE\" = \"mariadb\" ]; then mariadb-admin ping -h localhost; else mysqladmin ping -h localhost; fi" ] + test: [ "CMD-SHELL", "if [ \"$LOCAL_DB_TYPE\" = \"mariadb\" ]; then case \"$LOCAL_DB_VERSION\" in 5.5|10.0|10.1|10.2|10.3) mysqladmin ping -h localhost || exit $?;; *) mariadb-admin ping -h localhost || exit $?;; esac; else mysqladmin ping -h localhost || exit $?; fi" ] timeout: 5s interval: 5s retries: 10 From 9558c1f48a5d118791e09a0184d22b4872714b7b Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Wed, 4 Dec 2024 15:25:18 +0000 Subject: [PATCH 073/323] Build/Test Tools: Run install tests when JSON reading workflow is changed. Because the installation testing workflow relies on the reusable workflow that reads the JSON support files, it should be run when that file is changed to confirm there are no issues. This is currently only configured for `pull_request` events, but should also be true for `push`. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59485 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/install-testing.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/install-testing.yml b/.github/workflows/install-testing.yml index c9de4a73abf25..ca03ebd518a00 100644 --- a/.github/workflows/install-testing.yml +++ b/.github/workflows/install-testing.yml @@ -11,6 +11,7 @@ on: paths: - '.github/workflows/install-testing.yml' - '.version-support-*.json' + - '.github/workflows/reusable-support-json-reader-v1.yml' pull_request: # Always test the workflow when changes are suggested. paths: From 7d3ce7a591eb8fe85e626a1e288d5c1528a54321 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Wed, 4 Dec 2024 23:36:04 +0000 Subject: [PATCH 074/323] Docs: Remove blank line at the end of `wp_prepare_attachment_for_js()` DocBlock. Follow-up to [21680], [49281]. Props nareshbheda. Fixes #62642. git-svn-id: https://develop.svn.wordpress.org/trunk@59486 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/media.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/wp-includes/media.php b/src/wp-includes/media.php index 00e23ff53d7ef..2f280a58790c9 100644 --- a/src/wp-includes/media.php +++ b/src/wp-includes/media.php @@ -4455,7 +4455,6 @@ function wp_plupload_default_settings() { * @type string $url Direct URL to the attachment file (from wp-content). * @type int $width If the attachment is an image, represents the width of the image in pixels. * } - * */ function wp_prepare_attachment_for_js( $attachment ) { $attachment = get_post( $attachment ); From b67c76ebc616f77f1a3349362dbcc262397da99c Mon Sep 17 00:00:00 2001 From: Pascal Birchler <swissspidy@git.wordpress.org> Date: Thu, 5 Dec 2024 12:11:27 +0000 Subject: [PATCH 075/323] Plugins: Load `wp-admin/includes/plugin.php` earlier. Partially reverts [59479] and [59461], which previously tried to move some functions from `wp-admin/includes/plugin.php` to `wp-includes/functions.php` so they are available early, so that `get_plugin_data()` can be used. However, other functions from that file are often used by plugins without necessarily checking whether they are available, easily causing fatal errors. Requiring this file directly is a safer approach to avoid such errors. Props peterwilsoncc, dd32, swissspidy, johnbillion. Fixes #62244. git-svn-id: https://develop.svn.wordpress.org/trunk@59488 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/plugin.php | 306 +++++++++++++++++++++++++++++++ src/wp-includes/functions.php | 306 ------------------------------- src/wp-settings.php | 3 + 3 files changed, 309 insertions(+), 306 deletions(-) diff --git a/src/wp-admin/includes/plugin.php b/src/wp-admin/includes/plugin.php index 977801d92b010..de1468352b3d9 100644 --- a/src/wp-admin/includes/plugin.php +++ b/src/wp-admin/includes/plugin.php @@ -6,6 +6,221 @@ * @subpackage Administration */ +/** + * Parses the plugin contents to retrieve plugin's metadata. + * + * All plugin headers must be on their own line. Plugin description must not have + * any newlines, otherwise only parts of the description will be displayed. + * The below is formatted for printing. + * + * /* + * Plugin Name: Name of the plugin. + * Plugin URI: The home page of the plugin. + * Description: Plugin description. + * Author: Plugin author's name. + * Author URI: Link to the author's website. + * Version: Plugin version. + * Text Domain: Optional. Unique identifier, should be same as the one used in + * load_plugin_textdomain(). + * Domain Path: Optional. Only useful if the translations are located in a + * folder above the plugin's base path. For example, if .mo files are + * located in the locale folder then Domain Path will be "/locale/" and + * must have the first slash. Defaults to the base folder the plugin is + * located in. + * Network: Optional. Specify "Network: true" to require that a plugin is activated + * across all sites in an installation. This will prevent a plugin from being + * activated on a single site when Multisite is enabled. + * Requires at least: Optional. Specify the minimum required WordPress version. + * Requires PHP: Optional. Specify the minimum required PHP version. + * * / # Remove the space to close comment. + * + * The first 8 KB of the file will be pulled in and if the plugin data is not + * within that first 8 KB, then the plugin author should correct their plugin + * and move the plugin data headers to the top. + * + * The plugin file is assumed to have permissions to allow for scripts to read + * the file. This is not checked however and the file is only opened for + * reading. + * + * @since 1.5.0 + * @since 5.3.0 Added support for `Requires at least` and `Requires PHP` headers. + * @since 5.8.0 Added support for `Update URI` header. + * @since 6.5.0 Added support for `Requires Plugins` header. + * + * @param string $plugin_file Absolute path to the main plugin file. + * @param bool $markup Optional. If the returned data should have HTML markup applied. + * Default true. + * @param bool $translate Optional. If the returned data should be translated. Default true. + * @return array { + * Plugin data. Values will be empty if not supplied by the plugin. + * + * @type string $Name Name of the plugin. Should be unique. + * @type string $PluginURI Plugin URI. + * @type string $Version Plugin version. + * @type string $Description Plugin description. + * @type string $Author Plugin author's name. + * @type string $AuthorURI Plugin author's website address (if set). + * @type string $TextDomain Plugin textdomain. + * @type string $DomainPath Plugin's relative directory path to .mo files. + * @type bool $Network Whether the plugin can only be activated network-wide. + * @type string $RequiresWP Minimum required version of WordPress. + * @type string $RequiresPHP Minimum required version of PHP. + * @type string $UpdateURI ID of the plugin for update purposes, should be a URI. + * @type string $RequiresPlugins Comma separated list of dot org plugin slugs. + * @type string $Title Title of the plugin and link to the plugin's site (if set). + * @type string $AuthorName Plugin author's name. + * } + */ +function get_plugin_data( $plugin_file, $markup = true, $translate = true ) { + + $default_headers = array( + 'Name' => 'Plugin Name', + 'PluginURI' => 'Plugin URI', + 'Version' => 'Version', + 'Description' => 'Description', + 'Author' => 'Author', + 'AuthorURI' => 'Author URI', + 'TextDomain' => 'Text Domain', + 'DomainPath' => 'Domain Path', + 'Network' => 'Network', + 'RequiresWP' => 'Requires at least', + 'RequiresPHP' => 'Requires PHP', + 'UpdateURI' => 'Update URI', + 'RequiresPlugins' => 'Requires Plugins', + // Site Wide Only is deprecated in favor of Network. + '_sitewide' => 'Site Wide Only', + ); + + $plugin_data = get_file_data( $plugin_file, $default_headers, 'plugin' ); + + // Site Wide Only is the old header for Network. + if ( ! $plugin_data['Network'] && $plugin_data['_sitewide'] ) { + /* translators: 1: Site Wide Only: true, 2: Network: true */ + _deprecated_argument( __FUNCTION__, '3.0.0', sprintf( __( 'The %1$s plugin header is deprecated. Use %2$s instead.' ), '<code>Site Wide Only: true</code>', '<code>Network: true</code>' ) ); + $plugin_data['Network'] = $plugin_data['_sitewide']; + } + $plugin_data['Network'] = ( 'true' === strtolower( $plugin_data['Network'] ) ); + unset( $plugin_data['_sitewide'] ); + + // If no text domain is defined fall back to the plugin slug. + if ( ! $plugin_data['TextDomain'] ) { + $plugin_slug = dirname( plugin_basename( $plugin_file ) ); + if ( '.' !== $plugin_slug && ! str_contains( $plugin_slug, '/' ) ) { + $plugin_data['TextDomain'] = $plugin_slug; + } + } + + if ( $markup || $translate ) { + $plugin_data = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup, $translate ); + } else { + $plugin_data['Title'] = $plugin_data['Name']; + $plugin_data['AuthorName'] = $plugin_data['Author']; + } + + return $plugin_data; +} + +/** + * Sanitizes plugin data, optionally adds markup, optionally translates. + * + * @since 2.7.0 + * + * @see get_plugin_data() + * + * @access private + * + * @param string $plugin_file Path to the main plugin file. + * @param array $plugin_data An array of plugin data. See get_plugin_data(). + * @param bool $markup Optional. If the returned data should have HTML markup applied. + * Default true. + * @param bool $translate Optional. If the returned data should be translated. Default true. + * @return array Plugin data. Values will be empty if not supplied by the plugin. + * See get_plugin_data() for the list of possible values. + */ +function _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup = true, $translate = true ) { + + // Sanitize the plugin filename to a WP_PLUGIN_DIR relative path. + $plugin_file = plugin_basename( $plugin_file ); + + // Translate fields. + if ( $translate ) { + $textdomain = $plugin_data['TextDomain']; + if ( $textdomain ) { + if ( ! is_textdomain_loaded( $textdomain ) ) { + if ( $plugin_data['DomainPath'] ) { + load_plugin_textdomain( $textdomain, false, dirname( $plugin_file ) . $plugin_data['DomainPath'] ); + } else { + load_plugin_textdomain( $textdomain, false, dirname( $plugin_file ) ); + } + } + } elseif ( 'hello.php' === basename( $plugin_file ) ) { + $textdomain = 'default'; + } + if ( $textdomain ) { + foreach ( array( 'Name', 'PluginURI', 'Description', 'Author', 'AuthorURI', 'Version' ) as $field ) { + if ( ! empty( $plugin_data[ $field ] ) ) { + // phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain + $plugin_data[ $field ] = translate( $plugin_data[ $field ], $textdomain ); + } + } + } + } + + // Sanitize fields. + $allowed_tags_in_links = array( + 'abbr' => array( 'title' => true ), + 'acronym' => array( 'title' => true ), + 'code' => true, + 'em' => true, + 'strong' => true, + ); + + $allowed_tags = $allowed_tags_in_links; + $allowed_tags['a'] = array( + 'href' => true, + 'title' => true, + ); + + /* + * Name is marked up inside <a> tags. Don't allow these. + * Author is too, but some plugins have used <a> here (omitting Author URI). + */ + $plugin_data['Name'] = wp_kses( $plugin_data['Name'], $allowed_tags_in_links ); + $plugin_data['Author'] = wp_kses( $plugin_data['Author'], $allowed_tags ); + + $plugin_data['Description'] = wp_kses( $plugin_data['Description'], $allowed_tags ); + $plugin_data['Version'] = wp_kses( $plugin_data['Version'], $allowed_tags ); + + $plugin_data['PluginURI'] = esc_url( $plugin_data['PluginURI'] ); + $plugin_data['AuthorURI'] = esc_url( $plugin_data['AuthorURI'] ); + + $plugin_data['Title'] = $plugin_data['Name']; + $plugin_data['AuthorName'] = $plugin_data['Author']; + + // Apply markup. + if ( $markup ) { + if ( $plugin_data['PluginURI'] && $plugin_data['Name'] ) { + $plugin_data['Title'] = '<a href="' . $plugin_data['PluginURI'] . '">' . $plugin_data['Name'] . '</a>'; + } + + if ( $plugin_data['AuthorURI'] && $plugin_data['Author'] ) { + $plugin_data['Author'] = '<a href="' . $plugin_data['AuthorURI'] . '">' . $plugin_data['Author'] . '</a>'; + } + + $plugin_data['Description'] = wptexturize( $plugin_data['Description'] ); + + if ( $plugin_data['Author'] ) { + $plugin_data['Description'] .= sprintf( + /* translators: %s: Plugin author. */ + ' <cite>' . __( 'By %s.' ) . '</cite>', + $plugin_data['Author'] + ); + } + } + + return $plugin_data; +} + /** * Gets a list of a plugin's files. * @@ -304,6 +519,97 @@ function _get_dropins() { return $dropins; } +/** + * Determines whether a plugin is active. + * + * Only plugins installed in the plugins/ folder can be active. + * + * Plugins in the mu-plugins/ folder can't be "activated," so this function will + * return false for those plugins. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 2.5.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @return bool True, if in the active plugins list. False, not in the list. + */ +function is_plugin_active( $plugin ) { + return in_array( $plugin, (array) get_option( 'active_plugins', array() ), true ) || is_plugin_active_for_network( $plugin ); +} + +/** + * Determines whether the plugin is inactive. + * + * Reverse of is_plugin_active(). Used as a callback. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 3.1.0 + * + * @see is_plugin_active() + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @return bool True if inactive. False if active. + */ +function is_plugin_inactive( $plugin ) { + return ! is_plugin_active( $plugin ); +} + +/** + * Determines whether the plugin is active for the entire network. + * + * Only plugins installed in the plugins/ folder can be active. + * + * Plugins in the mu-plugins/ folder can't be "activated," so this function will + * return false for those plugins. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 3.0.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @return bool True if active for the network, otherwise false. + */ +function is_plugin_active_for_network( $plugin ) { + if ( ! is_multisite() ) { + return false; + } + + $plugins = get_site_option( 'active_sitewide_plugins' ); + if ( isset( $plugins[ $plugin ] ) ) { + return true; + } + + return false; +} + +/** + * Checks for "Network: true" in the plugin header to see if this should + * be activated only as a network wide plugin. The plugin would also work + * when Multisite is not enabled. + * + * Checks for "Site Wide Only: true" for backward compatibility. + * + * @since 3.0.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @return bool True if plugin is network only, false otherwise. + */ +function is_network_only_plugin( $plugin ) { + $plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ); + if ( $plugin_data ) { + return $plugin_data['Network']; + } + return false; +} + /** * Attempts activation of plugin in a "sandbox" and redirects on success. * diff --git a/src/wp-includes/functions.php b/src/wp-includes/functions.php index 44f908a301f75..7e46dd53cab2d 100644 --- a/src/wp-includes/functions.php +++ b/src/wp-includes/functions.php @@ -6930,312 +6930,6 @@ function get_file_data( $file, $default_headers, $context = '' ) { return $all_headers; } -/** - * Parses the plugin contents to retrieve plugin's metadata. - * - * All plugin headers must be on their own line. Plugin description must not have - * any newlines, otherwise only parts of the description will be displayed. - * The below is formatted for printing. - * - * /* - * Plugin Name: Name of the plugin. - * Plugin URI: The home page of the plugin. - * Description: Plugin description. - * Author: Plugin author's name. - * Author URI: Link to the author's website. - * Version: Plugin version. - * Text Domain: Optional. Unique identifier, should be same as the one used in - * load_plugin_textdomain(). - * Domain Path: Optional. Only useful if the translations are located in a - * folder above the plugin's base path. For example, if .mo files are - * located in the locale folder then Domain Path will be "/locale/" and - * must have the first slash. Defaults to the base folder the plugin is - * located in. - * Network: Optional. Specify "Network: true" to require that a plugin is activated - * across all sites in an installation. This will prevent a plugin from being - * activated on a single site when Multisite is enabled. - * Requires at least: Optional. Specify the minimum required WordPress version. - * Requires PHP: Optional. Specify the minimum required PHP version. - * * / # Remove the space to close comment. - * - * The first 8 KB of the file will be pulled in and if the plugin data is not - * within that first 8 KB, then the plugin author should correct their plugin - * and move the plugin data headers to the top. - * - * The plugin file is assumed to have permissions to allow for scripts to read - * the file. This is not checked however and the file is only opened for - * reading. - * - * @since 1.5.0 - * @since 5.3.0 Added support for `Requires at least` and `Requires PHP` headers. - * @since 5.8.0 Added support for `Update URI` header. - * @since 6.5.0 Added support for `Requires Plugins` header. - * - * @param string $plugin_file Absolute path to the main plugin file. - * @param bool $markup Optional. If the returned data should have HTML markup applied. - * Default true. - * @param bool $translate Optional. If the returned data should be translated. Default true. - * @return array { - * Plugin data. Values will be empty if not supplied by the plugin. - * - * @type string $Name Name of the plugin. Should be unique. - * @type string $PluginURI Plugin URI. - * @type string $Version Plugin version. - * @type string $Description Plugin description. - * @type string $Author Plugin author's name. - * @type string $AuthorURI Plugin author's website address (if set). - * @type string $TextDomain Plugin textdomain. - * @type string $DomainPath Plugin's relative directory path to .mo files. - * @type bool $Network Whether the plugin can only be activated network-wide. - * @type string $RequiresWP Minimum required version of WordPress. - * @type string $RequiresPHP Minimum required version of PHP. - * @type string $UpdateURI ID of the plugin for update purposes, should be a URI. - * @type string $RequiresPlugins Comma separated list of dot org plugin slugs. - * @type string $Title Title of the plugin and link to the plugin's site (if set). - * @type string $AuthorName Plugin author's name. - * } - */ -function get_plugin_data( $plugin_file, $markup = true, $translate = true ) { - - $default_headers = array( - 'Name' => 'Plugin Name', - 'PluginURI' => 'Plugin URI', - 'Version' => 'Version', - 'Description' => 'Description', - 'Author' => 'Author', - 'AuthorURI' => 'Author URI', - 'TextDomain' => 'Text Domain', - 'DomainPath' => 'Domain Path', - 'Network' => 'Network', - 'RequiresWP' => 'Requires at least', - 'RequiresPHP' => 'Requires PHP', - 'UpdateURI' => 'Update URI', - 'RequiresPlugins' => 'Requires Plugins', - // Site Wide Only is deprecated in favor of Network. - '_sitewide' => 'Site Wide Only', - ); - - $plugin_data = get_file_data( $plugin_file, $default_headers, 'plugin' ); - - // Site Wide Only is the old header for Network. - if ( ! $plugin_data['Network'] && $plugin_data['_sitewide'] ) { - /* translators: 1: Site Wide Only: true, 2: Network: true */ - _deprecated_argument( __FUNCTION__, '3.0.0', sprintf( __( 'The %1$s plugin header is deprecated. Use %2$s instead.' ), '<code>Site Wide Only: true</code>', '<code>Network: true</code>' ) ); - $plugin_data['Network'] = $plugin_data['_sitewide']; - } - $plugin_data['Network'] = ( 'true' === strtolower( $plugin_data['Network'] ) ); - unset( $plugin_data['_sitewide'] ); - - // If no text domain is defined fall back to the plugin slug. - if ( ! $plugin_data['TextDomain'] ) { - $plugin_slug = dirname( plugin_basename( $plugin_file ) ); - if ( '.' !== $plugin_slug && ! str_contains( $plugin_slug, '/' ) ) { - $plugin_data['TextDomain'] = $plugin_slug; - } - } - - if ( $markup || $translate ) { - $plugin_data = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup, $translate ); - } else { - $plugin_data['Title'] = $plugin_data['Name']; - $plugin_data['AuthorName'] = $plugin_data['Author']; - } - - return $plugin_data; -} - -/** - * Sanitizes plugin data, optionally adds markup, optionally translates. - * - * @since 2.7.0 - * - * @see get_plugin_data() - * - * @access private - * - * @param string $plugin_file Path to the main plugin file. - * @param array $plugin_data An array of plugin data. See get_plugin_data(). - * @param bool $markup Optional. If the returned data should have HTML markup applied. - * Default true. - * @param bool $translate Optional. If the returned data should be translated. Default true. - * @return array Plugin data. Values will be empty if not supplied by the plugin. - * See get_plugin_data() for the list of possible values. - */ -function _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup = true, $translate = true ) { - - // Sanitize the plugin filename to a WP_PLUGIN_DIR relative path. - $plugin_file = plugin_basename( $plugin_file ); - - // Translate fields. - if ( $translate ) { - $textdomain = $plugin_data['TextDomain']; - if ( $textdomain ) { - if ( ! is_textdomain_loaded( $textdomain ) ) { - if ( $plugin_data['DomainPath'] ) { - load_plugin_textdomain( $textdomain, false, dirname( $plugin_file ) . $plugin_data['DomainPath'] ); - } else { - load_plugin_textdomain( $textdomain, false, dirname( $plugin_file ) ); - } - } - } elseif ( 'hello.php' === basename( $plugin_file ) ) { - $textdomain = 'default'; - } - if ( $textdomain ) { - foreach ( array( 'Name', 'PluginURI', 'Description', 'Author', 'AuthorURI', 'Version' ) as $field ) { - if ( ! empty( $plugin_data[ $field ] ) ) { - // phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain - $plugin_data[ $field ] = translate( $plugin_data[ $field ], $textdomain ); - } - } - } - } - - // Sanitize fields. - $allowed_tags_in_links = array( - 'abbr' => array( 'title' => true ), - 'acronym' => array( 'title' => true ), - 'code' => true, - 'em' => true, - 'strong' => true, - ); - - $allowed_tags = $allowed_tags_in_links; - $allowed_tags['a'] = array( - 'href' => true, - 'title' => true, - ); - - /* - * Name is marked up inside <a> tags. Don't allow these. - * Author is too, but some plugins have used <a> here (omitting Author URI). - */ - $plugin_data['Name'] = wp_kses( $plugin_data['Name'], $allowed_tags_in_links ); - $plugin_data['Author'] = wp_kses( $plugin_data['Author'], $allowed_tags ); - - $plugin_data['Description'] = wp_kses( $plugin_data['Description'], $allowed_tags ); - $plugin_data['Version'] = wp_kses( $plugin_data['Version'], $allowed_tags ); - - $plugin_data['PluginURI'] = esc_url( $plugin_data['PluginURI'] ); - $plugin_data['AuthorURI'] = esc_url( $plugin_data['AuthorURI'] ); - - $plugin_data['Title'] = $plugin_data['Name']; - $plugin_data['AuthorName'] = $plugin_data['Author']; - - // Apply markup. - if ( $markup ) { - if ( $plugin_data['PluginURI'] && $plugin_data['Name'] ) { - $plugin_data['Title'] = '<a href="' . $plugin_data['PluginURI'] . '">' . $plugin_data['Name'] . '</a>'; - } - - if ( $plugin_data['AuthorURI'] && $plugin_data['Author'] ) { - $plugin_data['Author'] = '<a href="' . $plugin_data['AuthorURI'] . '">' . $plugin_data['Author'] . '</a>'; - } - - $plugin_data['Description'] = wptexturize( $plugin_data['Description'] ); - - if ( $plugin_data['Author'] ) { - $plugin_data['Description'] .= sprintf( - /* translators: %s: Plugin author. */ - ' <cite>' . __( 'By %s.' ) . '</cite>', - $plugin_data['Author'] - ); - } - } - - return $plugin_data; -} - -/** - * Determines whether a plugin is active. - * - * Only plugins installed in the plugins/ folder can be active. - * - * Plugins in the mu-plugins/ folder can't be "activated," so this function will - * return false for those plugins. - * - * For more information on this and similar theme functions, check out - * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ - * Conditional Tags} article in the Theme Developer Handbook. - * - * @since 2.5.0 - * - * @param string $plugin Path to the plugin file relative to the plugins directory. - * @return bool True, if in the active plugins list. False, not in the list. - */ -function is_plugin_active( $plugin ) { - return in_array( $plugin, (array) get_option( 'active_plugins', array() ), true ) || is_plugin_active_for_network( $plugin ); -} - -/** - * Determines whether the plugin is inactive. - * - * Reverse of is_plugin_active(). Used as a callback. - * - * For more information on this and similar theme functions, check out - * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ - * Conditional Tags} article in the Theme Developer Handbook. - * - * @since 3.1.0 - * - * @see is_plugin_active() - * - * @param string $plugin Path to the plugin file relative to the plugins directory. - * @return bool True if inactive. False if active. - */ -function is_plugin_inactive( $plugin ) { - return ! is_plugin_active( $plugin ); -} - -/** - * Determines whether the plugin is active for the entire network. - * - * Only plugins installed in the plugins/ folder can be active. - * - * Plugins in the mu-plugins/ folder can't be "activated," so this function will - * return false for those plugins. - * - * For more information on this and similar theme functions, check out - * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ - * Conditional Tags} article in the Theme Developer Handbook. - * - * @since 3.0.0 - * - * @param string $plugin Path to the plugin file relative to the plugins directory. - * @return bool True if active for the network, otherwise false. - */ -function is_plugin_active_for_network( $plugin ) { - if ( ! is_multisite() ) { - return false; - } - - $plugins = get_site_option( 'active_sitewide_plugins' ); - if ( isset( $plugins[ $plugin ] ) ) { - return true; - } - - return false; -} - -/** - * Checks for "Network: true" in the plugin header to see if this should - * be activated only as a network wide plugin. The plugin would also work - * when Multisite is not enabled. - * - * Checks for "Site Wide Only: true" for backward compatibility. - * - * @since 3.0.0 - * - * @param string $plugin Path to the plugin file relative to the plugins directory. - * @return bool True if plugin is network only, false otherwise. - */ -function is_network_only_plugin( $plugin ) { - $plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ); - if ( $plugin_data ) { - return $plugin_data['Network']; - } - return false; -} - /** * Returns true. * diff --git a/src/wp-settings.php b/src/wp-settings.php index 44c04a3a7bead..635f6de248dd5 100644 --- a/src/wp-settings.php +++ b/src/wp-settings.php @@ -518,6 +518,9 @@ wp_recovery_mode()->initialize(); } +// To make get_plugin_data() available in a way that's compatible with plugins also loading this file, see #62244. +require_once ABSPATH . 'wp-admin/includes/plugin.php'; + // Load active plugins. foreach ( wp_get_active_and_valid_plugins() as $plugin ) { wp_register_plugin_realpath( $plugin ); From e585c954677cbec31f152a70c302464a5769080e Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Thu, 5 Dec 2024 15:35:17 +0000 Subject: [PATCH 076/323] Build/Test Tools: Properly escape `$` characters in Docker compose file. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This fixes an invalid interpolation format error that can be encountered in the `mysql` container’s healthcheck test command. Follow up to [59484]. Props afercia. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59489 602fd350-edb4-49c9-b593-d223f7449a82 --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index a95735fdd35a0..ec462c8a24c5c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -82,7 +82,7 @@ services: command: ${LOCAL_DB_AUTH_OPTION-} healthcheck: - test: [ "CMD-SHELL", "if [ \"$LOCAL_DB_TYPE\" = \"mariadb\" ]; then case \"$LOCAL_DB_VERSION\" in 5.5|10.0|10.1|10.2|10.3) mysqladmin ping -h localhost || exit $?;; *) mariadb-admin ping -h localhost || exit $?;; esac; else mysqladmin ping -h localhost || exit $?; fi" ] + test: [ "CMD-SHELL", "if [ \"$LOCAL_DB_TYPE\" = \"mariadb\" ]; then case \"$LOCAL_DB_VERSION\" in 5.5|10.0|10.1|10.2|10.3) mysqladmin ping -h localhost || exit $$?;; *) mariadb-admin ping -h localhost || exit $$?;; esac; else mysqladmin ping -h localhost || exit $$?; fi" ] timeout: 5s interval: 5s retries: 10 From 5adbb3e517e16c2396601dec968e991a63802978 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Thu, 5 Dec 2024 15:54:14 +0000 Subject: [PATCH 077/323] Build/Test Tools: Use newer versions for `include` jobs. The `include` part of the strategy for the PHPUnit testing workflow defines a few testing configurations outside of the matrix. The versions of PHP and MySQL used in these have not been updated for some time. This was mostly due to various incompatibilities that have since been resolved. Props peterwilsoncc, johnbillion. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59490 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/phpunit-tests.yml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/phpunit-tests.yml b/.github/workflows/phpunit-tests.yml index 949e08d5339ca..62a7aa50f7718 100644 --- a/.github/workflows/phpunit-tests.yml +++ b/.github/workflows/phpunit-tests.yml @@ -53,40 +53,40 @@ jobs: memcached: [ false ] include: - # Include jobs for PHP 7.4 with memcached. + # Include jobs that test with memcached. - os: ubuntu-latest - php: '7.4' + php: '8.3' db-type: 'mysql' - db-version: '5.7' + db-version: '8.4' tests-domain: 'example.org' multisite: false memcached: true - os: ubuntu-latest - php: '7.4' + php: '8.3' db-type: 'mysql' - db-version: '5.7' + db-version: '8.4' tests-domain: 'example.org' multisite: true memcached: true # Include jobs with a port on the test domain for both single and multisite. - os: ubuntu-latest - php: '7.4' + php: '8.4' db-type: 'mysql' - db-version: '5.7' + db-version: '8.4' tests-domain: 'example.org:8889' multisite: false memcached: false - os: ubuntu-latest - php: '7.4' + php: '8.4' db-type: 'mysql' - db-version: '5.7' + db-version: '8.4' tests-domain: 'example.org:8889' multisite: true memcached: false # Report test results to the Host Test Results. - os: ubuntu-latest db-type: 'mysql' - db-version: '8.0' + db-version: '8.4' tests-domain: 'example.org' multisite: false memcached: false @@ -131,15 +131,15 @@ jobs: memcached: [ false ] include: - # Include jobs for PHP 7.4 with memcached. + # Include jobs that test with memcached. - os: ubuntu-latest - php: '7.4' + php: '8.3' db-type: 'mariadb' db-version: '11.2' multisite: false memcached: true - os: ubuntu-latest - php: '7.4' + php: '8.3' db-type: 'mariadb' db-version: '11.2' multisite: true From 2d8d21f4f040b7c4d6cebcacafca98195746b2a8 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Thu, 5 Dec 2024 18:21:22 +0000 Subject: [PATCH 078/323] Build/Test Tools: Support `trunk` as a version. `trunk` is used interchangeably with `nightly`, so should be an accepted value when determining which version of WordPress is being tested. Follow up to [59452], [59483]. Props johnbillion. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59491 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-support-json-reader-v1.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/reusable-support-json-reader-v1.yml b/.github/workflows/reusable-support-json-reader-v1.yml index f1843cd5aa79b..ce574e4b2c3b7 100644 --- a/.github/workflows/reusable-support-json-reader-v1.yml +++ b/.github/workflows/reusable-support-json-reader-v1.yml @@ -52,9 +52,9 @@ jobs: - name: Determine the major WordPress version id: major-wp-version run: | - if [ "${{ inputs.wp-version }}" ] && [ "${{ inputs.wp-version }}" != "nightly" ] && [ "${{ inputs.wp-version }}" != "latest" ]; then + if [ "${{ inputs.wp-version }}" ] && [ "${{ inputs.wp-version }}" != "nightly" ] && [ "${{ inputs.wp-version }}" != "latest" ] && [ "${{ inputs.wp-version }}" != "trunk" ]; then echo "version=$(echo "${{ inputs.wp-version }}" | tr '.' '-' | cut -d '-' -f1-2)" >> $GITHUB_OUTPUT - elif [ "${{ inputs.wp-version }}" ]; then + elif [ "${{ inputs.wp-version }}" ] && [ "${{ inputs.wp-version }}" != "trunk" ]; then echo "version=$(echo "${{ inputs.wp-version }}")" >> $GITHUB_OUTPUT else echo "version=nightly" >> $GITHUB_OUTPUT From 29ec3128755be07a468a709f5d42c6dc783798f7 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Thu, 5 Dec 2024 18:32:31 +0000 Subject: [PATCH 079/323] Build/Test Tools: Introduce workflow for testing the local Docker environment. While the PHPUnit workflow currently relies on the local Docker environment and provides some safety checks that the environment works as expected, this may not always be true and does not test all of the available commands related to the environment. This introduces a basic workflow for testing the related scripts for the various supported combinations of PHP and database software with the environment to confirm everything is working as expected. Ideally this would also be run on Windows and MacOS to catch platform specific bugs. Unfortunately, Docker is not supported within the GitHub Action runner images, so not all bugs will be caught by this workflow. Props johnbillion, Clorith. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59492 602fd350-edb4-49c9-b593-d223f7449a82 --- .../workflows/local-docker-environment.yml | 154 +++++++++++++++++ ...sable-test-local-docker-environment-v1.yml | 160 ++++++++++++++++++ 2 files changed, 314 insertions(+) create mode 100644 .github/workflows/local-docker-environment.yml create mode 100644 .github/workflows/reusable-test-local-docker-environment-v1.yml diff --git a/.github/workflows/local-docker-environment.yml b/.github/workflows/local-docker-environment.yml new file mode 100644 index 0000000000000..1e25c82ef1287 --- /dev/null +++ b/.github/workflows/local-docker-environment.yml @@ -0,0 +1,154 @@ +name: Local Docker Environment + +on: + push: + branches: + - trunk + - '6.[8-9]' + - '[7-9].[0-9]' + paths: + # Any changes to Docker related files. + - '.env.example' + - 'docker-compose.yml' + # Any changes to local environment related files + - 'tools/local-env/**' + # These files manage packages used by the local environment. + - 'package*.json' + # These files configure Composer. Changes could affect the local environment. + - 'composer.*' + # These files define the versions to test. + - '.version-support-*.json' + # Changes to this and related workflow files should always be verified. + - '.github/workflows/local-docker-environment.yml' + - '.github/workflows/reusable-support-json-reader-v1.yml' + - '.github/workflows/reusable-test-docker-environment-v1.yml' + pull_request: + branches: + - trunk + - '6.[8-9]' + - '[7-9].[0-9]' + paths: + # Any changes to Docker related files. + - '.env.example' + - 'docker-compose.yml' + # Any changes to local environment related files + - 'tools/local-env/**' + # These files manage packages used by the local environment. + - 'package*.json' + # These files configure Composer. Changes could affect the local environment. + - 'composer.*' + # These files define the versions to test. + - '.version-support-*.json' + # Changes to this and related workflow files should always be verified. + - '.github/workflows/local-docker-environment.yml' + - '.github/workflows/reusable-support-json-reader-v1.yml' + - '.github/workflows/reusable-test-docker-environment-v1.yml' + workflow_dispatch: + +# Cancels all previous workflow runs for pull requests that have not completed. +concurrency: + # The concurrency group contains the workflow name and the branch name for pull requests + # or the commit hash for any other events. + group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }} + cancel-in-progress: true + +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + +jobs: + # + # Determines the appropriate supported values for PHP and database versions based on the WordPress + # version being tested. + # + build-test-matrix: + name: Build Test Matrix + uses: WordPress/wordpress-develop/.github/workflows/reusable-support-json-reader-v1.yml@trunk + permissions: + contents: read + secrets: inherit + if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} + with: + wp-version: ${{ github.event_name == 'pull_request' && github.base_ref || github.ref_name }} + + # Tests the local Docker environment. + environment-tests-mysql: + name: PHP ${{ matrix.php }} + uses: WordPress/wordpress-develop/.github/workflows/reusable-test-local-docker-environment-v1.yml@trunk + permissions: + contents: read + if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} + needs: [ build-test-matrix ] + strategy: + fail-fast: false + matrix: + os: [ ubuntu-latest ] + memcached: [ false, true ] + php: ${{ fromJSON( needs.build-test-matrix.outputs.php-versions ) }} + db-version: ${{ fromJSON( needs.build-test-matrix.outputs.mysql-versions ) }} + + exclude: + # The MySQL 5.5 containers will not start. + - db-version: '5.5' + # MySQL 9.0+ will not work on PHP 7.2 & 7.3 + - php: '7.2' + db-version: '9.0' + - php: '7.3' + db-version: '9.0' + + with: + os: ${{ matrix.os }} + php: ${{ matrix.php }} + db-type: 'mysql' + db-version: ${{ matrix.db-version }} + memcached: ${{ matrix.memcached }} + tests-domain: ${{ matrix.tests-domain }} + + slack-notifications: + name: Slack Notifications + uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk + permissions: + actions: read + contents: read + needs: [ build-test-matrix, environment-tests-mysql ] + if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event_name != 'pull_request' && always() }} + with: + calling_status: ${{ contains( needs.*.result, 'cancelled' ) && 'cancelled' || contains( needs.*.result, 'failure' ) && 'failure' || 'success' }} + secrets: + SLACK_GHA_SUCCESS_WEBHOOK: ${{ secrets.SLACK_GHA_SUCCESS_WEBHOOK }} + SLACK_GHA_CANCELLED_WEBHOOK: ${{ secrets.SLACK_GHA_CANCELLED_WEBHOOK }} + SLACK_GHA_FIXED_WEBHOOK: ${{ secrets.SLACK_GHA_FIXED_WEBHOOK }} + SLACK_GHA_FAILURE_WEBHOOK: ${{ secrets.SLACK_GHA_FAILURE_WEBHOOK }} + + failed-workflow: + name: Failed workflow tasks + runs-on: ubuntu-latest + permissions: + actions: write + needs: [ build-test-matrix, environment-tests-mysql, slack-notifications ] + if: | + always() && + github.repository == 'WordPress/wordpress-develop' && + github.event_name != 'pull_request' && + github.run_attempt < 2 && + ( + contains( needs.*.result, 'cancelled' ) || + contains( needs.*.result, 'failure' ) + ) + + steps: + - name: Dispatch workflow run + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + retries: 2 + retry-exempt-status-codes: 418 + script: | + github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: 'failed-workflow.yml', + ref: 'trunk', + inputs: { + run_id: '${{ github.run_id }}' + } + }); diff --git a/.github/workflows/reusable-test-local-docker-environment-v1.yml b/.github/workflows/reusable-test-local-docker-environment-v1.yml new file mode 100644 index 0000000000000..4dccd7ef3dccd --- /dev/null +++ b/.github/workflows/reusable-test-local-docker-environment-v1.yml @@ -0,0 +1,160 @@ +## +# A reusable workflow that ensures the local Docker environment is working properly. +# +# This workflow is used by `trunk` and branches >= 6.8. +## +name: Test local Docker environment + +on: + workflow_call: + inputs: + os: + description: 'Operating system to test' + required: false + type: 'string' + default: 'ubuntu-latest' + php: + description: 'The version of PHP to use, in the format of X.Y' + required: false + type: 'string' + default: 'latest' + db-type: + description: 'Database type. Valid types are mysql and mariadb' + required: false + type: 'string' + default: 'mysql' + db-version: + description: 'Database version' + required: false + type: 'string' + default: '8.0' + memcached: + description: 'Whether to enable memcached' + required: false + type: 'boolean' + default: false + tests-domain: + description: 'The domain to use for the tests' + required: false + type: 'string' + default: 'example.org' + +env: + LOCAL_PHP: ${{ inputs.php == 'latest' && 'latest' || format( '{0}-fpm', inputs.php ) }} + LOCAL_DB_TYPE: ${{ inputs.db-type }} + LOCAL_DB_VERSION: ${{ inputs.db-version }} + LOCAL_PHP_MEMCACHED: ${{ inputs.memcached }} + LOCAL_WP_TESTS_DOMAIN: ${{ inputs.tests-domain }} + PUPPETEER_SKIP_DOWNLOAD: ${{ true }} + +jobs: + # Tests the local Docker environment. + # + # Performs the following steps: + # - Sets environment variables. + # - Checks out the repository. + # - Sets up Node.js. + # - Sets up PHP. + # - Installs Composer dependencies. + # - Installs npm dependencies + # - Logs general debug information about the runner. + # - Logs Docker debug information (about the Docker installation within the runner). + # - Starts the WordPress Docker container. + # - Logs the running Docker containers. + # - Logs debug information about what's installed within the WordPress Docker containers. + # - Install WordPress within the Docker container. + # - Restarts the Docker environment. + # - Runs a WP CLI command. + # - Tests the logs command. + # - Tests the reset command. + # - Ensures version-controlled files are not modified or deleted. + local-docker-environment-tests: + name: PHP ${{ inputs.php }} / ${{ 'mariadb' == inputs.db-type && 'MariaDB' || 'MySQL' }} ${{ inputs.db-version }}${{ inputs.memcached && ' with memcached' || '' }}${{ 'example.org' != inputs.tests-domain && format( ' {0}', inputs.tests-domain ) || '' }} + runs-on: ${{ inputs.os }} + timeout-minutes: 20 + + steps: + - name: Configure environment variables + run: | + echo "PHP_FPM_UID=$(id -u)" >> $GITHUB_ENV + echo "PHP_FPM_GID=$(id -g)" >> $GITHUB_ENV + + - name: Checkout repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + + - name: Set up Node.js + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + with: + node-version-file: '.nvmrc' + cache: npm + + ## + # This allows Composer dependencies to be installed using a single step. + # + # Since tests are currently run within the Docker containers where the PHP version varies, + # the same PHP version needs to be configured for the action runner machine so that the correct + # dependency versions are installed and cached. + ## + - name: Set up PHP + uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1 + with: + php-version: '${{ inputs.php }}' + coverage: none + + # Since Composer dependencies are installed using `composer update` and no lock file is in version control, + # passing a custom cache suffix ensures that the cache is flushed at least once per week. + - name: Install Composer dependencies + uses: ramsey/composer-install@57532f8be5bda426838819c5ee9afb8af389d51a # v3.0.0 + with: + custom-cache-suffix: $(/bin/date -u --date='last Mon' "+%F") + + - name: Install npm dependencies + run: npm ci + + - name: General debug information + run: | + npm --version + node --version + curl --version + git --version + composer --version + locale -a + + - name: Docker debug information + run: | + docker -v + + - name: Start Docker environment + run: | + npm run env:start + + - name: Log running Docker containers + run: docker ps -a + + - name: WordPress Docker container debug information + run: | + docker compose run --rm mysql ${{ env.LOCAL_DB_TYPE }} --version + docker compose run --rm php php --version + docker compose run --rm php php -m + docker compose run --rm php php -i + docker compose run --rm php locale -a + + - name: Install WordPress + run: npm run env:install + + - name: Restart Docker environment + run: npm run env:restart + + - name: Test a CLI command + run: npm run env:cli wp option get siteurl + + - name: Test logs command + run: npm run env:logs + + - name: Reset the Docker environment + run: npm run env:reset + + - name: Ensure version-controlled files are not modified or deleted + run: git diff --exit-code From 9c7d0081584d777c6cc480601b9a777cc872caa8 Mon Sep 17 00:00:00 2001 From: Pascal Birchler <swissspidy@git.wordpress.org> Date: Thu, 5 Dec 2024 21:19:37 +0000 Subject: [PATCH 080/323] Embeds: ensure correct thumbnail height. Use height 0 instead of 9999 to avoid unnecessarily using the full size version. Props colinleroy, swissspidy. Fixes #62094. git-svn-id: https://develop.svn.wordpress.org/trunk@59493 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/embed.php | 2 +- .../phpunit/tests/oembed/getResponseData.php | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/embed.php b/src/wp-includes/embed.php index c7dfd38761cb4..f7fe10e48239d 100644 --- a/src/wp-includes/embed.php +++ b/src/wp-includes/embed.php @@ -721,7 +721,7 @@ function get_oembed_response_data_rich( $data, $post, $width, $height ) { } if ( $thumbnail_id ) { - list( $thumbnail_url, $thumbnail_width, $thumbnail_height ) = wp_get_attachment_image_src( $thumbnail_id, array( $width, 99999 ) ); + list( $thumbnail_url, $thumbnail_width, $thumbnail_height ) = wp_get_attachment_image_src( $thumbnail_id, array( $width, 0 ) ); $data['thumbnail_url'] = $thumbnail_url; $data['thumbnail_width'] = $thumbnail_width; $data['thumbnail_height'] = $thumbnail_height; diff --git a/tests/phpunit/tests/oembed/getResponseData.php b/tests/phpunit/tests/oembed/getResponseData.php index 7cd5b1cc66ddf..09a0f3142b319 100644 --- a/tests/phpunit/tests/oembed/getResponseData.php +++ b/tests/phpunit/tests/oembed/getResponseData.php @@ -251,6 +251,26 @@ public function test_get_oembed_response_data_with_thumbnail() { $this->assertLessThanOrEqual( 400, $data['thumbnail_width'] ); } + /** + * @ticket 62094 + */ + public function test_get_oembed_response_data_has_correct_thumbnail_size() { + $post = self::factory()->post->create_and_get(); + + /* Use a large image as post thumbnail */ + $attachment_id = self::factory()->attachment->create_upload_object( DIR_TESTDATA . '/images/33772.jpg' ); + set_post_thumbnail( $post, $attachment_id ); + + /* Get the image, sized for 400x??? pixels display */ + $image = wp_get_attachment_image_src( $attachment_id, array( 400, 0 ) ); + + /* Get the oembed data array for a 400 pixels wide embed */ + $data = get_oembed_response_data( $post, 400 ); + + /* Make sure the embed references the small image, not the full-size one. */ + $this->assertSame( $image[0], $data['thumbnail_url'] ); + } + public function test_get_oembed_response_data_for_attachment() { $parent = self::factory()->post->create(); $file = DIR_TESTDATA . '/images/canola.jpg'; From 59a6b5e65eb145fa3d4095315d51e890d3208c4e Mon Sep 17 00:00:00 2001 From: Pascal Birchler <swissspidy@git.wordpress.org> Date: Thu, 5 Dec 2024 21:35:40 +0000 Subject: [PATCH 081/323] I18N: Add new `WP_Locale::get_month_genitive()` method. Complements existing helper methods such as `WP_Locale::get_month_abbrev()`. Props ankitkumarshah, Tkama, SergeyBiryukov. Fixes #58658. git-svn-id: https://develop.svn.wordpress.org/trunk@59494 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-locale.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/wp-includes/class-wp-locale.php b/src/wp-includes/class-wp-locale.php index 87af36a2a42e5..a78617b5e3332 100644 --- a/src/wp-includes/class-wp-locale.php +++ b/src/wp-includes/class-wp-locale.php @@ -336,6 +336,26 @@ public function get_month_abbrev( $month_name ) { return $this->month_abbrev[ $month_name ]; } + /** + * Retrieves translated version of month genitive string. + * + * The $month_number parameter has to be a string + * because it must have the '0' in front of any number + * that is less than 10. Starts from '01' and ends at + * '12'. + * + * You can use an integer instead and it will add the + * '0' before the numbers less than 10 for you. + * + * @since 6.8.0 + * + * @param string|int $month_number '01' through '12'. + * @return string Translated genitive month name. + */ + public function get_month_genitive( $month_number ) { + return $this->month_genitive[ zeroise( $month_number, 2 ) ]; + } + /** * Retrieves translated version of meridiem string. * From d45a119a9e04073fceb802eda36f8ca4319a9710 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Thu, 5 Dec 2024 22:03:44 +0000 Subject: [PATCH 082/323] Docs: Add missing `@var` tag for `WP_Query::$query_vars_changed`. Follow-up to [17552]. Props marian1, jigar-bhanushali, martin.krcho, parthvataliya. Fixes #62022. git-svn-id: https://develop.svn.wordpress.org/trunk@59495 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-query.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/wp-includes/class-wp-query.php b/src/wp-includes/class-wp-query.php index bc673191a8a16..f95cb6149fc43 100644 --- a/src/wp-includes/class-wp-query.php +++ b/src/wp-includes/class-wp-query.php @@ -442,6 +442,7 @@ class WP_Query { * via pre_get_posts hooks. * * @since 3.1.1 + * @var bool */ private $query_vars_changed = true; From 1b1e35da67262f74d248d5efd0175f893b718f65 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Fri, 6 Dec 2024 17:05:39 +0000 Subject: [PATCH 083/323] Coding Standards: Use correct escaping function for `wp_http_referer`. Follow-up to [58069]. Props yogeshbhutkar, sainathpoojary, PcTevree, knutsp, siliconforks, stromhalm, shanemuir. Fixes #62551. git-svn-id: https://develop.svn.wordpress.org/trunk@59496 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/edit-tag-form.php | 2 +- src/wp-admin/user-edit.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-admin/edit-tag-form.php b/src/wp-admin/edit-tag-form.php index b6da6c6687bc8..ec40fcc52e61f 100644 --- a/src/wp-admin/edit-tag-form.php +++ b/src/wp-admin/edit-tag-form.php @@ -44,7 +44,7 @@ do_action_deprecated( 'edit_tag_form_pre', array( $tag ), '3.0.0', '{$taxonomy}_pre_edit_form' ); } -$wp_http_referer = ! empty( $_REQUEST['wp_http_referer'] ) ? sanitize_text_field( $_REQUEST['wp_http_referer'] ) : ''; +$wp_http_referer = ! empty( $_REQUEST['wp_http_referer'] ) ? sanitize_url( $_REQUEST['wp_http_referer'] ) : ''; $wp_http_referer = remove_query_arg( array( 'action', 'message', 'tag_ID' ), $wp_http_referer ); // Also used by Edit Tags. diff --git a/src/wp-admin/user-edit.php b/src/wp-admin/user-edit.php index 55ed2749f6447..3f74baa856f57 100644 --- a/src/wp-admin/user-edit.php +++ b/src/wp-admin/user-edit.php @@ -14,7 +14,7 @@ $action = ! empty( $_REQUEST['action'] ) ? sanitize_text_field( $_REQUEST['action'] ) : ''; $user_id = ! empty( $_REQUEST['user_id'] ) ? absint( $_REQUEST['user_id'] ) : 0; -$wp_http_referer = ! empty( $_REQUEST['wp_http_referer'] ) ? sanitize_text_field( $_REQUEST['wp_http_referer'] ) : ''; +$wp_http_referer = ! empty( $_REQUEST['wp_http_referer'] ) ? sanitize_url( $_REQUEST['wp_http_referer'] ) : ''; $current_user = wp_get_current_user(); From 750f743c639c31d91cbb73e8d25f24ca3c35f230 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sat, 7 Dec 2024 22:06:56 +0000 Subject: [PATCH 084/323] Coding Standards: Use strict comparison in `media_upload_form_handler()`. Follow-up to [10390]. Props deepakrohilla, iflairwebtechnologies, mukesh27, dingguodong, aristath. Fixes #62009. git-svn-id: https://develop.svn.wordpress.org/trunk@59497 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/media.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-admin/includes/media.php b/src/wp-admin/includes/media.php index df63128a16f4d..82187fd62e50d 100644 --- a/src/wp-admin/includes/media.php +++ b/src/wp-admin/includes/media.php @@ -773,7 +773,7 @@ function media_upload_form_handler() { $post['menu_order'] = $attachment['menu_order']; } - if ( isset( $send_id ) && $attachment_id == $send_id ) { + if ( isset( $send_id ) && $attachment_id === $send_id ) { if ( isset( $attachment['post_parent'] ) ) { $post['post_parent'] = $attachment['post_parent']; } From faff3a2085bda2413547813172e5902c93389830 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sun, 8 Dec 2024 23:42:00 +0000 Subject: [PATCH 085/323] Coding Standards: Use strict comparison in `wp-includes/comment-template.php`. Follow-up to [162], [2685], [4494], [8878], [8961], [55660]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59498 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/comment-template.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/wp-includes/comment-template.php b/src/wp-includes/comment-template.php index ee7ca216e17a1..bcca00bc23a0d 100644 --- a/src/wp-includes/comment-template.php +++ b/src/wp-includes/comment-template.php @@ -961,7 +961,7 @@ function comments_number( $zero = false, $one = false, $more = false, $post = 0 * @return string Language string for the number of comments a post has. */ function get_comments_number_text( $zero = false, $one = false, $more = false, $post = 0 ) { - $comments_number = get_comments_number( $post ); + $comments_number = (int) get_comments_number( $post ); if ( $comments_number > 1 ) { if ( false === $more ) { @@ -996,7 +996,7 @@ function get_comments_number_text( $zero = false, $one = false, $more = false, $ $comments_number_text = str_replace( '%', number_format_i18n( $comments_number ), $more ); } - } elseif ( 0 == $comments_number ) { + } elseif ( 0 === $comments_number ) { $comments_number_text = ( false === $zero ) ? __( 'No Comments' ) : $zero; } else { // Must be one. $comments_number_text = ( false === $one ) ? __( '1 Comment' ) : $one; @@ -1648,7 +1648,7 @@ function comments_template( $file = '/comments.php', $separate_comments = false function comments_popup_link( $zero = false, $one = false, $more = false, $css_class = '', $none = false ) { $post_id = get_the_ID(); $post_title = get_the_title(); - $comments_number = get_comments_number( $post_id ); + $comments_number = (int) get_comments_number( $post_id ); if ( false === $zero ) { /* translators: %s: Post title. */ @@ -1675,7 +1675,7 @@ function comments_popup_link( $zero = false, $one = false, $more = false, $css_c $none = sprintf( __( 'Comments Off<span class="screen-reader-text"> on %s</span>' ), $post_title ); } - if ( 0 == $comments_number && ! comments_open() && ! pings_open() ) { + if ( 0 === $comments_number && ! comments_open() && ! pings_open() ) { printf( '<span%1$s>%2$s</span>', ! empty( $css_class ) ? ' class="' . esc_attr( $css_class ) . '"' : '', @@ -1689,7 +1689,7 @@ function comments_popup_link( $zero = false, $one = false, $more = false, $css_c return; } - if ( 0 == $comments_number ) { + if ( 0 === $comments_number ) { $respond_link = get_permalink() . '#respond'; /** * Filters the respond link when a post has no comments. @@ -1773,7 +1773,10 @@ function get_comment_reply_link( $args = array(), $comment = null, $post = null $args = wp_parse_args( $args, $defaults ); - if ( 0 == $args['depth'] || $args['max_depth'] <= $args['depth'] ) { + $args['max_depth'] = (int) $args['max_depth']; + $args['depth'] = (int) $args['depth']; + + if ( 0 === $args['depth'] || $args['max_depth'] <= $args['depth'] ) { return; } From a1079b698133d1763504d81fb102a8f0caa1e145 Mon Sep 17 00:00:00 2001 From: Isabel Brison <isabel_brison@git.wordpress.org> Date: Mon, 9 Dec 2024 02:53:35 +0000 Subject: [PATCH 086/323] =?UTF-8?q?Editor:=20Update=20docblocks=20for?= =?UTF-8?q?=C2=A0`wp=5Fget=5Fglobal=5Fstylesheet`=C2=A0and=C2=A0`WP=5FThem?= =?UTF-8?q?e=5FJSON::get=5Fstylesheet`.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updates docblocks to account for new use of the `custom-css` string in their `$types` parameters and adds information to deprecation of `wp_get_global_styles_custom_css`. Props justlevine, isabel_brison, ramonopoly. Fixes #62665. git-svn-id: https://develop.svn.wordpress.org/trunk@59499 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-theme-json.php | 2 ++ src/wp-includes/deprecated.php | 2 +- src/wp-includes/global-styles-and-settings.php | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/class-wp-theme-json.php b/src/wp-includes/class-wp-theme-json.php index cb48672c438bb..7d1216a4515d3 100644 --- a/src/wp-includes/class-wp-theme-json.php +++ b/src/wp-includes/class-wp-theme-json.php @@ -1317,6 +1317,8 @@ public function get_settings() { * - `variables`: only the CSS Custom Properties for presets & custom ones. * - `styles`: only the styles section in theme.json. * - `presets`: only the classes for the presets. + * - `base-layout-styles`: only the base layout styles. + * - `custom-css`: only the custom CSS. * @param string[] $origins A list of origins to include. By default it includes VALID_ORIGINS. * @param array $options { * Optional. An array of options for now used for internal purposes only (may change without notice). diff --git a/src/wp-includes/deprecated.php b/src/wp-includes/deprecated.php index 348267b6a5b80..09d7867156b3f 100644 --- a/src/wp-includes/deprecated.php +++ b/src/wp-includes/deprecated.php @@ -6316,7 +6316,7 @@ function wp_interactivity_process_directives_of_interactive_blocks( array $parse * Gets the global styles custom CSS from theme.json. * * @since 6.2.0 - * @deprecated 6.7.0 Use {@see 'wp_get_global_stylesheet'} instead. + * @deprecated 6.7.0 Use {@see 'wp_get_global_stylesheet'} instead for top-level custom CSS, or {@see 'WP_Theme_JSON::get_styles_for_block'} for block-level custom CSS. * * @return string The global styles custom CSS. */ diff --git a/src/wp-includes/global-styles-and-settings.php b/src/wp-includes/global-styles-and-settings.php index 34fc28694be64..b75dd79ea68c5 100644 --- a/src/wp-includes/global-styles-and-settings.php +++ b/src/wp-includes/global-styles-and-settings.php @@ -142,7 +142,7 @@ function wp_get_global_styles( $path = array(), $context = array() ) { * @since 6.6.0 Resolves relative paths in theme.json styles to theme absolute paths. * * @param array $types Optional. Types of styles to load. - * It accepts as values 'variables', 'presets', 'styles', 'base-layout-styles'. + * See {@see 'WP_Theme_JSON::get_stylesheet'} for all valid types. * If empty, it'll load the following: * - for themes without theme.json: 'variables', 'presets', 'base-layout-styles'. * - for themes with theme.json: 'variables', 'presets', 'styles'. From 0d428194d1e6d6f1285d45cafd84b18f514070c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Greg=20Zi=C3=83=C2=B3=C3=85=E2=80=9Akowski?= <gziolo@git.wordpress.org> Date: Mon, 9 Dec 2024 12:42:42 +0000 Subject: [PATCH 087/323] HTML API: Step past closing HTML, BODY tags The HTML specification does not close HTML or BODY tags (pop them off the stack of open elements) when their tag closers are encountered. The HTML processor correctly handled this behavior, however it incorrectly "paused" by returning true from the step functions. Props jonsurrell, dmsnell, gziolo. Fixes #62583. git-svn-id: https://develop.svn.wordpress.org/trunk@59500 602fd350-edb4-49c9-b593-d223f7449a82 --- .../html-api/class-wp-html-processor.php | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/html-api/class-wp-html-processor.php b/src/wp-includes/html-api/class-wp-html-processor.php index e88757ec7b4c2..7b156d8a605fa 100644 --- a/src/wp-includes/html-api/class-wp-html-processor.php +++ b/src/wp-includes/html-api/class-wp-html-processor.php @@ -2318,7 +2318,14 @@ private function step_in_body(): bool { */ $this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY; - return true; + /* + * The BODY element is not removed from the stack of open elements. + * Only internal state has changed, this does not qualify as a "step" + * in terms of advancing through the document to another token. + * Nothing has been pushed or popped. + * Proceed to parse the next item. + */ + return $this->step(); /* * > An end tag whose tag name is "html" @@ -4391,7 +4398,14 @@ private function step_after_body(): bool { } $this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_BODY; - return true; + /* + * The HTML element is not removed from the stack of open elements. + * Only internal state has changed, this does not qualify as a "step" + * in terms of advancing through the document to another token. + * Nothing has been pushed or popped. + * Proceed to parse the next item. + */ + return $this->step(); } /* @@ -4586,7 +4600,14 @@ private function step_after_frameset(): bool { */ case '-HTML': $this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_FRAMESET; - return true; + /* + * The HTML element is not removed from the stack of open elements. + * Only internal state has changed, this does not qualify as a "step" + * in terms of advancing through the document to another token. + * Nothing has been pushed or popped. + * Proceed to parse the next item. + */ + return $this->step(); /* * > A start tag whose tag name is "noframes" From 6106332617128820c0ee5132c34ff1cf6f785d1a Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Mon, 9 Dec 2024 22:43:20 +0000 Subject: [PATCH 088/323] REST API: Correct description for the `humanized_updated` block directory property. Follow-up to [48242], [51676]. Props mujuonly, mukesh27. Fixes #62667. git-svn-id: https://develop.svn.wordpress.org/trunk@59501 602fd350-edb4-49c9-b593-d223f7449a82 --- .../endpoints/class-wp-rest-block-directory-controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php index cfcb0dbc5c7bc..8a34c78d33c0b 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php @@ -285,7 +285,7 @@ public function get_item_schema() { 'context' => array( 'view' ), ), 'humanized_updated' => array( - 'description' => __( 'The date when the block was last updated, in fuzzy human readable format.' ), + 'description' => __( 'The date when the block was last updated, in human readable format.' ), 'type' => 'string', 'context' => array( 'view' ), ), From 146775070985b4a26def7eef563e97bd1e741228 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Greg=20Zi=C3=83=C2=B3=C3=85=E2=80=9Akowski?= <gziolo@git.wordpress.org> Date: Tue, 10 Dec 2024 09:11:35 +0000 Subject: [PATCH 089/323] HTML API: Prevent bookmarks from being set on virtual tokens Fixes the issue when an HTML_Processor bookmark was set at a virtual token (a node in the resulting document that does not correspond to an HTML token present in the input string), seek behavior was unreliable. Props jonsurrell, gziolo. Fixes #62521. git-svn-id: https://develop.svn.wordpress.org/trunk@59502 602fd350-edb4-49c9-b593-d223f7449a82 --- .../html-api/class-wp-html-processor.php | 17 ++++++++++++++++- .../tests/html-api/wpHtmlProcessor-bookmark.php | 13 +++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/html-api/class-wp-html-processor.php b/src/wp-includes/html-api/class-wp-html-processor.php index 7b156d8a605fa..8d2a476769efe 100644 --- a/src/wp-includes/html-api/class-wp-html-processor.php +++ b/src/wp-includes/html-api/class-wp-html-processor.php @@ -303,7 +303,9 @@ public static function create_fragment( $html, $context = '<body>', $encoding = } while ( $context_processor->next_tag() ) { - $context_processor->set_bookmark( 'final_node' ); + if ( ! $context_processor->is_virtual() ) { + $context_processor->set_bookmark( 'final_node' ); + } } if ( @@ -5673,12 +5675,25 @@ public function seek( $bookmark_name ): bool { * reaching for it, as inappropriate use could lead to broken * HTML structure or unwanted processing overhead. * + * Bookmarks cannot be set on tokens that do no appear in the original + * HTML text. For example, the HTML `<table><td>` stops at tags `TABLE`, + * `TBODY`, `TR`, and `TD`. The `TBODY` and `TR` tags do not appear in + * the original HTML and cannot be used as bookmarks. + * * @since 6.4.0 * * @param string $bookmark_name Identifies this particular bookmark. * @return bool Whether the bookmark was successfully created. */ public function set_bookmark( $bookmark_name ): bool { + if ( $this->is_virtual() ) { + _doing_it_wrong( + __METHOD__, + __( 'Cannot set bookmarks on tokens that do no appear in the original HTML text.' ), + '6.8.0' + ); + return false; + } return parent::set_bookmark( "_{$bookmark_name}" ); } diff --git a/tests/phpunit/tests/html-api/wpHtmlProcessor-bookmark.php b/tests/phpunit/tests/html-api/wpHtmlProcessor-bookmark.php index 91cc17898f77d..094fea367878a 100644 --- a/tests/phpunit/tests/html-api/wpHtmlProcessor-bookmark.php +++ b/tests/phpunit/tests/html-api/wpHtmlProcessor-bookmark.php @@ -157,4 +157,17 @@ public static function data_processor_constructors(): array { 'Fragment parser' => array( array( WP_HTML_Processor::class, 'create_fragment' ) ), ); } + + /** + * @ticket 62521 + * + * @expectedIncorrectUsage WP_HTML_Processor::set_bookmark + */ + public function test_bookmarks_not_allowed_on_virtual_nodes() { + $processor = WP_HTML_Processor::create_full_parser( 'text' ); + $this->assertTrue( $processor->next_tag( 'BODY' ) ); + $this->assertFalse( $processor->set_bookmark( 'mark' ) ); + $this->assertTrue( $processor->next_token() ); + $this->assertTrue( $processor->set_bookmark( 'mark' ) ); + } } From 2b49715077de18a798453d73a1d1edc8280fd980 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Greg=20Zi=C3=83=C2=B3=C3=85=E2=80=9Akowski?= <gziolo@git.wordpress.org> Date: Tue, 10 Dec 2024 11:39:06 +0000 Subject: [PATCH 090/323] HTML API: Remove nullable from get_breadcrumbs return type Follow-up [58713] Props jonsurrell, westonruter, gziolo. Fixes #62674. git-svn-id: https://develop.svn.wordpress.org/trunk@59503 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/html-api/class-wp-html-processor.php | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/wp-includes/html-api/class-wp-html-processor.php b/src/wp-includes/html-api/class-wp-html-processor.php index 8d2a476769efe..2bc38b305a9f2 100644 --- a/src/wp-includes/html-api/class-wp-html-processor.php +++ b/src/wp-includes/html-api/class-wp-html-processor.php @@ -1143,11 +1143,7 @@ public function step( $node_to_process = self::PROCESS_NEXT_NODE ): bool { * Breadcrumbs start at the outermost parent and descend toward the matched element. * They always include the entire path from the root HTML node to the matched element. * - * @todo It could be more efficient to expose a generator-based version of this function - * to avoid creating the array copy on tag iteration. If this is done, it would likely - * be more useful to walk up the stack when yielding instead of starting at the top. - * - * Example + * Example: * * $processor = WP_HTML_Processor::create_fragment( '<p><strong><em><img></em></strong></p>' ); * $processor->next_tag( 'IMG' ); @@ -1155,9 +1151,9 @@ public function step( $node_to_process = self::PROCESS_NEXT_NODE ): bool { * * @since 6.4.0 * - * @return string[]|null Array of tag names representing path to matched node, if matched, otherwise NULL. + * @return string[] Array of tag names representing path to matched node. */ - public function get_breadcrumbs(): ?array { + public function get_breadcrumbs(): array { return $this->breadcrumbs; } From 32880ec4e910837cd267e1685733867b243e22fa Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Tue, 10 Dec 2024 23:20:21 +0000 Subject: [PATCH 091/323] Twenty Twenty-Two: Fix PHPCS issues in `functions.php`. * Inline comments must end in full stops, exclamation marks, or question marks. * There must be exactly one blank line after the file comment. Follow-up to [52081]. Props pitamdey, mukesh27. Fixes #62648. git-svn-id: https://develop.svn.wordpress.org/trunk@59504 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-content/themes/twentytwentytwo/functions.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/wp-content/themes/twentytwentytwo/functions.php b/src/wp-content/themes/twentytwentytwo/functions.php index cd994beec743f..8f93dcfc5f53c 100644 --- a/src/wp-content/themes/twentytwentytwo/functions.php +++ b/src/wp-content/themes/twentytwentytwo/functions.php @@ -9,7 +9,6 @@ * @since Twenty Twenty-Two 1.0 */ - if ( ! function_exists( 'twentytwentytwo_support' ) ) : /** @@ -61,5 +60,5 @@ function twentytwentytwo_styles() { add_action( 'wp_enqueue_scripts', 'twentytwentytwo_styles' ); -// Add block patterns +// Add block patterns. require get_template_directory() . '/inc/block-patterns.php'; From 9104190b6d36c2959f652e0b65bf5bb7af42ffcc Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Wed, 11 Dec 2024 15:18:43 +0000 Subject: [PATCH 092/323] Docs: Correct formatting for script module data filter documentation examples. Follow-up to [58579]. Props jonsurrell. See #62281. git-svn-id: https://develop.svn.wordpress.org/trunk@59505 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-script-modules.php | 37 +++++++++++---------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/src/wp-includes/class-wp-script-modules.php b/src/wp-includes/class-wp-script-modules.php index 384bf9ef2f59b..dbfa038f8cbe2 100644 --- a/src/wp-includes/class-wp-script-modules.php +++ b/src/wp-includes/class-wp-script-modules.php @@ -407,14 +407,15 @@ public function print_script_module_data(): void { * initialization or immediately on page load. It does not replace the REST API or * fetching data from the client. * - * @example - * add_filter( - * 'script_module_data_MyScriptModuleID', - * function ( array $data ): array { - * $data['script-needs-this-data'] = 'ok'; - * return $data; - * } - * ); + * Example: + * + * add_filter( + * 'script_module_data_MyScriptModuleID', + * function ( array $data ): array { + * $data['dataForClient'] = 'ok'; + * return $data; + * } + * ); * * If the filter returns no data (an empty array), nothing will be embedded in the page. * @@ -423,15 +424,17 @@ public function print_script_module_data(): void { * * The data can be read on the client with a pattern like this: * - * @example - * const dataContainer = document.getElementById( 'wp-script-module-data-MyScriptModuleID' ); - * let data = {}; - * if ( dataContainer ) { - * try { - * data = JSON.parse( dataContainer.textContent ); - * } catch {} - * } - * initMyScriptModuleWithData( data ); + * Example: + * + * const dataContainer = document.getElementById( 'wp-script-module-data-MyScriptModuleID' ); + * let data = {}; + * if ( dataContainer ) { + * try { + * data = JSON.parse( dataContainer.textContent ); + * } catch {} + * } + * // data.dataForClient === 'ok'; + * initMyScriptModuleWithData( data ); * * @since 6.7.0 * From e2b0bfdc06b2f652ff7b3865b496325b87521d26 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Thu, 12 Dec 2024 22:21:21 +0000 Subject: [PATCH 093/323] Filesystem API: Check `PHP_OS_FAMILY` instead of `php_uname()` in PclZip. The `php_uname()` function can be disabled on some hosts, in which case the call fails. The `PHP_OS_FAMILY` constant indicates the operating system family PHP was built for, and is available as of PHP 7.2.0. Reference: [https://www.php.net/manual/en/reserved.constants.php#constant.php-os-family PHP Manual: Predefined Constants: PHP_OS_FAMILY]. Follow-up to [6779], [57985], [58678], [58684]. Props daymobrew, costdev, desrosj. Fixes #57711. git-svn-id: https://develop.svn.wordpress.org/trunk@59506 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/class-pclzip.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-admin/includes/class-pclzip.php b/src/wp-admin/includes/class-pclzip.php index 658fda5f22495..f1128d900c9e6 100644 --- a/src/wp-admin/includes/class-pclzip.php +++ b/src/wp-admin/includes/class-pclzip.php @@ -5714,7 +5714,7 @@ function PclZipUtilOptionText($p_option) // -------------------------------------------------------------------------------- function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true) { - if (stristr(php_uname(), 'windows')) { + if (PHP_OS_FAMILY == 'Windows') { // ----- Look for potential disk letter if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { $p_path = substr($p_path, $v_position+1); From b4969d4c5236049793ce74fed388cee18b892b21 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Fri, 13 Dec 2024 14:57:56 +0000 Subject: [PATCH 094/323] Build/Test Tools: Remove repository specific logic from callable workflows. Because reusable workflows could be called from any other repository in a variety of contexts, repository specific `if` conditions should not be present. Instead, this logic should be included in the calling workflows only. Props johnbillion. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59507 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/performance.yml | 2 +- .github/workflows/reusable-performance.yml | 2 +- .github/workflows/reusable-phpunit-tests-v3.yml | 4 ++-- .github/workflows/reusable-support-json-reader-v1.yml | 3 --- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index e4929763afa83..dba6091a5547a 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -36,7 +36,7 @@ jobs: uses: WordPress/wordpress-develop/.github/workflows/reusable-performance.yml@trunk permissions: contents: read - if: ${{ ( github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' ) && ! contains( github.event.before, '00000000' ) }} + if: ${{ ( github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' ) }} strategy: fail-fast: false matrix: diff --git a/.github/workflows/reusable-performance.yml b/.github/workflows/reusable-performance.yml index 68f4503d97259..0ca7d5be0a30a 100644 --- a/.github/workflows/reusable-performance.yml +++ b/.github/workflows/reusable-performance.yml @@ -102,7 +102,7 @@ jobs: runs-on: ubuntu-latest permissions: contents: read - if: ${{ ( github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' ) && ! contains( github.event.before, '00000000' ) }} + if: ${{ ! contains( github.event.before, '00000000' ) }} steps: - name: Configure environment variables diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index fd21b3a9b48f5..4310be48e0d33 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -226,7 +226,7 @@ jobs: run: git diff --exit-code - name: Checkout the WordPress Test Reporter - if: ${{ github.repository == 'WordPress/wordpress-develop' && github.ref == 'refs/heads/trunk' && inputs.report }} + if: ${{ github.ref == 'refs/heads/trunk' && inputs.report }} uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: repository: 'WordPress/phpunit-test-runner' @@ -234,7 +234,7 @@ jobs: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} - name: Submit test results to the WordPress.org host test results - if: ${{ github.repository == 'WordPress/wordpress-develop' && github.ref == 'refs/heads/trunk' && inputs.report }} + if: ${{ github.ref == 'refs/heads/trunk' && inputs.report }} env: WPT_REPORT_API_KEY: "${{ secrets.WPT_REPORT_API_KEY }}" run: docker compose run --rm -e WPT_REPORT_API_KEY -e WPT_PREPARE_DIR=/var/www -e WPT_TEST_DIR=/var/www php php test-runner/report.php diff --git a/.github/workflows/reusable-support-json-reader-v1.yml b/.github/workflows/reusable-support-json-reader-v1.yml index ce574e4b2c3b7..f351b716fadb6 100644 --- a/.github/workflows/reusable-support-json-reader-v1.yml +++ b/.github/workflows/reusable-support-json-reader-v1.yml @@ -37,7 +37,6 @@ jobs: major-wp-version: name: Determine major WordPress version runs-on: ubuntu-latest - if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} timeout-minutes: 5 outputs: version: ${{ steps.major-wp-version.outputs.version }} @@ -69,7 +68,6 @@ jobs: php-versions: name: Determine PHP versions runs-on: ubuntu-latest - if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} needs: [ major-wp-version ] timeout-minutes: 5 outputs: @@ -102,7 +100,6 @@ jobs: mysql-versions: name: Determine MySQL versions runs-on: ubuntu-latest - if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} needs: [ major-wp-version ] timeout-minutes: 5 outputs: From ff5850ee31956c9f79bb0fc6b0e9f6d02afc3bb7 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Fri, 13 Dec 2024 15:32:55 +0000 Subject: [PATCH 095/323] Build/Test Tools: Trim down the upgrade testing matrix. The upgrade testing workflow is currently at ~978 jobs spawned from the strategy matrix. While it's great to test all possible combinations, GitHub's UI cannot keep up with tracking that number of jobs, often taking 30-45 minutes to accurately report the outcome even though the jobs themselves all complete in under 5 minutes. This is 2x the total number of concurrent jobs allowed for the entire organization (which creates a backlog and slows everything down even more). This trims down the number of combinations included in the testing matrices to be a bit more thoughtful following the following methodology: - The last two releases of WordPress are tested against all PHP and MySQL LTS version combinations and the most recent innovation release. - The next 6 oldest versions of WordPress are tested against both the oldest and newest releases of PHP currently supported for both PHP 7 & 8 along with the oldest and newest MySQL LTS versions currently supported (no innovation releases). - For the remaining versions of WordPress receiving security updates, they are only included if the database version was different that the previous major release. - The oldest version of WordPress receiving security updates should always be tested against the same full list of combinations as the last two releases. When choosing which MySQL versions to test against: - Only the most recent innovation release should be included in testing. - Even though MySQL >= 5.5.5 is currently supported, there are no 5.5.x Docker containers available that work on modern architectures. - 5.6.x Docker containers are available and work, but 5.6 only accounts for ~2.3% of installs as of 12/6/2024.defaults: - 5.7.x accounts for ~20% of installs, so this is used below instead. With these changes, the total number of jobs is reduced by ~58%. Props johnbillion, mukesh27. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59508 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/upgrade-testing.yml | 123 ++++++++++++++++++++------ 1 file changed, 97 insertions(+), 26 deletions(-) diff --git a/.github/workflows/upgrade-testing.yml b/.github/workflows/upgrade-testing.yml index 8ea2c16bfb36a..bfa94f3874e08 100644 --- a/.github/workflows/upgrade-testing.yml +++ b/.github/workflows/upgrade-testing.yml @@ -1,3 +1,6 @@ +# Confirms that updating WordPress using WP-CLI works successfully. +# +# This workflow is not meant to test wordpress-develop checkouts, but rather tagged versions officially available on WordPress.org. name: Upgrade Tests on: @@ -31,9 +34,28 @@ concurrency: # Any needed permissions should be configured at the job level. permissions: {} +# Because the number of jobs spawned can quickly balloon out of control, the following methodology is applied when +# building out the matrix below: +# +# - The last two releases of WordPress are tested against all PHP/MySQL LTS version combinations and the most recent +# innovation release. +# - The next 6 oldest versions of WordPress are tested against both the oldest and newest releases of PHP currently +# supported for both PHP 7 & 8 along with the oldest and newest MySQL LTS versions currently supported (no innovation +# releases). At the current 3 releases per year pace, this accounts for 2 additional years worth of releases. +# - Of the remaining versions of WordPress still receiving security updates, only test the ones where the database +# version was updated since the previous major release. +# - The oldest version of WordPress receiving security updates should always be tested against the same combinations as +# detailed for the last two releases. + +# Notes about chosen MySQL versions: +# - Only the most recent innovation release should be included in testing. +# - Even though MySQL >= 5.5.5 is currently supported, there are no 5.5.x Docker containers available that work on +# modern architectures. +# - 5.6.x Docker containers are available and work, but 5.6 only accounts for ~2.3% of installs as of 12/6/2024.defaults: +# - 5.7.x accounts for ~20% of installs, so this is used below instead. jobs: - # Spawns upgrade testing from WordPress 6.x versions on PHP 8.x with MySQL. - upgrade-tests-wp-6x-php-8x-mysql: + # Tests the full list of PHP/MySQL combinations for the last two versions of WordPress. + upgrade-tests-last-two-releases: name: ${{ matrix.wp }} to ${{ inputs.new-version && inputs.new-version || 'latest' }} uses: WordPress/wordpress-develop/.github/workflows/reusable-upgrade-testing.yml@trunk if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} @@ -43,12 +65,22 @@ jobs: fail-fast: false matrix: os: [ 'ubuntu-latest' ] - php: [ '8.0', '8.1', '8.2', '8.3', '8.4' ] + php: [ '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ] db-type: [ 'mysql' ] - db-version: [ '5.7', '8.0', '8.4' ] - wp: [ '6.0', '6.1', '6.2', '6.3', '6.4', '6.5', '6.6', '6.7' ] + db-version: [ '5.7', '8.0', '8.4', '9.1' ] + wp: [ '6.6', '6.7' ] multisite: [ false, true ] + exclude: + - php: '7.2' + db-version: '8.4' + - php: '7.3' + db-version: '8.4' + # MySQL 9.0+ will not work on PHP 7.2 & 7.3 + - php: '7.2' + db-version: '9.1' + - php: '7.3' + db-version: '9.1' with: os: ${{ matrix.os }} php: ${{ matrix.php }} @@ -58,8 +90,8 @@ jobs: new-version: ${{ inputs.new-version && inputs.new-version || 'latest' }} multisite: ${{ matrix.multisite }} - # Spawns upgrade testing from WordPress 6.x versions on PHP 7.x with MySQL. - upgrade-tests-wp-6x-php-7x-mysql: + # Tests the remaining 6.x releases on the oldest and newest supported versions of PHP 7 & 8. + upgrade-tests-wp-6x-mysql: name: ${{ matrix.wp }} to ${{ inputs.new-version && inputs.new-version || 'latest' }} uses: WordPress/wordpress-develop/.github/workflows/reusable-upgrade-testing.yml@trunk if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} @@ -69,10 +101,10 @@ jobs: fail-fast: false matrix: os: [ 'ubuntu-latest' ] - php: [ '7.2', '7.3', '7.4' ] + php: [ '7.2', '7.4', '8.0', '8.4' ] db-type: [ 'mysql' ] - db-version: [ '5.7', '8.0', '8.4' ] - wp: [ '6.0', '6.1', '6.2', '6.3', '6.4', '6.5', '6.6', '6.7' ] + db-version: [ '5.7', '8.4' ] + wp: [ '6.0', '6.1', '6.2', '6.3', '6.4', '6.5' ] multisite: [ false, true ] exclude: @@ -89,7 +121,7 @@ jobs: new-version: ${{ inputs.new-version && inputs.new-version || 'latest' }} multisite: ${{ matrix.multisite }} - # Spawns upgrade testing from WordPress 5.x versions on PHP 7.x with MySQL. + # Tests 5.x releases where the WordPress database version changed on the oldest and newest supported versions of PHP 7. upgrade-tests-wp-5x-php-7x-mysql: name: ${{ matrix.wp }} to ${{ inputs.new-version && inputs.new-version || 'latest' }} uses: WordPress/wordpress-develop/.github/workflows/reusable-upgrade-testing.yml@trunk @@ -98,10 +130,10 @@ jobs: fail-fast: false matrix: os: [ 'ubuntu-latest' ] - php: [ '7.2', '7.3', '7.4' ] + php: [ '7.2', '7.4' ] db-type: [ 'mysql' ] - db-version: [ '5.7', '8.0', '8.4' ] - wp: [ '5.0', '5.1', '5.2', '5.3', '5.4', '5.5', '5.6', '5.7', '5.8', '5.9' ] + db-version: [ '5.7', '8.4' ] + wp: [ '5.0', '5.1', '5.3', '5.4', '5.5', '5.6', '5.9' ] multisite: [ false, true ] exclude: @@ -118,7 +150,7 @@ jobs: new-version: ${{ inputs.new-version && inputs.new-version || 'latest' }} multisite: ${{ matrix.multisite }} - # Spawns upgrade testing from WordPress 5.x versions on PHP 8.x with MySQL. + # Tests 5.x releases where the WordPress database version changed on the oldest and newest supported versions of PHP 8. # # WordPress 5.0-5.2 are excluded from PHP 8+ testing because of the following fatal errors: # - Use of __autoload(). @@ -131,10 +163,10 @@ jobs: fail-fast: false matrix: os: [ 'ubuntu-latest' ] - php: [ '8.0', '8.1', '8.2', '8.3', '8.4' ] + php: [ '8.0', '8.4' ] db-type: [ 'mysql' ] - db-version: [ '5.7', '8.0', '8.4' ] - wp: [ '5.3', '5.4', '5.5', '5.6', '5.7', '5.8', '5.9' ] + db-version: [ '5.7', '8.4' ] + wp: [ '5.3', '5.4', '5.5', '5.6', '5.9' ] multisite: [ false, true ] with: os: ${{ matrix.os }} @@ -145,7 +177,9 @@ jobs: new-version: ${{ inputs.new-version && inputs.new-version || 'latest' }} multisite: ${{ matrix.multisite }} - # Spawns upgrade testing from WordPress 4.x versions on PHP 7.x with MySQL. + # Tests 4.x releases where the WordPress database version changed on the oldest and newest supported versions of PHP 7. + # + # The oldest version of WordPress receiving security updates should always be tested. upgrade-tests-wp-4x-php-7x-mysql: name: ${{ matrix.wp }} to ${{ inputs.new-version && inputs.new-version || 'latest' }} uses: WordPress/wordpress-develop/.github/workflows/reusable-upgrade-testing.yml@trunk @@ -154,10 +188,10 @@ jobs: fail-fast: false matrix: os: [ 'ubuntu-latest' ] - php: [ '7.2', '7.3', '7.4' ] + php: [ '7.2', '7.4' ] db-type: [ 'mysql' ] - db-version: [ '5.7', '8.0', '8.4' ] - wp: [ '4.1', '4.2', '4.3', '4.4', '4.5', '4.6', '4.7', '4.8', '4.9' ] + db-version: [ '5.7', '8.4' ] + wp: [ '4.1', '4.2', '4.3', '4.4', '4.5', '4.6', '4.7' ] multisite: [ false, true ] exclude: @@ -174,7 +208,9 @@ jobs: new-version: ${{ inputs.new-version && inputs.new-version || 'latest' }} multisite: ${{ matrix.multisite }} - # Spawns upgrade testing from WordPress 4.x versions on PHP 8.x with MySQL. + # Tests 4.x releases where the WordPress database version changed on the oldest and newest supported versions of PHP 8. + # + # The oldest version of WordPress receiving security updates should always be tested. # # WordPress 4.6-4.9 are excluded from PHP 8+ testing because of the following fatal errors: # - Use of __autoload(). @@ -187,9 +223,9 @@ jobs: fail-fast: false matrix: os: [ 'ubuntu-latest' ] - php: [ '8.0', '8.1', '8.2', '8.3', '8.4' ] + php: [ '8.0', '8.4' ] db-type: [ 'mysql' ] - db-version: [ '5.7', '8.0', '8.4' ] + db-version: [ '5.7', '8.4' ] wp: [ '4.1', '4.2', '4.3', '4.4', '4.5' ] multisite: [ false, true ] with: @@ -201,13 +237,48 @@ jobs: new-version: ${{ inputs.new-version && inputs.new-version || 'latest' }} multisite: ${{ matrix.multisite }} + # The oldest version of WordPress receiving security updates should always be tested against + # the full list of PHP/MySQL combinations. + upgrade-tests-oldest-wp-mysql: + name: ${{ matrix.wp }} to ${{ inputs.new-version && inputs.new-version || 'latest' }} + uses: WordPress/wordpress-develop/.github/workflows/reusable-upgrade-testing.yml@trunk + if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} + strategy: + fail-fast: false + matrix: + os: [ 'ubuntu-latest' ] + php: [ '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ] + db-type: [ 'mysql' ] + db-version: [ '5.7', '8.0', '8.4', '9.1' ] + wp: [ '4.1' ] + multisite: [ false, true ] + + exclude: + - php: '7.2' + db-version: '8.4' + - php: '7.3' + db-version: '8.4' + # MySQL 9.0+ will not work on PHP 7.2 & 7.3 + - php: '7.2' + db-version: '9.1' + - php: '7.3' + db-version: '9.1' + with: + os: ${{ matrix.os }} + php: ${{ matrix.php }} + db-type: ${{ matrix.db-type }} + db-version: ${{ matrix.db-version }} + wp: ${{ matrix.wp }} + new-version: ${{ inputs.new-version && inputs.new-version || 'latest' }} + multisite: ${{ matrix.multisite }} + slack-notifications: name: Slack Notifications uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk permissions: actions: read contents: read - needs: [ upgrade-tests-wp-6x-php-8x-mysql, upgrade-tests-wp-6x-php-7x-mysql, upgrade-tests-wp-5x-php-7x-mysql, upgrade-tests-wp-5x-php-8x-mysql, upgrade-tests-wp-4x-php-7x-mysql, upgrade-tests-wp-4x-php-8x-mysql ] + needs: [ upgrade-tests-last-two-releases, upgrade-tests-wp-6x-mysql, upgrade-tests-wp-5x-php-7x-mysql, upgrade-tests-wp-5x-php-8x-mysql, upgrade-tests-wp-4x-php-7x-mysql, upgrade-tests-wp-4x-php-8x-mysql, upgrade-tests-oldest-wp-mysql ] if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event_name != 'pull_request' && always() }} with: calling_status: ${{ contains( needs.*.result, 'cancelled' ) && 'cancelled' || contains( needs.*.result, 'failure' ) && 'failure' || 'success' }} From 28f4e37dfc7ea14f89d16a2f6d672a8772d2e187 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Fri, 13 Dec 2024 19:04:57 +0000 Subject: [PATCH 096/323] Build/Test Tools: Update `devDependencies`. This updates the following `devDependencies`: - `dotenv` from `16.4.5` to `16.4.7` - `dotenv-expand` from `11.0.6` to `12.0.1` - `postcss` from `8.4.47` to `8.4.49` - `qunit` from `2.22.0` to `2.23.1` - `sass` from `1.79.4` to `1.79.6` - `terser-webpack-plugin` from `5.3.10` to `5.3.11` - `uglify-js` from `3.17.4` to `3.19.3` - `uuid` from `9.0.1` to `11.0.3` - `webpack` from `5.90.2` to `5.97.1` Additionally, `npm audit fix` has been run. Follow up to [58585]. See #62220. git-svn-id: https://develop.svn.wordpress.org/trunk@59509 602fd350-edb4-49c9-b593-d223f7449a82 --- package-lock.json | 1012 +++++++++++++---- package.json | 18 +- .../assets/script-loader-packages.min.php | 2 +- .../assets/script-modules-packages.min.php | 2 +- 4 files changed, 801 insertions(+), 233 deletions(-) diff --git a/package-lock.json b/package-lock.json index 162040e719015..ed9e1b4410f35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -116,8 +116,8 @@ "check-node-version": "4.2.1", "copy-webpack-plugin": "12.0.2", "cssnano": "7.0.6", - "dotenv": "16.4.5", - "dotenv-expand": "11.0.6", + "dotenv": "16.4.7", + "dotenv-expand": "12.0.1", "grunt": "1.6.1", "grunt-banner": "^0.6.0", "grunt-contrib-clean": "~2.0.1", @@ -140,19 +140,19 @@ "ink-docstrap": "1.3.2", "install-changed": "1.1.0", "matchdep": "~2.0.0", - "postcss": "8.4.47", + "postcss": "8.4.49", "prettier": "npm:wp-prettier@2.6.2", - "qunit": "~2.22.0", + "qunit": "~2.23.1", "react-refresh": "0.14.0", - "sass": "1.79.4", + "sass": "1.79.6", "sinon": "16.1.3", "sinon-test": "~3.1.6", "source-map-loader": "5.0.0", - "terser-webpack-plugin": "5.3.10", - "uglify-js": "^3.17.4", - "uuid": "9.0.1", + "terser-webpack-plugin": "5.3.11", + "uglify-js": "^3.19.3", + "uuid": "11.0.3", "wait-on": "8.0.1", - "webpack": "5.90.2", + "webpack": "5.97.1", "webpack-livereload-plugin": "3.0.2" }, "engines": { @@ -3589,19 +3589,20 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "license": "MIT", "dependencies": { @@ -3719,6 +3720,378 @@ "node": ">= 8" } }, + "node_modules/@parcel/watcher": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", + "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.0", + "@parcel/watcher-darwin-arm64": "2.5.0", + "@parcel/watcher-darwin-x64": "2.5.0", + "@parcel/watcher-freebsd-x64": "2.5.0", + "@parcel/watcher-linux-arm-glibc": "2.5.0", + "@parcel/watcher-linux-arm-musl": "2.5.0", + "@parcel/watcher-linux-arm64-glibc": "2.5.0", + "@parcel/watcher-linux-arm64-musl": "2.5.0", + "@parcel/watcher-linux-x64-glibc": "2.5.0", + "@parcel/watcher-linux-x64-musl": "2.5.0", + "@parcel/watcher-win32-arm64": "2.5.0", + "@parcel/watcher-win32-ia32": "2.5.0", + "@parcel/watcher-win32-x64": "2.5.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", + "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", + "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", + "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", + "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", + "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", + "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", + "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", + "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", + "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", + "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", + "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", + "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", + "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@parcel/watcher/node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@parcel/watcher/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@parcel/watcher/node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@parcel/watcher/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/@pkgr/core": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", @@ -5392,30 +5765,33 @@ } }, "node_modules/@types/eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/express": { "version": "4.17.21", @@ -6064,148 +6440,163 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -6289,6 +6680,19 @@ "react": "^18.0.0" } }, + "node_modules/@wordpress/annotations/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@wordpress/api-fetch": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-7.8.2.tgz", @@ -6525,6 +6929,19 @@ "react-dom": "^18.0.0" } }, + "node_modules/@wordpress/block-library/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@wordpress/block-serialization-default-parser": { "version": "5.8.1", "resolved": "https://registry.npmjs.org/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-5.8.1.tgz", @@ -6580,6 +6997,19 @@ "react": "^18.0.0" } }, + "node_modules/@wordpress/blocks/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@wordpress/browserslist-config": { "version": "6.8.1", "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.8.1.tgz", @@ -6677,6 +7107,19 @@ "react-dom": "^18.0.0" } }, + "node_modules/@wordpress/components/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@wordpress/compose": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-7.8.3.tgz", @@ -6773,6 +7216,19 @@ "react-dom": "^18.0.0" } }, + "node_modules/@wordpress/core-data/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@wordpress/customize-widgets": { "version": "5.8.16", "resolved": "https://registry.npmjs.org/@wordpress/customize-widgets/-/customize-widgets-5.8.16.tgz", @@ -7276,6 +7732,19 @@ "react-dom": "^18.0.0" } }, + "node_modules/@wordpress/editor/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@wordpress/element": { "version": "6.8.1", "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-6.8.1.tgz", @@ -9293,13 +9762,15 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/abab": { "version": "2.0.6", @@ -9327,10 +9798,11 @@ } }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -9348,15 +9820,6 @@ "acorn-walk": "^8.0.2" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -12243,10 +12706,11 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -13456,10 +13920,11 @@ } }, "node_modules/default-gateway/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -13734,6 +14199,19 @@ "node": ">=0.10.0" } }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -13923,10 +14401,11 @@ } }, "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -13935,12 +14414,13 @@ } }, "node_modules/dotenv-expand": { - "version": "11.0.6", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", - "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-12.0.1.tgz", + "integrity": "sha512-LaKRbou8gt0RNID/9RoI+J2rvXsBRPMV7p+ElHlPhcSARbCPDYcYG2s1TIzAfWv4YSgyY5taidWzzs31lNV3yQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "dotenv": "^16.4.4" + "dotenv": "^16.4.5" }, "engines": { "node": ">=12" @@ -14117,10 +14597,11 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -15098,10 +15579,11 @@ "dev": true }, "node_modules/eslint/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -15563,10 +16045,11 @@ } }, "node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "nice-try": "^1.0.4", @@ -15730,9 +16213,9 @@ "dev": true }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, "license": "MIT", "dependencies": { @@ -15741,7 +16224,7 @@ "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -15755,7 +16238,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -15770,6 +16253,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/debug": { @@ -15788,9 +16275,9 @@ "dev": true }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "dev": true, "license": "MIT" }, @@ -18189,10 +18676,11 @@ } }, "node_modules/grunt-jsdoc/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -19158,10 +19646,11 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -19601,10 +20090,11 @@ "integrity": "sha512-jQ5Ql18hdCQ4qS+RCrbLfz1n+Pags27q5TwMKvZyhp5hh2UULUYZUy1keqj6k6SYsdqIYjnmz7xyyEY0V67B8Q==" }, "node_modules/immutable": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.2.tgz", - "integrity": "sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og==", - "dev": true + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "dev": true, + "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -20861,10 +21351,11 @@ } }, "node_modules/jest-changed-files/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -25602,15 +26093,16 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -25732,6 +26224,13 @@ "tslib": "^2.0.3" } }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT" + }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -27226,9 +27725,10 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -27444,9 +27944,9 @@ } }, "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "funding": [ { "type": "opencollective", @@ -27464,7 +27964,7 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { @@ -29053,9 +29553,9 @@ } }, "node_modules/qunit": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/qunit/-/qunit-2.22.0.tgz", - "integrity": "sha512-wPYvAvpjTL3zlUeyCX75T8gfZfdVXZa8y1EVkGe/XZNORIsCH/WI2X8R2KlemT921X9EKSZUL6CLGSPC7Ks08g==", + "version": "2.23.1", + "resolved": "https://registry.npmjs.org/qunit/-/qunit-2.23.1.tgz", + "integrity": "sha512-CGrsGy7NhkQmfiyOixBpbexh2PT7ekIb35uWiBi/hBNdTJF1W98UonyACFJJs8UmcP96lH+YJlX99dYZi5rZkg==", "dev": true, "license": "MIT", "dependencies": { @@ -30410,12 +30910,13 @@ } }, "node_modules/sass": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.4.tgz", - "integrity": "sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==", + "version": "1.79.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.6.tgz", + "integrity": "sha512-PVVjeeiUGx6Nj4PtEE/ecwu8ltwfPKzHxbbVmmLj4l1FYHhOyfA0scuVF8sVaa+b+VY4z7BVKjKq0cPUQdUU3g==", "dev": true, "license": "MIT", "dependencies": { + "@parcel/watcher": "^2.4.1", "chokidar": "^4.0.0", "immutable": "^4.0.0", "source-map-js": ">=0.6.2 <2.0.0" @@ -32911,6 +33412,7 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -32976,10 +33478,11 @@ } }, "node_modules/terser": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", - "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -32994,16 +33497,17 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", + "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -33027,11 +33531,69 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/terser/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -33041,6 +33603,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -33525,10 +34088,11 @@ "dev": true }, "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "dev": true, + "license": "BSD-2-Clause", "bin": { "uglifyjs": "bin/uglifyjs" }, @@ -33980,16 +34544,17 @@ } }, "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.3.tgz", + "integrity": "sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==", + "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "license": "MIT", "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist/esm/bin/uuid" } }, "node_modules/v8-to-istanbul": { @@ -34114,10 +34679,11 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -34130,7 +34696,8 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/wbuf": { "version": "1.7.3", @@ -34163,26 +34730,26 @@ "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.90.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.2.tgz", - "integrity": "sha512-ziXu8ABGr0InCMEYFnHrYweinHK2PWrMqnwdHk2oK3rRhv/1B+2FnfwYv5oD+RrknK/Pp/Hmyvu+eAsaMYhzCw==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.21.10", + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", @@ -34190,7 +34757,7 @@ "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.0", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -34312,10 +34879,11 @@ } }, "node_modules/webpack-cli/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", diff --git a/package.json b/package.json index 9720bc105bceb..fe2afcf572122 100644 --- a/package.json +++ b/package.json @@ -38,8 +38,8 @@ "check-node-version": "4.2.1", "copy-webpack-plugin": "12.0.2", "cssnano": "7.0.6", - "dotenv": "16.4.5", - "dotenv-expand": "11.0.6", + "dotenv": "16.4.7", + "dotenv-expand": "12.0.1", "grunt": "1.6.1", "grunt-banner": "^0.6.0", "grunt-contrib-clean": "~2.0.1", @@ -62,19 +62,19 @@ "ink-docstrap": "1.3.2", "install-changed": "1.1.0", "matchdep": "~2.0.0", - "postcss": "8.4.47", + "postcss": "8.4.49", "prettier": "npm:wp-prettier@2.6.2", - "qunit": "~2.22.0", + "qunit": "~2.23.1", "react-refresh": "0.14.0", - "sass": "1.79.4", + "sass": "1.79.6", "sinon": "16.1.3", "sinon-test": "~3.1.6", "source-map-loader": "5.0.0", - "terser-webpack-plugin": "5.3.10", - "uglify-js": "^3.17.4", - "uuid": "9.0.1", + "terser-webpack-plugin": "5.3.11", + "uglify-js": "^3.19.3", + "uuid": "11.0.3", "wait-on": "8.0.1", - "webpack": "5.90.2", + "webpack": "5.97.1", "webpack-livereload-plugin": "3.0.2" }, "dependencies": { diff --git a/src/wp-includes/assets/script-loader-packages.min.php b/src/wp-includes/assets/script-loader-packages.min.php index 6b302c3846cfb..9575fa64e4936 100644 --- a/src/wp-includes/assets/script-loader-packages.min.php +++ b/src/wp-includes/assets/script-loader-packages.min.php @@ -1 +1 @@ -<?php return array('a11y.min.js' => array('dependencies' => array('wp-dom-ready', 'wp-i18n'), 'version' => '3156534cc54473497e14'), 'annotations.min.js' => array('dependencies' => array('wp-data', 'wp-hooks', 'wp-i18n', 'wp-rich-text'), 'version' => '238360e96c76d37a2468'), 'api-fetch.min.js' => array('dependencies' => array('wp-i18n', 'wp-url'), 'version' => 'd387b816bc1ed2042e28'), 'autop.min.js' => array('dependencies' => array(), 'version' => '9fb50649848277dd318d'), 'blob.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '9113eed771d446f4a556'), 'block-directory.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-plugins', 'wp-primitives', 'wp-url'), 'version' => '1e2dcb064ecd5905fe6b'), 'block-editor.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-style-engine', 'wp-token-list', 'wp-url', 'wp-warning', 'wp-wordcount'), 'version' => '28fb4f612c7c613fdd55'), 'block-library.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-autop', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-patterns', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-wordcount'), 'version' => 'ccc402e50b786e799ae9'), 'block-serialization-default-parser.min.js' => array('dependencies' => array(), 'version' => '14d44daebf663d05d330'), 'blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-autop', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-private-apis', 'wp-rich-text', 'wp-shortcode', 'wp-warning'), 'version' => '8474af4b6260126fa879'), 'commands.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-primitives', 'wp-private-apis'), 'version' => '33b90579e9a6d83ac03b'), 'components.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-compose', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-warning'), 'version' => '130172abbae720694b1f'), 'compose.min.js' => array('dependencies' => array('react', 'react-jsx-runtime', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-priority-queue'), 'version' => '85f0708cd2e6b26addeb'), 'core-commands.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-commands', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-private-apis', 'wp-router', 'wp-url'), 'version' => 'e398c3f43e502a9c4a8f'), 'core-data.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-private-apis', 'wp-rich-text', 'wp-url', 'wp-warning'), 'version' => '8224153d27ea1b378c5a'), 'customize-widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-widgets'), 'version' => '6cc7ebe73bf2bd031694'), 'data.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-is-shallow-equal', 'wp-priority-queue', 'wp-private-apis', 'wp-redux-routine'), 'version' => '7c62e39de0308c73d50c'), 'data-controls.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-data', 'wp-deprecated'), 'version' => '49f5587e8b90f9e7cc7e'), 'date.min.js' => array('dependencies' => array('moment', 'wp-deprecated'), 'version' => 'aaca6387d1cf924acc51'), 'deprecated.min.js' => array('dependencies' => array('wp-hooks'), 'version' => 'e1f84915c5e8ae38964c'), 'dom.min.js' => array('dependencies' => array('wp-deprecated'), 'version' => '93117dfee2692b04b770'), 'dom-ready.min.js' => array('dependencies' => array(), 'version' => 'f77871ff7694fffea381'), 'edit-post.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-plugins', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-widgets'), 'version' => 'f56f4976c416ccebe712'), 'edit-site.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-priority-queue', 'wp-private-apis', 'wp-router', 'wp-url', 'wp-warning', 'wp-widgets'), 'version' => '79e90f0c7638bb507b37'), 'edit-widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-viewport', 'wp-widgets'), 'version' => '1efdc3b9daf491cf8991'), 'editor.min.js' => array('dependencies' => array('react', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport', 'wp-warning', 'wp-wordcount'), 'version' => 'd362bb0f0c3fd99674fe'), 'element.min.js' => array('dependencies' => array('react', 'react-dom', 'wp-escape-html'), 'version' => 'cb762d190aebbec25b27'), 'escape-html.min.js' => array('dependencies' => array(), 'version' => '6561a406d2d232a6fbd2'), 'fields.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-blob', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-patterns', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => 'c8dc1e4d8421380ff34a'), 'format-library.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-url'), 'version' => '81b8a9364113f57b6a37'), 'hooks.min.js' => array('dependencies' => array(), 'version' => '4d63a3d491d11ffd8ac6'), 'html-entities.min.js' => array('dependencies' => array(), 'version' => '2cd3358363e0675638fb'), 'i18n.min.js' => array('dependencies' => array('wp-hooks'), 'version' => '5e580eb46a90c2b997e6'), 'is-shallow-equal.min.js' => array('dependencies' => array(), 'version' => 'e0f9f1d78d83f5196979'), 'keyboard-shortcuts.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-data', 'wp-element', 'wp-keycodes'), 'version' => '32686e58e84193ce808b'), 'keycodes.min.js' => array('dependencies' => array('wp-i18n'), 'version' => '034ff647a54b018581d3'), 'list-reusable-blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-blob', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n'), 'version' => 'aa3dd59fcb0ede2ee0da'), 'media-utils.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-blob', 'wp-element', 'wp-i18n'), 'version' => 'e10cc6bfcff4fe474479'), 'notices.min.js' => array('dependencies' => array('wp-data'), 'version' => '673a68a7ac2f556ed50b'), 'nux.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-primitives'), 'version' => '9a0dc535fe222ae46a48'), 'patterns.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => 'b4c7e00c3ec65ecfeaed'), 'plugins.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-element', 'wp-hooks', 'wp-is-shallow-equal', 'wp-primitives'), 'version' => 'ef6da4a9b2747b62c09c'), 'preferences.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-primitives', 'wp-private-apis'), 'version' => '945c6cbfe821b3070047'), 'preferences-persistence.min.js' => array('dependencies' => array('wp-api-fetch'), 'version' => '9307a8c9e3254140a223'), 'primitives.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-element'), 'version' => 'aef2543ab60c8c9bb609'), 'priority-queue.min.js' => array('dependencies' => array(), 'version' => '9c21c957c7e50ffdbf48'), 'private-apis.min.js' => array('dependencies' => array(), 'version' => '4b858962c15c2c7a135f'), 'redux-routine.min.js' => array('dependencies' => array(), 'version' => 'a0a172871afaeb261566'), 'reusable-blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-url'), 'version' => '73735a77e4e5095733da'), 'rich-text.min.js' => array('dependencies' => array('wp-a11y', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-escape-html', 'wp-i18n', 'wp-keycodes'), 'version' => '4021b9e4e9ef4d3cd868'), 'router.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-element', 'wp-polyfill', 'wp-private-apis', 'wp-url'), 'version' => 'e4887fecc16ef03e908f'), 'server-side-render.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-i18n', 'wp-url'), 'version' => '1e0f25c205ebeb30bcd2'), 'shortcode.min.js' => array('dependencies' => array(), 'version' => 'b7747eee0efafd2f0c3b'), 'style-engine.min.js' => array('dependencies' => array(), 'version' => '08cc10e9532531e22456'), 'token-list.min.js' => array('dependencies' => array(), 'version' => '3b5f5dcfde830ecef24f'), 'undo-manager.min.js' => array('dependencies' => array('wp-is-shallow-equal'), 'version' => 'f0698003cb0f0a7bd794'), 'url.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'e87eb76272a3a08402d2'), 'viewport.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-data'), 'version' => '829c9a30d366e1e5054c'), 'warning.min.js' => array('dependencies' => array(), 'version' => 'ed7c8b0940914f4fe44b'), 'widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives'), 'version' => 'e4801fc4b16effe444d8'), 'wordcount.min.js' => array('dependencies' => array(), 'version' => '55d8c2bf3dc99e7ea5ec')); +<?php return array('a11y.min.js' => array('dependencies' => array('wp-dom-ready', 'wp-i18n'), 'version' => '3156534cc54473497e14'), 'annotations.min.js' => array('dependencies' => array('wp-data', 'wp-hooks', 'wp-i18n', 'wp-rich-text'), 'version' => '238360e96c76d37a2468'), 'api-fetch.min.js' => array('dependencies' => array('wp-i18n', 'wp-url'), 'version' => 'd387b816bc1ed2042e28'), 'autop.min.js' => array('dependencies' => array(), 'version' => '9fb50649848277dd318d'), 'blob.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '9113eed771d446f4a556'), 'block-directory.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-plugins', 'wp-primitives', 'wp-url'), 'version' => '39151ef09cafcf3bcb90'), 'block-editor.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-style-engine', 'wp-token-list', 'wp-url', 'wp-warning', 'wp-wordcount'), 'version' => '1bc1536e843749059e17'), 'block-library.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-autop', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-patterns', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-wordcount'), 'version' => '7a4a3cb731837c04e244'), 'block-serialization-default-parser.min.js' => array('dependencies' => array(), 'version' => '14d44daebf663d05d330'), 'blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-autop', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-private-apis', 'wp-rich-text', 'wp-shortcode', 'wp-warning'), 'version' => 'cb271b6aaf12433d00f9'), 'commands.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-primitives', 'wp-private-apis'), 'version' => 'dd13db18ea4531d4fd4f'), 'components.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-compose', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-warning'), 'version' => '9d6405d1df52523cdb7c'), 'compose.min.js' => array('dependencies' => array('react', 'react-jsx-runtime', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-priority-queue'), 'version' => '85dec7c8cc97a2154328'), 'core-commands.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-commands', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-private-apis', 'wp-router', 'wp-url'), 'version' => 'e398c3f43e502a9c4a8f'), 'core-data.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-private-apis', 'wp-rich-text', 'wp-url', 'wp-warning'), 'version' => 'd2e4efaae0db8468d384'), 'customize-widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-widgets'), 'version' => '37501962aef2167588ae'), 'data.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-is-shallow-equal', 'wp-priority-queue', 'wp-private-apis', 'wp-redux-routine'), 'version' => 'fcf175d67ec974dde948'), 'data-controls.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-data', 'wp-deprecated'), 'version' => '49f5587e8b90f9e7cc7e'), 'date.min.js' => array('dependencies' => array('moment', 'wp-deprecated'), 'version' => 'b2f083170ed22ebef396'), 'deprecated.min.js' => array('dependencies' => array('wp-hooks'), 'version' => 'e1f84915c5e8ae38964c'), 'dom.min.js' => array('dependencies' => array('wp-deprecated'), 'version' => '93117dfee2692b04b770'), 'dom-ready.min.js' => array('dependencies' => array(), 'version' => 'f77871ff7694fffea381'), 'edit-post.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-plugins', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-widgets'), 'version' => '7afeea389faaa086488e'), 'edit-site.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-priority-queue', 'wp-private-apis', 'wp-router', 'wp-url', 'wp-warning', 'wp-widgets'), 'version' => '65ffcc054ba0879fe4a8'), 'edit-widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-viewport', 'wp-widgets'), 'version' => '0837e3a0f72404eceec8'), 'editor.min.js' => array('dependencies' => array('react', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport', 'wp-warning', 'wp-wordcount'), 'version' => 'b248ed022e6a138978b3'), 'element.min.js' => array('dependencies' => array('react', 'react-dom', 'wp-escape-html'), 'version' => 'a4eeeadd23c0d7ab1d2d'), 'escape-html.min.js' => array('dependencies' => array(), 'version' => '6561a406d2d232a6fbd2'), 'fields.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-blob', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-patterns', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => '464fc3ce3c9ae20da608'), 'format-library.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-url'), 'version' => '86d7a5d57cc8dd223bba'), 'hooks.min.js' => array('dependencies' => array(), 'version' => '4d63a3d491d11ffd8ac6'), 'html-entities.min.js' => array('dependencies' => array(), 'version' => '2cd3358363e0675638fb'), 'i18n.min.js' => array('dependencies' => array('wp-hooks'), 'version' => '5e580eb46a90c2b997e6'), 'is-shallow-equal.min.js' => array('dependencies' => array(), 'version' => 'e0f9f1d78d83f5196979'), 'keyboard-shortcuts.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-data', 'wp-element', 'wp-keycodes'), 'version' => '32686e58e84193ce808b'), 'keycodes.min.js' => array('dependencies' => array('wp-i18n'), 'version' => '034ff647a54b018581d3'), 'list-reusable-blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-blob', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n'), 'version' => 'ece12b3c74315b4175ef'), 'media-utils.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-blob', 'wp-element', 'wp-i18n'), 'version' => 'e10cc6bfcff4fe474479'), 'notices.min.js' => array('dependencies' => array('wp-data'), 'version' => '673a68a7ac2f556ed50b'), 'nux.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-primitives'), 'version' => '9a0dc535fe222ae46a48'), 'patterns.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => '712ca62469c7d6090da8'), 'plugins.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-element', 'wp-hooks', 'wp-is-shallow-equal', 'wp-primitives'), 'version' => 'ef6da4a9b2747b62c09c'), 'preferences.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-primitives', 'wp-private-apis'), 'version' => '859dd2db2fdba6f5c726'), 'preferences-persistence.min.js' => array('dependencies' => array('wp-api-fetch'), 'version' => '9307a8c9e3254140a223'), 'primitives.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-element'), 'version' => 'aef2543ab60c8c9bb609'), 'priority-queue.min.js' => array('dependencies' => array(), 'version' => '9c21c957c7e50ffdbf48'), 'private-apis.min.js' => array('dependencies' => array(), 'version' => '4b858962c15c2c7a135f'), 'redux-routine.min.js' => array('dependencies' => array(), 'version' => '71b945a4f0f8ce5a037d'), 'reusable-blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-url'), 'version' => '73735a77e4e5095733da'), 'rich-text.min.js' => array('dependencies' => array('wp-a11y', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-escape-html', 'wp-i18n', 'wp-keycodes'), 'version' => '4021b9e4e9ef4d3cd868'), 'router.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-element', 'wp-polyfill', 'wp-private-apis', 'wp-url'), 'version' => 'e4887fecc16ef03e908f'), 'server-side-render.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-i18n', 'wp-url'), 'version' => '345a014347e34be995f0'), 'shortcode.min.js' => array('dependencies' => array(), 'version' => 'b7747eee0efafd2f0c3b'), 'style-engine.min.js' => array('dependencies' => array(), 'version' => '08cc10e9532531e22456'), 'token-list.min.js' => array('dependencies' => array(), 'version' => '3b5f5dcfde830ecef24f'), 'undo-manager.min.js' => array('dependencies' => array('wp-is-shallow-equal'), 'version' => '531015dcaa7cee31c780'), 'url.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'e87eb76272a3a08402d2'), 'viewport.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-data'), 'version' => '829c9a30d366e1e5054c'), 'warning.min.js' => array('dependencies' => array(), 'version' => 'ed7c8b0940914f4fe44b'), 'widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives'), 'version' => '45d6328bc40634dbcd7b'), 'wordcount.min.js' => array('dependencies' => array(), 'version' => '55d8c2bf3dc99e7ea5ec')); diff --git a/src/wp-includes/assets/script-modules-packages.min.php b/src/wp-includes/assets/script-modules-packages.min.php index 9bb1ec6efdab9..d781885650e5a 100644 --- a/src/wp-includes/assets/script-modules-packages.min.php +++ b/src/wp-includes/assets/script-modules-packages.min.php @@ -1 +1 @@ -<?php return array('interactivity/index.min.js' => array('dependencies' => array(), 'version' => '06b8f695ef48ab2d9277', 'type' => 'module'), 'interactivity/debug.min.js' => array('dependencies' => array(), 'version' => 'c77e5317ad566e76e750', 'type' => 'module'), 'interactivity-router/index.min.js' => array('dependencies' => array('@wordpress/interactivity', array('id' => '@wordpress/a11y', 'import' => 'dynamic')), 'version' => 'f01b88335afcef3dfc5d', 'type' => 'module'), 'a11y/index.min.js' => array('dependencies' => array(), 'version' => 'b7d06936b8bc23cff2ad', 'type' => 'module'), 'block-library/file/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => 'fdc2f6842e015af83140', 'type' => 'module'), 'block-library/image/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => 'acfec7b3c0be4a859b31', 'type' => 'module'), 'block-library/navigation/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => '8ff192874fc8910a284c', 'type' => 'module'), 'block-library/query/view.min.js' => array('dependencies' => array('@wordpress/interactivity', array('id' => '@wordpress/interactivity-router', 'import' => 'dynamic')), 'version' => 'f4c91c89fa5271f3dad9', 'type' => 'module'), 'block-library/search/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => '2a73400a693958f604de', 'type' => 'module')); +<?php return array('interactivity/index.min.js' => array('dependencies' => array(), 'version' => '04d9948c85e9600ec2a5', 'type' => 'module'), 'interactivity/debug.min.js' => array('dependencies' => array(), 'version' => '03be8c2fdc10a676f363', 'type' => 'module'), 'interactivity-router/index.min.js' => array('dependencies' => array('@wordpress/interactivity', array('id' => '@wordpress/a11y', 'import' => 'dynamic')), 'version' => '2a2ef420d37f6e7e08a0', 'type' => 'module'), 'a11y/index.min.js' => array('dependencies' => array(), 'version' => 'b7d06936b8bc23cff2ad', 'type' => 'module'), 'block-library/file/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => 'fdc2f6842e015af83140', 'type' => 'module'), 'block-library/image/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => 'acfec7b3c0be4a859b31', 'type' => 'module'), 'block-library/navigation/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => '8ff192874fc8910a284c', 'type' => 'module'), 'block-library/query/view.min.js' => array('dependencies' => array('@wordpress/interactivity', array('id' => '@wordpress/interactivity-router', 'import' => 'dynamic')), 'version' => '0661ecffc048a34462c0', 'type' => 'module'), 'block-library/search/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => '2a73400a693958f604de', 'type' => 'module')); From 20982b75d2817a4c3c38091ee1584a108244c4f5 Mon Sep 17 00:00:00 2001 From: Joe Dolson <joedolson@git.wordpress.org> Date: Fri, 13 Dec 2024 21:08:36 +0000 Subject: [PATCH 097/323] Customize: Remove unnecessary `height: 100%` on accordion button. Remove CSS that could occasionally trigger the accordion buttons to be 100% the height of the accordion container. Props dhewercorus, im3dabasia1, sabernhardt, rvoigt, ghinamt, vishy-moghan, frankbiganski, redkite. Fixes #62491. git-svn-id: https://develop.svn.wordpress.org/trunk@59510 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/css/customize-controls.css | 1 - 1 file changed, 1 deletion(-) diff --git a/src/wp-admin/css/customize-controls.css b/src/wp-admin/css/customize-controls.css index 8149c28d138d6..1805790eb2d3e 100644 --- a/src/wp-admin/css/customize-controls.css +++ b/src/wp-admin/css/customize-controls.css @@ -561,7 +561,6 @@ body.trashing #publish-settings { .accordion-section-title button.accordion-trigger { all: unset; width: 100%; - height: 100%; padding: 10px 30px 11px 14px; display: flex; align-items: center; From ab51fc38f448784644f66321ae13231ec3f2cacc Mon Sep 17 00:00:00 2001 From: Joe Dolson <joedolson@git.wordpress.org> Date: Fri, 13 Dec 2024 21:51:41 +0000 Subject: [PATCH 098/323] Editor: Hide 'Skip to Editor' if editor not supported. Wrap the classic editor 'Skip to Editor' link in a conditional to prevent it from rendering on post types that do not have editor support. Props wildworks, parthvataliya, narenin, sainathpoojary, ankitkumarshah, parthvataliya, im3dabasia1. Fixes #62623. git-svn-id: https://develop.svn.wordpress.org/trunk@59511 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/edit-form-advanced.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/wp-admin/edit-form-advanced.php b/src/wp-admin/edit-form-advanced.php index f20fafb3493cd..b21b50f4ae4df 100644 --- a/src/wp-admin/edit-form-advanced.php +++ b/src/wp-admin/edit-form-advanced.php @@ -546,7 +546,13 @@ ?> <label class="screen-reader-text" id="title-prompt-text" for="title"><?php echo $title_placeholder; ?></label> <input type="text" name="post_title" size="30" value="<?php echo esc_attr( $post->post_title ); ?>" id="title" spellcheck="true" autocomplete="off" /> - <a href="#content" class="button-secondary screen-reader-text skiplink" onclick="if (tinymce) { tinymce.execCommand( 'mceFocus', false, 'content' ); }"><?php esc_html_e( 'Skip to Editor' ); ?></a> + <?php + if ( post_type_supports( $post_type, 'editor' ) ) { + ?> + <a href="#content" class="button-secondary screen-reader-text skiplink" onclick="if (tinymce) { tinymce.execCommand( 'mceFocus', false, 'content' ); }"><?php esc_html_e( 'Skip to Editor' ); ?></a> + <?php + } + ?> </div> <?php /** From 85937e77862ba22f5b7c305d149856363babe4db Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Fri, 13 Dec 2024 23:15:08 +0000 Subject: [PATCH 099/323] Coding Standards: Use strict comparison in `get_blog_id_from_url()`. Follow-up to [https://mu.trac.wordpress.org/changeset/1538 mu:1538]. Props debarghyabanerjee. See #62283. git-svn-id: https://develop.svn.wordpress.org/trunk@59512 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/ms-functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/ms-functions.php b/src/wp-includes/ms-functions.php index 6f9ba85006f59..fa8df6d10875b 100644 --- a/src/wp-includes/ms-functions.php +++ b/src/wp-includes/ms-functions.php @@ -341,7 +341,7 @@ function get_blog_id_from_url( $domain, $path = '/' ) { $path = strtolower( $path ); $id = wp_cache_get( md5( $domain . $path ), 'blog-id-cache' ); - if ( -1 == $id ) { // Blog does not exist. + if ( -1 === $id ) { // Blog does not exist. return 0; } elseif ( $id ) { return (int) $id; From 1cc1af2d6b413e171c5ee1f90af0bd38fdbbba2e Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Fri, 13 Dec 2024 23:51:14 +0000 Subject: [PATCH 100/323] Themes: Replace "Active" wording with "Installed" in the theme install checks page. When reinstalling a theme by uploading a ZIP file, the wording used in some strings referred to the "active" theme even though it's not the currrently active theme. This changeset replaces these strings to refer to the "installed" theme, which is more accurate. Follow-up to [52610], [52580]. Props afercia, ankitkumarshah, abcd95, yogeshbhutkar, parthvataliya, sainathpoojary, virgar, gaellebesson, nuryko, guillaumeturpin, maximemeganck, sabrineg. Fixes #62603. See #54831, #54770 git-svn-id: https://develop.svn.wordpress.org/trunk@59513 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/class-theme-installer-skin.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wp-admin/includes/class-theme-installer-skin.php b/src/wp-admin/includes/class-theme-installer-skin.php index 035e26f608a9f..2f1fa344c9a5b 100644 --- a/src/wp-admin/includes/class-theme-installer-skin.php +++ b/src/wp-admin/includes/class-theme-installer-skin.php @@ -251,7 +251,7 @@ private function do_overwrite() { ); $table = '<table class="update-from-upload-comparison"><tbody>'; - $table .= '<tr><th></th><th>' . esc_html_x( 'Active', 'theme' ) . '</th><th>' . esc_html_x( 'Uploaded', 'theme' ) . '</th></tr>'; + $table .= '<tr><th></th><th>' . esc_html_x( 'Installed', 'theme' ) . '</th><th>' . esc_html_x( 'Uploaded', 'theme' ) . '</th></tr>'; $is_same_theme = true; // Let's consider only these rows. @@ -333,7 +333,7 @@ private function do_overwrite() { if ( $this->is_downgrading ) { $warning = sprintf( /* translators: %s: Documentation URL. */ - __( 'You are uploading an older version of the active theme. You can continue to install the older version, but be sure to <a href="%s">back up your database and files</a> first.' ), + __( 'You are uploading an older version of the installed theme. You can continue to install the older version, but be sure to <a href="%s">back up your database and files</a> first.' ), __( 'https://developer.wordpress.org/advanced-administration/security/backup/' ) ); } else { @@ -351,7 +351,7 @@ private function do_overwrite() { $install_actions['overwrite_theme'] = sprintf( '<a class="button button-primary update-from-upload-overwrite" href="%s" target="_parent">%s</a>', wp_nonce_url( add_query_arg( 'overwrite', $overwrite, $this->url ), 'theme-upload' ), - _x( 'Replace active with uploaded', 'theme' ) + _x( 'Replace installed with uploaded', 'theme' ) ); } else { echo $blocked_message; From b03c9f531d017aa5e15eceeb2534097851e30707 Mon Sep 17 00:00:00 2001 From: Joe Dolson <joedolson@git.wordpress.org> Date: Sat, 14 Dec 2024 01:30:07 +0000 Subject: [PATCH 101/323] Comments: Avoid reverting comment reply when context menu is open. Fix a bug where a comment reply would be discarded if `esc` was pressed to dismiss the context menu in Safari or Firefox. Checks whether the contextmenu is open and ignores the `esc` key if it is. Props yellowafterlife, yogeshbhutkar, joedolson. Fixes #62346. git-svn-id: https://develop.svn.wordpress.org/trunk@59514 602fd350-edb4-49c9-b593-d223f7449a82 --- src/js/_enqueues/admin/edit-comments.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/js/_enqueues/admin/edit-comments.js b/src/js/_enqueues/admin/edit-comments.js index e007edf465c6f..9a3d81a751bd8 100644 --- a/src/js/_enqueues/admin/edit-comments.js +++ b/src/js/_enqueues/admin/edit-comments.js @@ -1020,7 +1020,8 @@ window.commentReply = { setTimeout(function() { var rtop, rbottom, scrollTop, vp, scrollBottom, - isComposing = false; + isComposing = false, + isContextMenuOpen = false; rtop = $('#replyrow').offset().top; rbottom = rtop + $('#replyrow').height(); @@ -1035,9 +1036,20 @@ window.commentReply = { $( '#replycontent' ) .trigger( 'focus' ) + .on( 'contextmenu keydown', function ( e ) { + // Check if the context menu is open and set state. + if ( e.type === 'contextmenu' ) { + isContextMenuOpen = true; + } + + // Update the context menu state if the Escape key is pressed. + if ( e.type === 'keydown' && e.which === 27 && isContextMenuOpen ) { + isContextMenuOpen = false; + } + } ) .on( 'keyup', function( e ) { - // Close on Escape except when Input Method Editors (IMEs) are in use. - if ( e.which === 27 && ! isComposing ) { + // Close on Escape unless Input Method Editors (IMEs) are in use or the context menu is open. + if ( e.which === 27 && ! isComposing && ! isContextMenuOpen ) { commentReply.revert(); } } ) From c3c319ed58fdaddb46190194368b8ffe668902a4 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sat, 14 Dec 2024 23:51:09 +0000 Subject: [PATCH 102/323] Formatting: Check the result of `preg_split()` in `convert_smilies()`. This aims to avoid a fatal error from `count()` when `preg_split()` fails on large input. Includes: * Optimizing the regular expression used to split the input by tags to avoid unlimited backtracking for better performance. * Adjusting the function logic for better readability. Follow-up to [340], [4380], [26191]. Props podpirate, nathkrill, rajinsharwar, dmsnell, bjorsch, q0rban, audrasjb, rupw, Ov3rfly, jorbin, nhrrob, chaion07, mcqueen22, azaozz, narenin, roybellingan, SergeyBiryukov. See #51019. git-svn-id: https://develop.svn.wordpress.org/trunk@59515 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/formatting.php | 61 +++++++++++-------- .../tests/formatting/convertSmilies.php | 12 ++++ 2 files changed, 47 insertions(+), 26 deletions(-) diff --git a/src/wp-includes/formatting.php b/src/wp-includes/formatting.php index b579bcd324299..3ecc352528fec 100644 --- a/src/wp-includes/formatting.php +++ b/src/wp-includes/formatting.php @@ -3473,40 +3473,49 @@ function translate_smiley( $matches ) { */ function convert_smilies( $text ) { global $wp_smiliessearch; - $output = ''; - if ( get_option( 'use_smilies' ) && ! empty( $wp_smiliessearch ) ) { - // HTML loop taken from texturize function, could possible be consolidated. - $textarr = preg_split( '/(<.*>)/U', $text, -1, PREG_SPLIT_DELIM_CAPTURE ); // Capture the tags as well as in between. - $stop = count( $textarr ); // Loop stuff. - // Ignore processing of specific tags. - $tags_to_ignore = 'code|pre|style|script|textarea'; - $ignore_block_element = ''; + if ( ! get_option( 'use_smilies' ) || empty( $wp_smiliessearch ) ) { + // Return default text. + return $text; + } - for ( $i = 0; $i < $stop; $i++ ) { - $content = $textarr[ $i ]; + // HTML loop taken from texturize function, could possible be consolidated. + $textarr = preg_split( '/(<[^>]*>)/U', $text, -1, PREG_SPLIT_DELIM_CAPTURE ); // Capture the tags as well as in between. - // If we're in an ignore block, wait until we find its closing tag. - if ( '' === $ignore_block_element && preg_match( '/^<(' . $tags_to_ignore . ')[^>]*>/', $content, $matches ) ) { - $ignore_block_element = $matches[1]; - } + if ( false === $textarr ) { + // Return default text. + return $text; + } - // If it's not a tag and not in ignore block. - if ( '' === $ignore_block_element && strlen( $content ) > 0 && '<' !== $content[0] ) { - $content = preg_replace_callback( $wp_smiliessearch, 'translate_smiley', $content ); - } + // Loop stuff. + $stop = count( $textarr ); + $output = ''; - // Did we exit ignore block? - if ( '' !== $ignore_block_element && '</' . $ignore_block_element . '>' === $content ) { - $ignore_block_element = ''; - } + // Ignore processing of specific tags. + $tags_to_ignore = 'code|pre|style|script|textarea'; + $ignore_block_element = ''; + + for ( $i = 0; $i < $stop; $i++ ) { + $content = $textarr[ $i ]; - $output .= $content; + // If we're in an ignore block, wait until we find its closing tag. + if ( '' === $ignore_block_element && preg_match( '/^<(' . $tags_to_ignore . ')[^>]*>/', $content, $matches ) ) { + $ignore_block_element = $matches[1]; } - } else { - // Return default text. - $output = $text; + + // If it's not a tag and not in ignore block. + if ( '' === $ignore_block_element && strlen( $content ) > 0 && '<' !== $content[0] ) { + $content = preg_replace_callback( $wp_smiliessearch, 'translate_smiley', $content ); + } + + // Did we exit ignore block? + if ( '' !== $ignore_block_element && '</' . $ignore_block_element . '>' === $content ) { + $ignore_block_element = ''; + } + + $output .= $content; } + return $output; } diff --git a/tests/phpunit/tests/formatting/convertSmilies.php b/tests/phpunit/tests/formatting/convertSmilies.php index 6a6cfffdeb990..c31386c3decb5 100644 --- a/tests/phpunit/tests/formatting/convertSmilies.php +++ b/tests/phpunit/tests/formatting/convertSmilies.php @@ -393,4 +393,16 @@ public function _filter_add_smilies( $wpsmiliestrans ) { $wpsmiliestrans['<3'] = '\xe2\x9d\xa4'; return $wpsmiliestrans; } + + + /** + * Tests that the function does not throw a fatal error from count() + * when preg_split() fails on large input. + * + * @ticket 51019 + */ + public function test_smilies_with_large_text_input() { + $text = '<p><img alt="" src="data:image/png;base64,' . str_repeat( 'iVBORw0KGgoAAAAN', 65536 ) . '="></p> :)'; + $this->assertStringContainsString( "\xf0\x9f\x99\x82", convert_smilies( $text ) ); + } } From cdc2f255acce57372b849d6278c4156e1056c749 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sun, 15 Dec 2024 23:22:22 +0000 Subject: [PATCH 103/323] Tests: Clean up `convert_smilies()` tests. Includes: * Removing redundant `use_smilies` option switches, as it is set to 1 by default. * Restoring the `$wpsmiliestrans` array before performing assertions, not after. * Moving most of the `smilies_init()` calls to a `set_up()` method. Follow-up to [409/tests], [26191], [28717]. See #62278. git-svn-id: https://develop.svn.wordpress.org/trunk@59516 602fd350-edb4-49c9-b593-d223f7449a82 --- .../tests/formatting/convertSmilies.php | 60 +++++-------------- 1 file changed, 14 insertions(+), 46 deletions(-) diff --git a/tests/phpunit/tests/formatting/convertSmilies.php b/tests/phpunit/tests/formatting/convertSmilies.php index c31386c3decb5..24c2a8087a93f 100644 --- a/tests/phpunit/tests/formatting/convertSmilies.php +++ b/tests/phpunit/tests/formatting/convertSmilies.php @@ -8,6 +8,12 @@ */ class Tests_Formatting_ConvertSmilies extends WP_UnitTestCase { + public function set_up() { + parent::set_up(); + + smilies_init(); + } + /** * Basic validation test to confirm that smilies are converted to image * when use_smilies = 1 and not when use_smilies = 0. @@ -15,14 +21,9 @@ class Tests_Formatting_ConvertSmilies extends WP_UnitTestCase { * @dataProvider data_convert_standard_smilies */ public function test_convert_standard_smilies( $input, $converted ) { - // Standard smilies, use_smilies: ON. - update_option( 'use_smilies', 1 ); - - smilies_init(); - $this->assertSame( $converted, convert_smilies( $input ) ); - // Standard smilies, use_smilies: OFF. + // Disable smilies. update_option( 'use_smilies', 0 ); $this->assertSame( $input, convert_smilies( $input ) ); @@ -77,13 +78,6 @@ public function data_convert_standard_smilies() { public function test_convert_custom_smilies( $input, $converted ) { global $wpsmiliestrans; - // Custom smilies, use_smilies: ON. - update_option( 'use_smilies', 1 ); - - if ( ! isset( $wpsmiliestrans ) ) { - smilies_init(); - } - $trans_orig = $wpsmiliestrans; // Save original translations array. $wpsmiliestrans = array( @@ -97,12 +91,12 @@ public function test_convert_custom_smilies( $input, $converted ) { $this->assertSame( $converted, convert_smilies( $input ) ); - // Standard smilies, use_smilies: OFF. + // Disable smilies. update_option( 'use_smilies', 0 ); - $this->assertSame( $input, convert_smilies( $input ) ); - $wpsmiliestrans = $trans_orig; // Reset original translations array. + + $this->assertSame( $input, convert_smilies( $input ) ); } /** @@ -147,14 +141,7 @@ public function test_ignore_smilies_in_tags( $element ) { $input = 'Do we ignore smilies ;-) in ' . $element . ' tags <' . $element . ' class="foo">My Content Here :?: </' . $element . '>'; $expected = "Do we ignore smilies \xf0\x9f\x98\x89 in $element tags <$element class=\"foo\">My Content Here :?: </$element>"; - // Standard smilies, use_smilies: ON. - update_option( 'use_smilies', 1 ); - smilies_init(); - $this->assertSame( $expected, convert_smilies( $input ) ); - - // Standard smilies, use_smilies: OFF. - update_option( 'use_smilies', 0 ); } /** @@ -184,13 +171,9 @@ public function data_ignore_smilies_in_tags() { * @dataProvider data_smilies_combinations */ public function test_smilies_combinations( $input, $converted ) { - // Custom smilies, use_smilies: ON. - update_option( 'use_smilies', 1 ); - smilies_init(); - $this->assertSame( $converted, convert_smilies( $input ) ); - // Custom smilies, use_smilies: OFF. + // Disable smilies. update_option( 'use_smilies', 0 ); $this->assertSame( $input, convert_smilies( $input ) ); @@ -247,13 +230,6 @@ public function data_smilies_combinations() { public function test_single_smilies_in_wpsmiliestrans( $input, $converted ) { global $wpsmiliestrans; - // Standard smilies, use_smilies: ON. - update_option( 'use_smilies', 1 ); - - if ( ! isset( $wpsmiliestrans ) ) { - smilies_init(); - } - $orig_trans = $wpsmiliestrans; // Save original translations array. $wpsmiliestrans = array( @@ -264,12 +240,12 @@ public function test_single_smilies_in_wpsmiliestrans( $input, $converted ) { $this->assertSame( $converted, convert_smilies( $input ) ); - // Standard smilies, use_smilies: OFF. + // Disable smilies. update_option( 'use_smilies', 0 ); - $this->assertSame( $input, convert_smilies( $input ) ); - $wpsmiliestrans = $orig_trans; // Reset original translations array. + + $this->assertSame( $input, convert_smilies( $input ) ); } /** @@ -312,15 +288,7 @@ public function data_single_smilies_in_wpsmiliestrans() { * @dataProvider data_spaces_around_smilies */ public function test_spaces_around_smilies( $input, $converted ) { - // Standard smilies, use_smilies: ON. - update_option( 'use_smilies', 1 ); - - smilies_init(); - $this->assertSame( $converted, convert_smilies( $input ) ); - - // Standard smilies, use_smilies: OFF. - update_option( 'use_smilies', 0 ); } /** From 0530261e7d93ca8cdbfab1e6eb3d6c474af51c56 Mon Sep 17 00:00:00 2001 From: Felix Arntz <flixos90@git.wordpress.org> Date: Mon, 16 Dec 2024 14:06:05 +0000 Subject: [PATCH 104/323] Site Health: Remove use of deprecated function from `wp_is_https_supported()`. Follow up to [56664]. Props peter8nss, debarghyabanerjee, sebastienserre, geekofshire, swissspidy, desrosj. Fixes #62252. See #58494. git-svn-id: https://develop.svn.wordpress.org/trunk@59517 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/https-detection.php | 22 ++++++++++--------- tests/phpunit/tests/https-detection.php | 29 ++++++++++++++++++++----- 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/src/wp-includes/https-detection.php b/src/wp-includes/https-detection.php index f34d6a3a11082..87fd4ad626dab 100644 --- a/src/wp-includes/https-detection.php +++ b/src/wp-includes/https-detection.php @@ -63,31 +63,33 @@ function wp_is_site_url_using_https() { /** * Checks whether HTTPS is supported for the server and domain. * + * This function makes an HTTP request through `wp_get_https_detection_errors()` + * to check for HTTPS support. As this process can be resource-intensive, + * it should be used cautiously, especially in performance-sensitive environments, + * to avoid potential latency issues. + * * @since 5.7.0 * * @return bool True if HTTPS is supported, false otherwise. */ function wp_is_https_supported() { - $https_detection_errors = get_option( 'https_detection_errors' ); - - // If option has never been set by the Cron hook before, run it on-the-fly as fallback. - if ( false === $https_detection_errors ) { - wp_update_https_detection_errors(); + $https_detection_errors = wp_get_https_detection_errors(); - $https_detection_errors = get_option( 'https_detection_errors' ); - } - - // If there are no detection errors, HTTPS is supported. + // If there are errors, HTTPS is not supported. return empty( $https_detection_errors ); } /** * Runs a remote HTTPS request to detect whether HTTPS supported, and stores potential errors. * - * This internal function is called by a regular Cron hook to ensure HTTPS support is detected and maintained. + * This function checks for HTTPS support by making an HTTP request. As this process can be resource-intensive, + * it should be used cautiously, especially in performance-sensitive environments. + * It is called when HTTPS support needs to be validated. * * @since 6.4.0 * @access private + * + * @return array An array containing potential detection errors related to HTTPS, or an empty array if no errors are found. */ function wp_get_https_detection_errors() { /** diff --git a/tests/phpunit/tests/https-detection.php b/tests/phpunit/tests/https-detection.php index da2fdc2d8a7d2..a425878ab114f 100644 --- a/tests/phpunit/tests/https-detection.php +++ b/tests/phpunit/tests/https-detection.php @@ -41,17 +41,34 @@ public function test_wp_is_using_https() { * @ticket 47577 */ public function test_wp_is_https_supported() { - // The function works with cached errors, so only test that here. - $wp_error = new WP_Error(); + // Simulate that HTTPS is supported by returning an empty error array. + add_filter( + 'pre_wp_get_https_detection_errors', + function () { + return new WP_Error(); // No errors means HTTPS is supported. + } + ); // No errors, so HTTPS is supported. - update_option( 'https_detection_errors', $wp_error->errors ); $this->assertTrue( wp_is_https_supported() ); - // Errors, so HTTPS is not supported. - $wp_error->add( 'ssl_verification_failed', 'SSL verification failed.' ); - update_option( 'https_detection_errors', $wp_error->errors ); + // Now we simulate that HTTPS is not supported by returning errors. + $support_errors = new WP_Error(); + $support_errors->add( 'ssl_verification_failed', 'SSL verification failed.' ); + + // Short-circuit the detection logic to return our simulated errors. + add_filter( + 'pre_wp_get_https_detection_errors', + function () use ( $support_errors ) { + return $support_errors; + } + ); + + // Test that HTTPS is not supported due to the simulated errors. $this->assertFalse( wp_is_https_supported() ); + + // Remove the filter to avoid affecting other tests. + remove_filter( 'pre_wp_get_https_detection_errors', '__return_null' ); } /** From b670db9b44f4cf48383425180afd23bcd8be12fa Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Mon, 16 Dec 2024 19:27:59 +0000 Subject: [PATCH 105/323] Build/Test Tools: Update `slackapi/slack-github-action`. This makes the necessary changes to update the Slack GitHub Action to the latest version, currently `2.0.0`. Most notably this update provides more control over how attempts re retried when rate limiting is encountered. Reverts [59209]. See #61701, #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59519 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/slack-notifications.yml | 36 ++++++++++------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/.github/workflows/slack-notifications.yml b/.github/workflows/slack-notifications.yml index 2f125aef7a0f4..cbd1e94427ba8 100644 --- a/.github/workflows/slack-notifications.yml +++ b/.github/workflows/slack-notifications.yml @@ -161,66 +161,62 @@ jobs: failure: name: Failure notifications runs-on: ubuntu-latest - continue-on-error: true - timeout-minutes: 5 + timeout-minutes: 10 needs: [ prepare ] if: ${{ needs.prepare.outputs.previous_conclusion != 'first-failure' && inputs.calling_status == 'failure' || failure() }} steps: - name: Post failure notifications to Slack - uses: slackapi/slack-github-action@37ebaef184d7626c5f204ab8d3baff4262dd30f0 # v1.27.0 + uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0 with: + webhook-type: webhook-trigger + webhook: ${{ secrets.SLACK_GHA_FAILURE_WEBHOOK }} payload: ${{ needs.prepare.outputs.payload }} - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_GHA_FAILURE_WEBHOOK }} # Posts notifications the first time a workflow run succeeds after previously failing. fixed: name: Fixed notifications runs-on: ubuntu-latest - continue-on-error: true - timeout-minutes: 5 + timeout-minutes: 10 needs: [ prepare ] if: ${{ contains( fromJson( '["failure", "cancelled", "none"]' ), needs.prepare.outputs.previous_conclusion ) && inputs.calling_status == 'success' && success() }} steps: - name: Post failure notifications to Slack - uses: slackapi/slack-github-action@37ebaef184d7626c5f204ab8d3baff4262dd30f0 # v1.27.0 + uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0 with: + webhook-type: webhook-trigger + webhook: ${{ secrets.SLACK_GHA_FIXED_WEBHOOK }} payload: ${{ needs.prepare.outputs.payload }} - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_GHA_FIXED_WEBHOOK }} # Posts notifications when a workflow is successful. success: name: Success notifications runs-on: ubuntu-latest - continue-on-error: true - timeout-minutes: 5 + timeout-minutes: 10 needs: [ prepare ] if: ${{ inputs.calling_status == 'success' && success() }} steps: - name: Post success notifications to Slack - uses: slackapi/slack-github-action@37ebaef184d7626c5f204ab8d3baff4262dd30f0 # v1.27.0 + uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0 with: + webhook-type: webhook-trigger + webhook: ${{ secrets.SLACK_GHA_SUCCESS_WEBHOOK }} payload: ${{ needs.prepare.outputs.payload }} - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_GHA_SUCCESS_WEBHOOK }} # Posts notifications when a workflow is cancelled. cancelled: name: Cancelled notifications runs-on: ubuntu-latest - continue-on-error: true - timeout-minutes: 5 + timeout-minutes: 10 needs: [ prepare ] if: ${{ inputs.calling_status == 'cancelled' || cancelled() }} steps: - name: Post cancelled notifications to Slack - uses: slackapi/slack-github-action@37ebaef184d7626c5f204ab8d3baff4262dd30f0 # v1.27.0 + uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0 with: + webhook-type: webhook-trigger + webhook: ${{ secrets.SLACK_GHA_CANCELLED_WEBHOOK }} payload: ${{ needs.prepare.outputs.payload }} - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_GHA_CANCELLED_WEBHOOK }} From 716e9300d6793e63c3a824b327b0ce1a6dd4a271 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Mon, 16 Dec 2024 19:38:03 +0000 Subject: [PATCH 106/323] Build/Test Tools: Support manual runs for the test old branch workflow. This is the only workflow that does not currently support manually running. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59520 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/test-old-branches.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test-old-branches.yml b/.github/workflows/test-old-branches.yml index be554bdc149dc..649b7190955fc 100644 --- a/.github/workflows/test-old-branches.yml +++ b/.github/workflows/test-old-branches.yml @@ -12,6 +12,7 @@ on: schedule: - cron: '0 0 1 * *' - cron: '0 0 15 * *' + workflow_dispatch: # Disable permissions for all available scopes by default. # Any needed permissions should be configured at the job level. From 8eaaf53f61de9bb7612fdf03d68ef6689aaca0e2 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Mon, 16 Dec 2024 20:04:52 +0000 Subject: [PATCH 107/323] Build/Test Tools: Update the Codecov GitHub Action. This updates the `codecov/codecov-action` to from version `4.6.0` to `5.1.1`. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59521 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-phpunit-tests-v3.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index 4310be48e0d33..03ec815460f55 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -207,7 +207,7 @@ jobs: - name: Upload test coverage report to Codecov if: ${{ inputs.coverage-report }} - uses: codecov/codecov-action@b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238 # v4.6.0 + uses: codecov/codecov-action@7f8b4b4bde536c465e797be725718b88c5d95e0e # v5.1.1 with: token: ${{ secrets.CODECOV_TOKEN }} file: wp-code-coverage${{ inputs.multisite && '-multisite' || '-single' }}-${{ github.sha }}.xml From f6fb194a0755d82037247916305b51ae70b995d0 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Mon, 16 Dec 2024 23:49:11 +0000 Subject: [PATCH 108/323] Editor: Check `get_user_count()` instead of `get_users()` for the locked post notice. This aims to avoid slowing down the post editing by using a cached value instead of calling `get_users()`, which can be slow when plugins add various filters to all `get_users()` calls, especially with meta value comparisons on large `user_meta` tables. Follow-up to [24304], [24543], [41829], [53011], [53018]. Props berislav.grgicak, bor0, costdev. See #55958. git-svn-id: https://develop.svn.wordpress.org/trunk@59522 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/edit-form-advanced.php | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/wp-admin/edit-form-advanced.php b/src/wp-admin/edit-form-advanced.php index b21b50f4ae4df..319a534fd2791 100644 --- a/src/wp-admin/edit-form-advanced.php +++ b/src/wp-admin/edit-form-advanced.php @@ -25,14 +25,7 @@ if ( is_multisite() ) { add_action( 'admin_footer', '_admin_notice_post_locked' ); } else { - $check_users = get_users( - array( - 'fields' => 'ID', - 'number' => 2, - ) - ); - - if ( count( $check_users ) > 1 ) { + if ( get_user_count() > 1 ) { add_action( 'admin_footer', '_admin_notice_post_locked' ); } From dab286ee785c0c229f0ad7925d15f01fe5bcf6e0 Mon Sep 17 00:00:00 2001 From: bernhard-reiter <bernhard-reiter@git.wordpress.org> Date: Tue, 17 Dec 2024 10:35:17 +0000 Subject: [PATCH 109/323] Block Hooks: Enable for post content. Block Hooks were previously only applied to layout elements such as templates, template parts, patterns, and navigation menus -- things that are edited in the Site Editor. This changeset enables Block Hooks in post content. The parity between frontend and editor is preserved: Blocks inserted by Block Hooks are visible both on the frontend and in the editor, and any customizations made by the user are respected on the frontend. This is possible thanks to setting the `metadata.ignoredHookedBlocks` attribute on anchor blocks (a technique first introduced in [57594]). For first child and last child insertion into a Post Content block, the corresponding post object's `_wp_ignored_hooked_blocks` post meta is set. Props bernhard-reiter, gziolo, jonsurrell, karolmanijak, leewillis77. Fixes #61074. git-svn-id: https://develop.svn.wordpress.org/trunk@59523 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/blocks.php | 86 +++++++++++++------ src/wp-includes/default-filters.php | 7 +- .../tests/blocks/applyBlockHooksToContent.php | 20 +++++ 3 files changed, 88 insertions(+), 25 deletions(-) diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index 94c4dfa43afb6..6a4ab4636c803 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -912,7 +912,7 @@ function insert_hooked_blocks( &$parsed_anchor_block, $relative_position, $hooke * @param string $relative_position The relative position of the hooked blocks. * Can be one of 'before', 'after', 'first_child', or 'last_child'. * @param string $anchor_block_type The anchor block type. - * @param WP_Block_Template|WP_Post|array $context The block template, template part, `wp_navigation` post type, + * @param WP_Block_Template|WP_Post|array $context The block template, template part, post object, * or pattern that the anchor block belongs to. */ $hooked_block_types = apply_filters( 'hooked_block_types', $hooked_block_types, $relative_position, $anchor_block_type, $context ); @@ -935,7 +935,7 @@ function insert_hooked_blocks( &$parsed_anchor_block, $relative_position, $hooke * @param string $hooked_block_type The hooked block type name. * @param string $relative_position The relative position of the hooked block. * @param array $parsed_anchor_block The anchor block, in parsed block array format. - * @param WP_Block_Template|WP_Post|array $context The block template, template part, `wp_navigation` post type, + * @param WP_Block_Template|WP_Post|array $context The block template, template part, post object, * or pattern that the anchor block belongs to. */ $parsed_hooked_block = apply_filters( 'hooked_block', $parsed_hooked_block, $hooked_block_type, $relative_position, $parsed_anchor_block, $context ); @@ -951,7 +951,7 @@ function insert_hooked_blocks( &$parsed_anchor_block, $relative_position, $hooke * @param string $hooked_block_type The hooked block type name. * @param string $relative_position The relative position of the hooked block. * @param array $parsed_anchor_block The anchor block, in parsed block array format. - * @param WP_Block_Template|WP_Post|array $context The block template, template part, `wp_navigation` post type, + * @param WP_Block_Template|WP_Post|array $context The block template, template part, post object, * or pattern that the anchor block belongs to. */ $parsed_hooked_block = apply_filters( "hooked_block_{$hooked_block_type}", $parsed_hooked_block, $hooked_block_type, $relative_position, $parsed_anchor_block, $context ); @@ -1039,17 +1039,25 @@ function set_ignored_hooked_blocks_metadata( &$parsed_anchor_block, $relative_po * * @since 6.6.0 * @since 6.7.0 Injects the `theme` attribute into Template Part blocks, even if no hooked blocks are registered. + * @since 6.8.0 Have the `$context` parameter default to `null`, in which case `get_post()` will be called to use the current post as context. * @access private * - * @param string $content Serialized content. - * @param WP_Block_Template|WP_Post|array $context A block template, template part, `wp_navigation` post object, - * or pattern that the blocks belong to. - * @param callable $callback A function that will be called for each block to generate - * the markup for a given list of blocks that are hooked to it. - * Default: 'insert_hooked_blocks'. + * @param string $content Serialized content. + * @param WP_Block_Template|WP_Post|array|null $context A block template, template part, post object, or pattern + * that the blocks belong to. If set to `null`, `get_post()` + * will be called to use the current post as context. + * Default: `null`. + * @param callable $callback A function that will be called for each block to generate + * the markup for a given list of blocks that are hooked to it. + * Default: 'insert_hooked_blocks'. * @return string The serialized markup. */ -function apply_block_hooks_to_content( $content, $context, $callback = 'insert_hooked_blocks' ) { +function apply_block_hooks_to_content( $content, $context = null, $callback = 'insert_hooked_blocks' ) { + // Default to the current post if no context is provided. + if ( null === $context ) { + $context = get_post(); + } + $hooked_blocks = get_hooked_blocks(); $before_block_visitor = '_inject_theme_attribute_in_template_part_block'; @@ -1165,10 +1173,11 @@ function extract_serialized_parent_block( $serialized_block ) { } /** - * Updates the wp_postmeta with the list of ignored hooked blocks where the inner blocks are stored as post content. - * Currently only supports `wp_navigation` post types. + * Updates the wp_postmeta with the list of ignored hooked blocks + * where the inner blocks are stored as post content. * * @since 6.6.0 + * @since 6.8.0 Support non-`wp_navigation` post types. * @access private * * @param stdClass $post Post object. @@ -1176,7 +1185,7 @@ function extract_serialized_parent_block( $serialized_block ) { */ function update_ignored_hooked_blocks_postmeta( $post ) { /* - * In this scenario the user has likely tried to create a navigation via the REST API. + * In this scenario the user has likely tried to create a new post object via the REST API. * In which case we won't have a post ID to work with and store meta against. */ if ( empty( $post->ID ) ) { @@ -1184,7 +1193,7 @@ function update_ignored_hooked_blocks_postmeta( $post ) { } /* - * Skip meta generation when consumers intentionally update specific Navigation fields + * Skip meta generation when consumers intentionally update specific fields * and omit the content update. */ if ( ! isset( $post->post_content ) ) { @@ -1192,9 +1201,9 @@ function update_ignored_hooked_blocks_postmeta( $post ) { } /* - * Skip meta generation when the post content is not a navigation block. + * Skip meta generation if post type is not set. */ - if ( ! isset( $post->post_type ) || 'wp_navigation' !== $post->post_type ) { + if ( ! isset( $post->post_type ) ) { return $post; } @@ -1208,8 +1217,14 @@ function update_ignored_hooked_blocks_postmeta( $post ) { ); } + if ( 'wp_navigation' === $post->post_type ) { + $wrapper_block_type = 'core/navigation'; + } else { + $wrapper_block_type = 'core/post-content'; + } + $markup = get_comment_delimited_block_content( - 'core/navigation', + $wrapper_block_type, $attributes, $post->post_content ); @@ -1266,16 +1281,17 @@ function insert_hooked_blocks_and_set_ignored_hooked_blocks_metadata( &$parsed_a } /** - * Hooks into the REST API response for the core/navigation block and adds the first and last inner blocks. + * Hooks into the REST API response for the Posts endpoint and adds the first and last inner blocks. * * @since 6.6.0 + * @since 6.8.0 Support non-`wp_navigation` post types. * * @param WP_REST_Response $response The response object. * @param WP_Post $post Post object. * @return WP_REST_Response The response object. */ function insert_hooked_blocks_into_rest_response( $response, $post ) { - if ( ! isset( $response->data['content']['raw'] ) || ! isset( $response->data['content']['rendered'] ) ) { + if ( empty( $response->data['content']['raw'] ) || empty( $response->data['content']['rendered'] ) ) { return $response; } @@ -1287,22 +1303,44 @@ function insert_hooked_blocks_into_rest_response( $response, $post ) { 'ignoredHookedBlocks' => $ignored_hooked_blocks, ); } + + if ( 'wp_navigation' === $post->post_type ) { + $wrapper_block_type = 'core/navigation'; + } else { + $wrapper_block_type = 'core/post-content'; + } + $content = get_comment_delimited_block_content( - 'core/navigation', + $wrapper_block_type, $attributes, $response->data['content']['raw'] ); - $content = apply_block_hooks_to_content( $content, $post ); + $content = apply_block_hooks_to_content( + $content, + $post, + 'insert_hooked_blocks_and_set_ignored_hooked_blocks_metadata' + ); - // Remove mock Navigation block wrapper. + // Remove mock block wrapper. $content = remove_serialized_parent_block( $content ); $response->data['content']['raw'] = $content; + // `apply_block_hooks_to_content` is called above. Ensure it is not called again as a filter. + $priority = has_filter( 'the_content', 'apply_block_hooks_to_content' ); + if ( false !== $priority ) { + remove_filter( 'the_content', 'apply_block_hooks_to_content', $priority ); + } + /** This filter is documented in wp-includes/post-template.php */ $response->data['content']['rendered'] = apply_filters( 'the_content', $content ); + // Restore the filter if it was set initially. + if ( false !== $priority ) { + add_filter( 'the_content', 'apply_block_hooks_to_content', $priority ); + } + return $response; } @@ -1320,7 +1358,7 @@ function insert_hooked_blocks_into_rest_response( $response, $post ) { * @access private * * @param array $hooked_blocks An array of blocks hooked to another given block. - * @param WP_Block_Template|WP_Post|array $context A block template, template part, `wp_navigation` post object, + * @param WP_Block_Template|WP_Post|array $context A block template, template part, post object, * or pattern that the blocks belong to. * @param callable $callback A function that will be called for each block to generate * the markup for a given list of blocks that are hooked to it. @@ -1377,7 +1415,7 @@ function make_before_block_visitor( $hooked_blocks, $context, $callback = 'inser * @access private * * @param array $hooked_blocks An array of blocks hooked to another block. - * @param WP_Block_Template|WP_Post|array $context A block template, template part, `wp_navigation` post object, + * @param WP_Block_Template|WP_Post|array $context A block template, template part, post object, * or pattern that the blocks belong to. * @param callable $callback A function that will be called for each block to generate * the markup for a given list of blocks that are hooked to it. diff --git a/src/wp-includes/default-filters.php b/src/wp-includes/default-filters.php index ae654605e8f4b..18ef8517edce2 100644 --- a/src/wp-includes/default-filters.php +++ b/src/wp-includes/default-filters.php @@ -192,6 +192,7 @@ add_filter( 'the_title', 'convert_chars' ); add_filter( 'the_title', 'trim' ); +add_filter( 'the_content', 'apply_block_hooks_to_content', 8 ); // BEFORE do_blocks(). add_filter( 'the_content', 'do_blocks', 9 ); add_filter( 'the_content', 'wptexturize' ); add_filter( 'the_content', 'convert_smilies', 20 ); @@ -760,9 +761,13 @@ add_filter( 'rest_pre_insert_wp_template_part', 'inject_ignored_hooked_blocks_metadata_attributes' ); // Update ignoredHookedBlocks postmeta for wp_navigation post type. +add_filter( 'rest_pre_insert_page', 'update_ignored_hooked_blocks_postmeta' ); +add_filter( 'rest_pre_insert_post', 'update_ignored_hooked_blocks_postmeta' ); add_filter( 'rest_pre_insert_wp_navigation', 'update_ignored_hooked_blocks_postmeta' ); -// Inject hooked blocks into the wp_navigation post type REST response. +// Inject hooked blocks into the Posts endpoint REST response for some given post types. +add_filter( 'rest_prepare_page', 'insert_hooked_blocks_into_rest_response', 10, 2 ); +add_filter( 'rest_prepare_post', 'insert_hooked_blocks_into_rest_response', 10, 2 ); add_filter( 'rest_prepare_wp_navigation', 'insert_hooked_blocks_into_rest_response', 10, 2 ); unset( $filter, $action ); diff --git a/tests/phpunit/tests/blocks/applyBlockHooksToContent.php b/tests/phpunit/tests/blocks/applyBlockHooksToContent.php index f238ef6ff5266..22e3c6e8dffb5 100644 --- a/tests/phpunit/tests/blocks/applyBlockHooksToContent.php +++ b/tests/phpunit/tests/blocks/applyBlockHooksToContent.php @@ -91,6 +91,26 @@ public function test_apply_block_hooks_to_content_inserts_hooked_block() { ); } + /** + * @ticket 61074 + */ + public function test_apply_block_hooks_to_content_with_context_set_to_null() { + $content = '<!-- wp:tests/anchor-block /-->'; + + /* + * apply_block_hooks_to_content() will fall back to the global $post object (via get_post()) + * if the $context parameter is null. However, we'd also like to ensure that the function + * works as expected even when get_post() returns null. + */ + $this->assertNull( get_post() ); + + $actual = apply_block_hooks_to_content( $content, null, 'insert_hooked_blocks' ); + $this->assertSame( + '<!-- wp:tests/anchor-block /--><!-- wp:tests/hooked-block /-->', + $actual + ); + } + /** * @ticket 61902 */ From 8b4425ad9c3e805a603cf60429c3dba88c7ff0ef Mon Sep 17 00:00:00 2001 From: Pascal Birchler <swissspidy@git.wordpress.org> Date: Tue, 17 Dec 2024 12:09:55 +0000 Subject: [PATCH 110/323] Build/Test Tools: Add Twenty Twenty-Five to the Performance Tests. Updates the baseline used for the performance tests to 6.7, so that the theme is available in those test runs. Props joemcgill, flixos90, desrosj, swissspidy. Fixes #62148. git-svn-id: https://develop.svn.wordpress.org/trunk@59524 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-performance.yml | 2 +- tests/performance/specs/home.test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/reusable-performance.yml b/.github/workflows/reusable-performance.yml index 0ca7d5be0a30a..ec8e49b0394d3 100644 --- a/.github/workflows/reusable-performance.yml +++ b/.github/workflows/reusable-performance.yml @@ -15,7 +15,7 @@ on: description: 'The version being used for baseline measurements.' required: false type: 'string' - default: '6.1.1' + default: '6.7' php-version: description: 'The PHP version to use.' required: false diff --git a/tests/performance/specs/home.test.js b/tests/performance/specs/home.test.js index b88b6adb9f362..004c8f03debd4 100644 --- a/tests/performance/specs/home.test.js +++ b/tests/performance/specs/home.test.js @@ -14,7 +14,7 @@ const results = { lcpMinusTtfb: [], }; -const themes = [ 'twentytwentyone', 'twentytwentythree', 'twentytwentyfour' ]; +const themes = [ 'twentytwentyone', 'twentytwentythree', 'twentytwentyfour', 'twentytwentyfive' ]; const locales = [ 'en_US', 'de_DE' ]; From e58bef6fdc10bbbbba02e58a34dbca022e956543 Mon Sep 17 00:00:00 2001 From: Pascal Birchler <swissspidy@git.wordpress.org> Date: Tue, 17 Dec 2024 12:45:50 +0000 Subject: [PATCH 111/323] Build/Test Tools: Use correct tag name for the baseline version. The tagged version on GitHub requires the trailing `.0`. See #62148. git-svn-id: https://develop.svn.wordpress.org/trunk@59525 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-performance.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reusable-performance.yml b/.github/workflows/reusable-performance.yml index ec8e49b0394d3..deb156897f066 100644 --- a/.github/workflows/reusable-performance.yml +++ b/.github/workflows/reusable-performance.yml @@ -15,7 +15,7 @@ on: description: 'The version being used for baseline measurements.' required: false type: 'string' - default: '6.7' + default: '6.7.0' php-version: description: 'The PHP version to use.' required: false From 20c0327117378f37f96eb59a1d22e1bee86492d4 Mon Sep 17 00:00:00 2001 From: Pascal Birchler <swissspidy@git.wordpress.org> Date: Tue, 17 Dec 2024 13:26:04 +0000 Subject: [PATCH 112/323] Build/Test Tools: Fix version number when downgrading WP in performance tests. The tagged version on GitHub requires the trailing `.0`, but `wp core update` doesn't accept a trailing zero. Follow-up to [59525]. See #62148. git-svn-id: https://develop.svn.wordpress.org/trunk@59526 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-performance.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/reusable-performance.yml b/.github/workflows/reusable-performance.yml index deb156897f066..e5c29aa0b1849 100644 --- a/.github/workflows/reusable-performance.yml +++ b/.github/workflows/reusable-performance.yml @@ -263,7 +263,9 @@ jobs: - name: Set the environment to the baseline version if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' }} run: | - npm run env:cli -- core update --version=${{ env.BASE_TAG }} --force --path=/var/www/${{ env.LOCAL_DIR }} + VERSION="${{ env.BASE_TAG }}" + VERSION="${VERSION%.0}" + npm run env:cli -- core update --version=$VERSION --force --path=/var/www/${{ env.LOCAL_DIR }} npm run env:cli -- core version --path=/var/www/${{ env.LOCAL_DIR }} - name: Run any database upgrades From ffceac51dab7878c1401c2a1cc7737409fcff7a9 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Tue, 17 Dec 2024 14:43:43 +0000 Subject: [PATCH 113/323] Build/Test Tools: Use MySQL 8.4 as the default. MySQL 8.4 is the latest LTS. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59527 602fd350-edb4-49c9-b593-d223f7449a82 --- .env.example | 2 +- .github/workflows/reusable-phpunit-tests-v3.yml | 2 +- .github/workflows/reusable-test-local-docker-environment-v1.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.env.example b/.env.example index 70cd4153b3757..55f78229c03af 100644 --- a/.env.example +++ b/.env.example @@ -51,7 +51,7 @@ LOCAL_DB_TYPE=mysql # When using `mysql`, see https://hub.docker.com/_/mysql for valid versions. # When using `mariadb`, see https://hub.docker.com/_/mariadb for valid versions. ## -LOCAL_DB_VERSION=8.0 +LOCAL_DB_VERSION=8.4 # Whether or not to enable multisite. LOCAL_MULTISITE=false diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index 03ec815460f55..a12dcdf17d58e 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -26,7 +26,7 @@ on: description: 'Database version' required: false type: 'string' - default: '8.0' + default: '8.4' multisite: description: 'Whether to run tests as multisite' required: false diff --git a/.github/workflows/reusable-test-local-docker-environment-v1.yml b/.github/workflows/reusable-test-local-docker-environment-v1.yml index 4dccd7ef3dccd..6e521de70dfa6 100644 --- a/.github/workflows/reusable-test-local-docker-environment-v1.yml +++ b/.github/workflows/reusable-test-local-docker-environment-v1.yml @@ -27,7 +27,7 @@ on: description: 'Database version' required: false type: 'string' - default: '8.0' + default: '8.4' memcached: description: 'Whether to enable memcached' required: false From 1458de74b6a887a1a9846cf6b85edfe0d9c6f8ee Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Tue, 17 Dec 2024 16:38:07 +0000 Subject: [PATCH 114/323] Build/Test Tools: Regularly run the `html-api-html5lib-tests`. In [58010], the external test suite from `html5lib` was imported to validate the tree-construction steps in the HTML Processor to ensure that they are behaving according to the HTML specification. The test group was excluded by default because there are a high number of skipped tests. The number of skipped tests has come down, but the group does not need to be run on every job. This introduces a new job in the PHPUnit workflow for regularly running these tests on their own using the changes in [59251[. Props desrosj, jonsurrell, jorbin, dmsnell, costdev, chaion07, engahmeds3ed. Fixes #61209. git-svn-id: https://develop.svn.wordpress.org/trunk@59528 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/phpunit-tests.yml | 25 ++++++++++++++++++- .../workflows/reusable-phpunit-tests-v3.yml | 2 +- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/.github/workflows/phpunit-tests.yml b/.github/workflows/phpunit-tests.yml index 62a7aa50f7718..d5aa3fa3de5cd 100644 --- a/.github/workflows/phpunit-tests.yml +++ b/.github/workflows/phpunit-tests.yml @@ -154,13 +154,36 @@ jobs: phpunit-config: ${{ matrix.multisite && 'tests/phpunit/multisite.xml' || 'phpunit.xml.dist' }} report: ${{ matrix.report || false }} + # + # Runs specific individual test groups. + # + specific-test-groups: + name: ${{ matrix.phpunit-test-groups }} + uses: WordPress/wordpress-develop/.github/workflows/reusable-phpunit-tests-v3.yml@trunk + permissions: + contents: read + secrets: inherit + if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} + strategy: + fail-fast: false + matrix: + php: [ '7.2', '7.4', '8.0', '8.4' ] + db-type: [ 'mysql' ] + db-version: [ '8.4' ] + phpunit-test-groups: [ 'html-api-html5lib-tests' ] + with: + php: ${{ matrix.php }} + db-type: ${{ matrix.db-type }} + db-version: ${{ matrix.db-version }} + phpunit-test-groups: ${{ matrix.phpunit-test-groups }} + slack-notifications: name: Slack Notifications uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk permissions: actions: read contents: read - needs: [ test-with-mysql, test-with-mariadb ] + needs: [ test-with-mysql, test-with-mariadb, specific-test-groups ] if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event_name != 'pull_request' && always() }} with: calling_status: ${{ contains( needs.*.result, 'cancelled' ) && 'cancelled' || contains( needs.*.result, 'failure' ) && 'failure' || 'success' }} diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index a12dcdf17d58e..cac3015af383a 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -105,7 +105,7 @@ jobs: # - Checks out the WordPress Test reporter repository. # - Submit the test results to the WordPress.org host test results. phpunit-tests: - name: PHP ${{ inputs.php }} ${{ ! inputs.coverage-report && '/ ' || 'with ' }}${{ 'mariadb' == inputs.db-type && 'MariaDB' || 'MySQL' }} ${{ inputs.db-version }}${{ inputs.multisite && ' multisite' || '' }}${{ inputs.phpunit-test-groups && format( ' ({0})', inputs.phpunit-test-groups ) || '' }}${{ inputs.memcached && ' with memcached' || '' }}${{ inputs.report && ' (test reporting enabled)' || '' }} ${{ 'example.org' != inputs.tests-domain && inputs.tests-domain || '' }} + name: ${{ inputs.phpunit-test-groups && format( '{0} / ', inputs.phpunit-test-groups ) || '' }}PHP ${{ inputs.php }} ${{ ! inputs.phpunit-test-groups && ! inputs.coverage-report && '/ ' || 'with ' }}${{ 'mariadb' == inputs.db-type && 'MariaDB' || 'MySQL' }} ${{ inputs.db-version }}${{ inputs.multisite && ' multisite' || '' }}${{ inputs.memcached && ' with memcached' || '' }}${{ inputs.report && ' (test reporting enabled)' || '' }} ${{ 'example.org' != inputs.tests-domain && inputs.tests-domain || '' }} runs-on: ${{ inputs.os }} timeout-minutes: ${{ inputs.coverage-report && 120 || 20 }} From f08e51f6b1dbcade2c580fcd5ff8eb50d594917c Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Tue, 17 Dec 2024 16:49:52 +0000 Subject: [PATCH 115/323] Build/Test Tools: Allow more control when testing older branches. This adds an input to the Test Old Branches workflow that allows a specific branch to be specified or `all` to run all old branches. The default behavior is to only test the currently supported version of WordPress as defined in the `CURRENTLY_SUPPORTED_BRANCH` environment variable. Follow up to [59520]. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59529 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/test-old-branches.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-old-branches.yml b/.github/workflows/test-old-branches.yml index 649b7190955fc..85a7000bcfc8f 100644 --- a/.github/workflows/test-old-branches.yml +++ b/.github/workflows/test-old-branches.yml @@ -13,6 +13,12 @@ on: - cron: '0 0 1 * *' - cron: '0 0 15 * *' workflow_dispatch: + inputs: + strategy: + description: 'The branches to test. Accepts X.Y branch names, or "all". Defaults to only the currently supported branch.' + required: false + type: string + default: '' # Disable permissions for all available scopes by default. # Any needed permissions should be configured at the job level. @@ -112,7 +118,7 @@ jobs: steps: - name: Dispatch workflow run uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 - if: ${{ github.event_name == 'push' || github.event.schedule == '0 0 15 * *' || matrix.branch == env.CURRENTLY_SUPPORTED_BRANCH }} + if: ${{ github.event_name == 'push' || ( github.event_name == 'workflow_dispatch' && matrix.branch == inputs.strategy || inputs.strategy == 'all' ) || github.event.schedule == '0 0 15 * *' || matrix.branch == env.CURRENTLY_SUPPORTED_BRANCH }} with: retries: 2 retry-exempt-status-codes: 418 From 8ed4caec8d1a7c8de3944703b0b15724d09aec29 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Tue, 17 Dec 2024 16:58:04 +0000 Subject: [PATCH 116/323] Build/Test Tools: Update Default Theme `devDependencies`. The `devDependencies` for all default themes with `package.json` files (Twenty Nineteen, Twenty Twenty, and Twenty Twenty-One) are now updated to their latest versions with a few exceptions in Twenty Twenty-One: - Upgrading `stylelint`/`@wordpress/stylelint-config` requires some work to address rule deprecations. - `@wordpress/eslint-plugin` does not yet support `eslint` 9.x. Additionally, `npm audit fix` has been run for each theme. See #62220. git-svn-id: https://develop.svn.wordpress.org/trunk@59530 602fd350-edb4-49c9-b593-d223f7449a82 --- .../themes/twentynineteen/package-lock.json | 488 +- .../themes/twentynineteen/package.json | 10 +- .../themes/twentytwenty/package-lock.json | 6438 +++++++++-------- .../themes/twentytwenty/package.json | 16 +- .../themes/twentytwentyone/package-lock.json | 1548 +++- .../themes/twentytwentyone/package.json | 24 +- 6 files changed, 4653 insertions(+), 3871 deletions(-) diff --git a/src/wp-content/themes/twentynineteen/package-lock.json b/src/wp-content/themes/twentynineteen/package-lock.json index 8afb314c8c707..c360a78221de8 100644 --- a/src/wp-content/themes/twentynineteen/package-lock.json +++ b/src/wp-content/themes/twentynineteen/package-lock.json @@ -8,15 +8,15 @@ "name": "twentynineteen", "version": "3.0.0", "devDependencies": { - "@wordpress/browserslist-config": "^6.1.0", - "autoprefixer": "^10.4.19", + "@wordpress/browserslist-config": "^6.14.0", + "autoprefixer": "^10.4.20", "chokidar-cli": "^3.0.0", "node-sass": "^9.0.0", "npm-run-all": "^4.1.5", - "postcss": "^8.4.38", + "postcss": "^8.4.49", "postcss-cli": "^11.0.0", - "postcss-focus-within": "^8.0.1", - "rtlcss": "^4.1.1" + "postcss-focus-within": "^9.0.1", + "rtlcss": "^4.3.0" }, "engines": { "node": ">=20.10.0", @@ -187,10 +187,11 @@ "dev": true }, "node_modules/@wordpress/browserslist-config": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.1.0.tgz", - "integrity": "sha512-cf5iwPq6JetQjiaRwlvzW5eX0S3OphVmy1YTxHQdrVqp79rOGvamVftxqvmf3C/GSRaNyI4eZV+nNwNRN0DkrQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.14.0.tgz", + "integrity": "sha512-a26hxY8R/A7FH/Z8oZsYS31ZC/Xy9QSBTi5w84MKSeYdWlck7t1QdCwUNF1u621wbuP7beiiu9FkYY4hI3Bk9A==", "dev": true, + "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", "npm": ">=8.19.2" @@ -313,9 +314,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "funding": [ { @@ -331,12 +332,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -387,9 +389,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "dev": true, "funding": [ { @@ -405,11 +407,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -514,9 +517,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001636", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", - "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "version": "1.0.30001688", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001688.tgz", + "integrity": "sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==", "dev": true, "funding": [ { @@ -531,7 +534,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "2.4.2", @@ -592,66 +596,6 @@ "node": ">= 8.10.0" } }, - "node_modules/chokidar-cli/node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/chokidar-cli/node_modules/chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar-cli/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/chokidar-cli/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -738,10 +682,11 @@ "dev": true }, "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, + "license": "MIT", "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -758,6 +703,7 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -853,10 +799,11 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.810", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.810.tgz", - "integrity": "sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ==", - "dev": true + "version": "1.5.73", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz", + "integrity": "sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==", + "dev": true, + "license": "ISC" }, "node_modules/emoji-regex": { "version": "7.0.3", @@ -930,10 +877,11 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1390,11 +1338,19 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/ip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", - "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==", - "dev": true + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } }, "node_modules/is-arrayish": { "version": "0.2.1", @@ -1546,6 +1502,13 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true, + "license": "MIT" + }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -1781,12 +1744,13 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -1943,9 +1907,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, "funding": [ { @@ -1953,6 +1917,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -2212,10 +2177,11 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" }, "node_modules/node-sass": { "version": "9.0.0", @@ -2296,10 +2262,11 @@ "dev": true }, "node_modules/node-sass/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -2662,10 +2629,11 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -2701,9 +2669,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "funding": [ { @@ -2719,10 +2687,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -2891,9 +2860,9 @@ } }, "node_modules/postcss-focus-within": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-8.0.1.tgz", - "integrity": "sha512-NFU3xcY/xwNaapVb+1uJ4n23XImoC86JNwkY/uduytSl2s9Ekc2EpzmRR63+ExitnW3Mab3Fba/wRPCT5oDILA==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", "dev": true, "funding": [ { @@ -2905,11 +2874,12 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { - "postcss-selector-parser": "^6.0.13" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" @@ -2971,10 +2941,11 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dev": true, + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3255,10 +3226,11 @@ } }, "node_modules/rtlcss": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", - "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", "dev": true, + "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0", @@ -3542,16 +3514,17 @@ } }, "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, + "license": "MIT", "dependencies": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 10.13.0", + "node": ">= 10.0.0", "npm": ">= 3.0.0" } }, @@ -3579,10 +3552,11 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -3619,6 +3593,13 @@ "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", "dev": true }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/ssri": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", @@ -3908,9 +3889,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -3926,9 +3907,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -4202,9 +4184,9 @@ "dev": true }, "@wordpress/browserslist-config": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.1.0.tgz", - "integrity": "sha512-cf5iwPq6JetQjiaRwlvzW5eX0S3OphVmy1YTxHQdrVqp79rOGvamVftxqvmf3C/GSRaNyI4eZV+nNwNRN0DkrQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.14.0.tgz", + "integrity": "sha512-a26hxY8R/A7FH/Z8oZsYS31ZC/Xy9QSBTi5w84MKSeYdWlck7t1QdCwUNF1u621wbuP7beiiu9FkYY4hI3Bk9A==", "dev": true }, "abbrev": { @@ -4297,16 +4279,16 @@ "dev": true }, "autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "requires": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" } }, @@ -4342,15 +4324,15 @@ } }, "browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" } }, "cacache": { @@ -4430,9 +4412,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001636", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", - "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "version": "1.0.30001688", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001688.tgz", + "integrity": "sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==", "dev": true }, "chalk": { @@ -4472,50 +4454,6 @@ "lodash.debounce": "^4.0.8", "lodash.throttle": "^4.1.1", "yargs": "^13.3.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - } } }, "chownr": { @@ -4594,9 +4532,9 @@ "dev": true }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, "requires": { "nice-try": "^1.0.4", @@ -4673,9 +4611,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.810", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.810.tgz", - "integrity": "sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ==", + "version": "1.5.73", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz", + "integrity": "sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==", "dev": true }, "emoji-regex": { @@ -4741,9 +4679,9 @@ } }, "escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, "escape-string-regexp": { @@ -5097,11 +5035,15 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "ip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", - "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==", - "dev": true + "ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "requires": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + } }, "is-arrayish": { "version": "0.2.1", @@ -5220,6 +5162,12 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, + "jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -5404,12 +5352,12 @@ "dev": true }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, @@ -5525,9 +5473,9 @@ "dev": true }, "nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true }, "negotiator": { @@ -5733,9 +5681,9 @@ } }, "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true }, "node-sass": { @@ -5795,9 +5743,9 @@ "dev": true }, "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -6061,9 +6009,9 @@ "dev": true }, "picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "picomatch": { @@ -6085,14 +6033,14 @@ "dev": true }, "postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "requires": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" } }, "postcss-cli": { @@ -6212,12 +6160,12 @@ } }, "postcss-focus-within": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-8.0.1.tgz", - "integrity": "sha512-NFU3xcY/xwNaapVb+1uJ4n23XImoC86JNwkY/uduytSl2s9Ekc2EpzmRR63+ExitnW3Mab3Fba/wRPCT5oDILA==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.13" + "postcss-selector-parser": "^7.0.0" } }, "postcss-load-config": { @@ -6241,9 +6189,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -6451,9 +6399,9 @@ } }, "rtlcss": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", - "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -6648,12 +6596,12 @@ "dev": true }, "socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, "requires": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" } }, @@ -6675,9 +6623,9 @@ "dev": true }, "source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true }, "spdx-correct": { @@ -6712,6 +6660,12 @@ "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", "dev": true }, + "sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, "ssri": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", @@ -6941,13 +6895,13 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "requires": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" } }, "util-deprecate": { diff --git a/src/wp-content/themes/twentynineteen/package.json b/src/wp-content/themes/twentynineteen/package.json index 584dcd66ff328..1069b4c4f9b7b 100644 --- a/src/wp-content/themes/twentynineteen/package.json +++ b/src/wp-content/themes/twentynineteen/package.json @@ -11,15 +11,15 @@ "npm": ">=10.2.3" }, "devDependencies": { - "@wordpress/browserslist-config": "^6.1.0", - "autoprefixer": "^10.4.19", + "@wordpress/browserslist-config": "^6.14.0", + "autoprefixer": "^10.4.20", "chokidar-cli": "^3.0.0", "node-sass": "^9.0.0", "npm-run-all": "^4.1.5", - "postcss": "^8.4.38", + "postcss": "^8.4.49", "postcss-cli": "^11.0.0", - "postcss-focus-within": "^8.0.1", - "rtlcss": "^4.1.1" + "postcss-focus-within": "^9.0.1", + "rtlcss": "^4.3.0" }, "rtlcssConfig": { "options": { diff --git a/src/wp-content/themes/twentytwenty/package-lock.json b/src/wp-content/themes/twentytwenty/package-lock.json index 5fbbe97a2a9a9..c2670d461215d 100644 --- a/src/wp-content/themes/twentytwenty/package-lock.json +++ b/src/wp-content/themes/twentytwenty/package-lock.json @@ -9,13 +9,13 @@ "version": "2.8.0", "license": "GPL-2.0-or-later", "devDependencies": { - "@wordpress/browserslist-config": "^6.1.0", - "@wordpress/scripts": "^28.1.0", - "autoprefixer": "^10.4.19", - "concurrently": "^8.2.2", - "postcss": "^8.4.38", + "@wordpress/browserslist-config": "^6.14.0", + "@wordpress/scripts": "^30.7.0", + "autoprefixer": "^10.4.20", + "concurrently": "^9.1.0", + "postcss": "^8.4.49", "postcss-cli": "^11.0.0", - "rtlcss": "^4.1.1", + "rtlcss": "^4.3.0", "stylelint-a11y": "^1.2.3" }, "engines": { @@ -37,12 +37,14 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -50,30 +52,32 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", + "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", - "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", + "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.6", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", - "@babel/types": "^7.23.6", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -107,15 +111,17 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7", + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" @@ -146,14 +152,15 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -267,29 +274,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -390,28 +397,31 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -431,86 +441,28 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", - "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", - "@babel/types": "^7.23.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/parser": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@babel/types": "^7.26.3" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -1953,33 +1905,32 @@ } }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", + "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.3", + "@babel/parser": "^7.26.3", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.3", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1988,14 +1939,14 @@ } }, "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2007,21 +1958,94 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "node_modules/@csstools/selector-specificity": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz", - "integrity": "sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==", + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", + "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4", - "postcss-selector-parser": "^6.0.10" + "postcss-selector-parser": "^7.0.0" } }, "node_modules/@discoveryjs/json-ext": { @@ -2033,6 +2057,17 @@ "node": ">=10.0.0" } }, + "node_modules/@dual-bundle/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/@es-joy/jsdoccomment": { "version": "0.41.0", "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.41.0.tgz", @@ -2139,17 +2174,75 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/@formatjs/ecma402-abstract": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.1.tgz", + "integrity": "sha512-Ip9uV+/MpLXWRk03U/GzeJMuPeOXpJBSB5V1tjA6kJhvqssye5J5LoYLc7Z5IAHb7nR62sRoguzrFiVCP/hnzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@formatjs/fast-memoize": "2.2.5", + "@formatjs/intl-localematcher": "0.5.9", + "decimal.js": "10", + "tslib": "2" + } + }, + "node_modules/@formatjs/fast-memoize": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.5.tgz", + "integrity": "sha512-6PoewUMrrcqxSoBXAOJDiW1m+AmkrAj0RiXnOMD59GRaswjXhm3MDhgepXPBgonc09oSirAJTsAggzAGQf6A6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "2" + } + }, + "node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.9.7", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.7.tgz", + "integrity": "sha512-cuEHyRM5VqLQobANOjtjlgU7+qmk9Q3fDQuBiRRJ3+Wp3ZoZhpUPtUfuimZXsir6SaI2TaAJ+SLo9vLnV5QcbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.1", + "@formatjs/icu-skeleton-parser": "1.8.11", + "tslib": "2" + } + }, + "node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.11.tgz", + "integrity": "sha512-8LlHHE/yL/zVJZHAX3pbKaCjZKmBIO6aJY1mkVh4RMSEu/2WRZ4Ysvv3kKXJ9M8RJLBHdnk1/dUQFdod1Dt7Dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.1", + "tslib": "2" + } + }, + "node_modules/@formatjs/intl-localematcher": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.9.tgz", + "integrity": "sha512-8zkGu/sv5euxbjfZ/xmklqLyDGQSxsLqg8XOq88JW3cmJtzhCP8EtSJXlaKZnVO4beEaoiT9wj4eIoCQ9smwxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "2" + } + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@hapi/topo": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" } @@ -2672,13 +2765,14 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { @@ -2747,6 +2841,16 @@ "node": ">= 8" } }, + "node_modules/@paulirish/trace_engine": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@paulirish/trace_engine/-/trace_engine-0.0.39.tgz", + "integrity": "sha512-2Y/ejHX5DDi5bjfWY/0c/BLVSfQ61Jw1Hy60Hnh0hfEO632D3FVctkzT4Q/lVAdvIPR0bUaok9JDTr1pu/OziA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "third-party-web": "latest" + } + }, "node_modules/@pkgr/core": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", @@ -2815,224 +2919,119 @@ "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==", "dev": true }, - "node_modules/@puppeteer/browsers": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz", - "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==", + "node_modules/@sentry-internal/tracing": { + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.120.2.tgz", + "integrity": "sha512-eo2F8cP6X+vr54Mp6vu+NoQEDz0M5O24Tz8jPY0T1CpiWdwCmHb7Sln+oLXeQ3/LlWdVQihBfKDBZfBdUfsBTg==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" + "@sentry/core": "7.120.2", + "@sentry/types": "7.120.2", + "@sentry/utils": "7.120.2" }, "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=8" } }, - "node_modules/@puppeteer/browsers/node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", + "node_modules/@sentry/core": { + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.120.2.tgz", + "integrity": "sha512-eurLBFQJC7WWWYoEna25Z9I/GJjqAmH339tv52XP8sqXV7B5hRcHDcfrsT/UGHpU316M24p3lWhj0eimtCZ0SQ==", "dev": true, + "license": "MIT", "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" + "@sentry/types": "7.120.2", + "@sentry/utils": "7.120.2" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@puppeteer/browsers/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "node_modules/@sentry/integrations": { + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.120.2.tgz", + "integrity": "sha512-bMvL2fD3TGLM5YAUoQ2Qz6bYeVU8f7YRFNSjKNxK4EbvFgAU9j1FD6EKg0V0RNOJYnJjGIZYMmcWTXBbVTJL6w==", "dev": true, + "license": "MIT", "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" + "@sentry/core": "7.120.2", + "@sentry/types": "7.120.2", + "@sentry/utils": "7.120.2", + "localforage": "^1.8.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@puppeteer/browsers/node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "node_modules/@sentry/node": { + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.120.2.tgz", + "integrity": "sha512-ZnW9gpIGaoU+vYZyVZca9dObfmWYiXEWIMUM/JXaFb8AhP1OXvYweNiU0Pe/gNrz4oGAogU8scJc70ar7Vj0ww==", "dev": true, + "license": "MIT", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "@sentry-internal/tracing": "7.120.2", + "@sentry/core": "7.120.2", + "@sentry/integrations": "7.120.2", + "@sentry/types": "7.120.2", + "@sentry/utils": "7.120.2" }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/@puppeteer/browsers/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "node_modules/@sentry/types": { + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.2.tgz", + "integrity": "sha512-FWVoiblHQJ892GaOqdXx/5/n5XDLF28z81vJ0lCY49PMh8waz8LJ0b9RSmt9tasSDl0OQ7eUlPl1xu1jTrv1NA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/@sentry/core": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.19.7.tgz", - "integrity": "sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw==", + "node_modules/@sentry/utils": { + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.120.2.tgz", + "integrity": "sha512-jgnQlw11mRfQrQRAXbq4zEd+tbYwHel5eqeS/oU6EImXRjmHNtS79nB8MHvJeQu1FMCpFs1Ymrrs5FICwS6VeQ==", "dev": true, + "license": "MIT", "dependencies": { - "@sentry/hub": "6.19.7", - "@sentry/minimal": "6.19.7", - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "tslib": "^1.9.3" + "@sentry/types": "7.120.2" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/@sentry/core/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@sentry/hub": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", - "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==", + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" + "@hapi/hoek": "^9.0.0" } }, - "node_modules/@sentry/hub/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "dev": true, + "license": "BSD-3-Clause" }, - "node_modules/@sentry/minimal": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz", - "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==", + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", "dev": true, - "dependencies": { - "@sentry/hub": "6.19.7", - "@sentry/types": "6.19.7", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } + "license": "BSD-3-Clause" }, - "node_modules/@sentry/minimal/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@sentry/node": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-6.19.7.tgz", - "integrity": "sha512-gtmRC4dAXKODMpHXKfrkfvyBL3cI8y64vEi3fDD046uqYcrWdgoQsffuBbxMAizc6Ez1ia+f0Flue6p15Qaltg==", - "dev": true, - "dependencies": { - "@sentry/core": "6.19.7", - "@sentry/hub": "6.19.7", - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/node/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@sentry/types": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", - "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/utils": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", - "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", - "dev": true, - "dependencies": { - "@sentry/types": "6.19.7", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "dev": true - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "dev": true - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "node_modules/@sindresorhus/merge-streams": { @@ -3410,37 +3409,6 @@ "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@tannin/compile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@tannin/compile/-/compile-1.1.0.tgz", - "integrity": "sha512-n8m9eNDfoNZoxdvWiTfW/hSPhehzLJ3zW7f8E7oT6mCROoMNWCB4TYtv041+2FMAxweiE0j7i1jubQU4MEC/Gg==", - "dev": true, - "dependencies": { - "@tannin/evaluate": "^1.2.0", - "@tannin/postfix": "^1.1.0" - } - }, - "node_modules/@tannin/evaluate": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@tannin/evaluate/-/evaluate-1.2.0.tgz", - "integrity": "sha512-3ioXvNowbO/wSrxsDG5DKIMxC81P0QrQTYai8zFNY+umuoHWRPbQ/TuuDEOju9E+jQDXmj6yI5GyejNuh8I+eg==", - "dev": true - }, - "node_modules/@tannin/plural-forms": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@tannin/plural-forms/-/plural-forms-1.1.0.tgz", - "integrity": "sha512-xl9R2mDZO/qiHam1AgMnAES6IKIg7OBhcXqy6eDsRCdXuxAFPcjrej9HMjyCLE0DJ/8cHf0i5OQTstuBRhpbHw==", - "dev": true, - "dependencies": { - "@tannin/compile": "^1.1.0" - } - }, - "node_modules/@tannin/postfix": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@tannin/postfix/-/postfix-1.1.0.tgz", - "integrity": "sha512-oocsqY7g0cR+Gur5jRQLSrX2OtpMLMse1I10JQBm8CdGMrDkh1Mg2gjsiquMHRtBs4Qwu5wgEp5GgIYHk4SNPw==", - "dev": true - }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -3545,30 +3513,33 @@ } }, "node_modules/@types/eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "dev": true + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/express": { "version": "4.17.21", @@ -4165,148 +4136,163 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -4354,21 +4340,6 @@ } } }, - "node_modules/@wordpress/api-fetch": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-7.1.0.tgz", - "integrity": "sha512-mtEJi9IBPCRtNxyhP1VAwcLmncpQzt7CQX8rxhC4eAMnicamCG/fwZ3pFEKGXk3MUul3Bl1Q7y/UhdMtCGktGg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/i18n": "^5.1.0", - "@wordpress/url": "^4.1.0" - }, - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - } - }, "node_modules/@wordpress/babel-preset-default": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-8.1.0.tgz", @@ -4403,10 +4374,11 @@ } }, "node_modules/@wordpress/browserslist-config": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.1.0.tgz", - "integrity": "sha512-cf5iwPq6JetQjiaRwlvzW5eX0S3OphVmy1YTxHQdrVqp79rOGvamVftxqvmf3C/GSRaNyI4eZV+nNwNRN0DkrQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.14.0.tgz", + "integrity": "sha512-a26hxY8R/A7FH/Z8oZsYS31ZC/Xy9QSBTi5w84MKSeYdWlck7t1QdCwUNF1u621wbuP7beiiu9FkYY4hI3Bk9A==", "dev": true, + "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", "npm": ">=8.19.2" @@ -4429,20 +4401,18 @@ } }, "node_modules/@wordpress/e2e-test-utils-playwright": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.1.0.tgz", - "integrity": "sha512-lGA7/6S1Rsa9Zf7qnAs1nOWn8lPpg8vBOwUWHPBqV1a79r7nsD2KQqsrqsKy8wIJ763fIt5LljjD9VSca0UtIQ==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.14.0.tgz", + "integrity": "sha512-G9r3ZysgzAmUbR4bjGAEEP6P2RCIAG8uMU7yyzxOAHegINSbF3shEZKvVNBeKxNwHKAVa9koh/niGN3U4Kr6Rw==", "dev": true, + "license": "GPL-2.0-or-later", "dependencies": { - "@wordpress/api-fetch": "^7.1.0", - "@wordpress/keycodes": "^4.1.0", - "@wordpress/url": "^4.1.0", "change-case": "^4.1.2", "form-data": "^4.0.0", "get-port": "^5.1.1", - "lighthouse": "^10.4.0", + "lighthouse": "^12.2.2", "mime": "^3.0.0", - "web-vitals": "^3.5.0" + "web-vitals": "^4.2.1" }, "engines": { "node": ">=18.12.0", @@ -4510,40 +4480,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@wordpress/hooks": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-4.1.0.tgz", - "integrity": "sha512-uJ2zyLLs6AwWuEdLGv/P7oSXJuX27Ym6JglzWGBavxAKNXpTCCjiJwgxlZJbSjT3BzhRsRGl3bUMmzt3eh50Pg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.16.0" - }, - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - } - }, - "node_modules/@wordpress/i18n": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-5.1.0.tgz", - "integrity": "sha512-zNJiudByLnpIVhIS45hr92r53t+wRYp9a6XOJ585xNYeUmoUpymY5GTdLSrExmQaytMhV5cSXSn3qMMDBMjUsg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/hooks": "^4.1.0", - "gettext-parser": "^1.3.1", - "memize": "^2.1.0", - "sprintf-js": "^1.1.1", - "tannin": "^1.2.0" - }, - "bin": { - "pot-to-php": "tools/pot-to-php.js" - }, - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - } - }, "node_modules/@wordpress/jest-console": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-8.1.0.tgz", @@ -4579,20 +4515,6 @@ "jest": ">=29" } }, - "node_modules/@wordpress/keycodes": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-4.1.0.tgz", - "integrity": "sha512-ibAR7qg4q7082s9kOPnZ0Hqb6KM/zjAZBjEH2Yrc2jwLJ83QDGKDWCSx6dNYkN7m9jGpH52w8j4nz1wcbFZSiw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/i18n": "^5.1.0" - }, - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - } - }, "node_modules/@wordpress/npm-package-json-lint-config": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-5.1.0.tgz", @@ -4637,33 +4559,34 @@ } }, "node_modules/@wordpress/scripts": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-28.1.0.tgz", - "integrity": "sha512-BWmYA0fqOhfMcl20ppcJA/nw/zixt0FP6KPV+IiI560qpSHx6ZZieU354oX/5Vdaoe4O3ahPlGdUr9fWcprApQ==", + "version": "30.7.0", + "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-30.7.0.tgz", + "integrity": "sha512-vwrf6Xo1GXV2ug4xdYMgZ2CVpNNfArOEJyX6w9CafIRmLOm8GkVGSza0VlEoOh1BTqQPv/awq6uiOKVMbVNB5Q==", "dev": true, + "license": "GPL-2.0-or-later", "dependencies": { - "@babel/core": "^7.16.0", + "@babel/core": "7.25.7", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", "@svgr/webpack": "^8.0.1", - "@wordpress/babel-preset-default": "^8.1.0", - "@wordpress/browserslist-config": "^6.1.0", - "@wordpress/dependency-extraction-webpack-plugin": "^6.1.0", - "@wordpress/e2e-test-utils-playwright": "^1.1.0", - "@wordpress/eslint-plugin": "^19.1.0", - "@wordpress/jest-preset-default": "^12.1.0", - "@wordpress/npm-package-json-lint-config": "^5.1.0", - "@wordpress/postcss-plugins-preset": "^5.1.0", - "@wordpress/prettier-config": "^4.1.0", - "@wordpress/stylelint-config": "^22.1.0", + "@wordpress/babel-preset-default": "*", + "@wordpress/browserslist-config": "*", + "@wordpress/dependency-extraction-webpack-plugin": "*", + "@wordpress/e2e-test-utils-playwright": "*", + "@wordpress/eslint-plugin": "*", + "@wordpress/jest-preset-default": "*", + "@wordpress/npm-package-json-lint-config": "*", + "@wordpress/postcss-plugins-preset": "*", + "@wordpress/prettier-config": "*", + "@wordpress/stylelint-config": "*", "adm-zip": "^0.5.9", - "babel-jest": "^29.6.2", - "babel-loader": "^8.2.3", + "babel-jest": "29.7.0", + "babel-loader": "9.2.1", "browserslist": "^4.21.10", "chalk": "^4.0.0", "check-node-version": "^4.1.0", "clean-webpack-plugin": "^3.0.0", "copy-webpack-plugin": "^10.2.0", - "cross-spawn": "^5.1.0", + "cross-spawn": "^7.0.6", "css-loader": "^6.2.0", "cssnano": "^6.0.1", "cwd": "^0.10.0", @@ -4673,30 +4596,32 @@ "fast-glob": "^3.2.7", "filenamify": "^4.2.0", "jest": "^29.6.2", - "jest-dev-server": "^9.0.1", + "jest-dev-server": "^10.1.4", "jest-environment-jsdom": "^29.6.2", "jest-environment-node": "^29.6.2", + "json2php": "^0.0.9", "markdownlint-cli": "^0.31.1", "merge-deep": "^3.0.3", - "mini-css-extract-plugin": "^2.5.1", + "mini-css-extract-plugin": "^2.9.2", "minimist": "^1.2.0", "npm-package-json-lint": "^6.4.0", "npm-packlist": "^3.0.0", "postcss": "^8.4.5", "postcss-loader": "^6.2.1", "prettier": "npm:wp-prettier@3.0.3", - "puppeteer-core": "^13.2.0", + "puppeteer-core": "^23.10.1", "react-refresh": "^0.14.0", "read-pkg-up": "^7.0.1", "resolve-bin": "^0.4.0", "rtlcss-webpack-plugin": "^4.0.7", - "sass": "^1.35.2", - "sass-loader": "^12.1.0", + "sass": "^1.50.1", + "sass-loader": "^16.0.3", + "schema-utils": "^4.2.0", "source-map-loader": "^3.0.0", - "stylelint": "^14.2.0", - "terser-webpack-plugin": "^5.3.9", + "stylelint": "^16.8.2", + "terser-webpack-plugin": "^5.3.10", "url-loader": "^4.1.1", - "webpack": "^5.88.2", + "webpack": "^5.97.0", "webpack-bundle-analyzer": "^4.9.1", "webpack-cli": "^5.1.4", "webpack-dev-server": "^4.15.1" @@ -4709,11 +4634,75 @@ "npm": ">=8.19.2" }, "peerDependencies": { - "@playwright/test": "^1.43.0", + "@playwright/test": "^1.48.1", "react": "^18.0.0", "react-dom": "^18.0.0" } }, + "node_modules/@wordpress/scripts/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@wordpress/scripts/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/@wordpress/scripts/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/@wordpress/scripts/node_modules/json2php": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/json2php/-/json2php-0.0.9.tgz", + "integrity": "sha512-fQMYwvPsQt8hxRnCGyg1r2JVi6yL8Um0DIIawiKiMK9yhAAkcRNj5UsBWoaFvFzPpcWbgw9L6wzj+UMYA702Mw==", + "dev": true, + "license": "BSD" + }, + "node_modules/@wordpress/scripts/node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/@wordpress/stylelint-config": { "version": "22.1.0", "resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-22.1.0.tgz", @@ -4731,20 +4720,6 @@ "stylelint": "^14.2" } }, - "node_modules/@wordpress/url": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-4.1.0.tgz", - "integrity": "sha512-6Yi9EbTgUGJgsm6XtfO4By8q2+9pTzWkxzx27ShKGF+PqIgIZjiDssf2NfD/oNUevIy48LbQMbyEyK+9r2Bw9A==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.16.0", - "remove-accents": "^0.5.0" - }, - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - } - }, "node_modules/@wordpress/warning": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.1.0.tgz", @@ -4759,13 +4734,15 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/abab": { "version": "2.0.6", @@ -4787,10 +4764,11 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -4808,15 +4786,6 @@ "acorn-walk": "^8.0.2" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -4934,6 +4903,7 @@ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -5271,6 +5241,7 @@ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5282,9 +5253,9 @@ "dev": true }, "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "funding": [ { @@ -5300,12 +5271,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -5334,21 +5306,23 @@ } }, "node_modules/axe-core": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz", - "integrity": "sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", + "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", "dev": true, + "license": "MPL-2.0", "engines": { "node": ">=4" } }, "node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", "dev": true, + "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -5390,36 +5364,74 @@ } }, "node_modules/babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dev": true, + "license": "MIT", "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 8.9" + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-loader/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/babel-loader/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" }, "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" + "ajv": "^8.8.2" } }, + "node_modules/babel-loader/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, "node_modules/babel-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 8.9.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -5588,20 +5600,63 @@ "dev": true, "optional": true }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "node_modules/bare-fs": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", + "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" + } + }, + "node_modules/bare-os": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", + "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "node_modules/bare-stream": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.1.tgz", + "integrity": "sha512-eVZbtKM+4uehzrsj49KtCy3Pbg7kO1pJ3SKZ1SFrIH/0pnj9scuGGgUlNDf/7qS8WKtGdiJY5Kyhs/ivYPTB/g==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, { "type": "consulting", "url": "https://feross.org/support" @@ -5641,22 +5696,12 @@ "node": ">=8" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -5666,7 +5711,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -5681,6 +5726,7 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -5690,6 +5736,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -5699,6 +5746,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -5710,7 +5758,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/bonjour-service": { "version": "1.1.1", @@ -5753,9 +5802,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "dev": true, "funding": [ { @@ -5771,11 +5820,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -5984,9 +6034,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001636", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", - "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "version": "1.0.30001688", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001688.tgz", + "integrity": "sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==", "dev": true, "funding": [ { @@ -6001,7 +6051,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/capital-case": { "version": "1.0.4", @@ -6045,24 +6096,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/chalk/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/chalk/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/change-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", @@ -6140,24 +6173,6 @@ "node": ">=8" } }, - "node_modules/check-node-version/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/check-node-version/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -6185,22 +6200,17 @@ "fsevents": "~2.3.2" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, "node_modules/chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-1.1.2.tgz", + "integrity": "sha512-YclTJey34KUm5jB1aEJCq807bSievi7Nb/TU4Gu504fUYi3jw3KCIaH6L7nFWQhdEgH3V+wCh+kKD1P5cXnfxw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" + "lighthouse-logger": "^2.0.1" }, "bin": { "print-chrome-path": "bin/print-chrome-path.js" @@ -6214,6 +6224,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -6222,26 +6233,15 @@ } }, "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0" } }, - "node_modules/chromium-bidi": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", - "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", - "dev": true, - "dependencies": { - "mitt": "3.0.0" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -6338,19 +6338,24 @@ "dev": true }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" }, "node_modules/colord": { "version": "2.9.3", @@ -6381,6 +6386,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } @@ -6400,12 +6406,6 @@ "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "dev": true }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -6464,17 +6464,16 @@ "dev": true }, "node_modules/concurrently": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", - "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.1.0.tgz", + "integrity": "sha512-VxkzwMAn4LP7WyMnJNbHN5mKV9L2IbyDjpzemKr99sXNR3GqRNMMHdm7prV1ws9wg7ETj6WUkNOigZVsptwbgg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.2", - "date-fns": "^2.30.0", "lodash": "^4.17.21", "rxjs": "^7.8.1", "shell-quote": "^1.8.1", - "spawn-command": "0.0.2", "supports-color": "^8.1.1", "tree-kill": "^1.2.2", "yargs": "^17.7.2" @@ -6484,7 +6483,7 @@ "concurrently": "dist/bin/concurrently.js" }, "engines": { - "node": "^14.13.0 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" @@ -6510,6 +6509,7 @@ "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "dot-prop": "^5.2.0", "graceful-fs": "^4.1.2", @@ -6527,6 +6527,7 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -6571,6 +6572,7 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6582,10 +6584,11 @@ "dev": true }, "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6807,47 +6810,27 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dev": true, - "dependencies": { - "node-fetch": "2.6.7" - } - }, "node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/cross-spawn/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/cross-spawn/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - }, "node_modules/crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6856,7 +6839,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/csp_evaluator/-/csp_evaluator-1.1.1.tgz", "integrity": "sha512-N3ASg0C4kNPUaNxt1XAvzHIVuzdtr8KLgfk1O8WDyimp1GisPAHESupArO2ieHk9QWbrJ/WkQODyh21Ps/xhxw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/css-declaration-sorter": { "version": "7.1.1", @@ -6871,12 +6855,13 @@ } }, "node_modules/css-functions-list": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz", - "integrity": "sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12.22" + "node": ">=12 || >=16" } }, "node_modules/css-loader": { @@ -7128,6 +7113,7 @@ "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", "integrity": "sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==", "dev": true, + "license": "MIT", "dependencies": { "find-pkg": "^0.1.2", "fs-exists-sync": "^0.1.0" @@ -7216,22 +7202,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, "node_modules/debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", @@ -7503,6 +7473,7 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -7521,6 +7492,7 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -7542,10 +7514,11 @@ "dev": true }, "node_modules/devtools-protocol": { - "version": "0.0.981744", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.981744.tgz", - "integrity": "sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==", - "dev": true + "version": "0.0.1367902", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz", + "integrity": "sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/diff-sequences": { "version": "29.6.3", @@ -7681,6 +7654,7 @@ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, + "license": "MIT", "dependencies": { "is-obj": "^2.0.0" }, @@ -7698,13 +7672,15 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.810", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.810.tgz", - "integrity": "sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ==", - "dev": true + "version": "1.5.73", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz", + "integrity": "sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==", + "dev": true, + "license": "ISC" }, "node_modules/emittery": { "version": "0.13.1", @@ -7734,23 +7710,15 @@ } }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -7761,10 +7729,11 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -7778,6 +7747,7 @@ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" @@ -7798,6 +7768,16 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/envinfo": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", @@ -7955,10 +7935,11 @@ } }, "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", - "dev": true + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true, + "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.0.0", @@ -8013,10 +7994,11 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -8644,20 +8626,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/eslint/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/eslint/node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -8761,42 +8729,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/eslint/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/espree": { "version": "9.4.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", @@ -8901,6 +8833,7 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -8916,6 +8849,7 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -8943,56 +8877,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/execa/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/execa/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -9007,6 +8891,7 @@ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==", "dev": true, + "license": "MIT", "dependencies": { "os-homedir": "^1.0.1" }, @@ -9037,37 +8922,38 @@ "dev": true }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -9076,6 +8962,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/array-flatten": { @@ -9084,15 +8974,6 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, - "node_modules/express/node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -9189,6 +9070,13 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -9288,13 +9176,14 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -9310,6 +9199,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -9318,23 +9208,128 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, + "license": "MIT", "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" }, "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/find-file-up": { @@ -9342,6 +9337,7 @@ "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==", "dev": true, + "license": "MIT", "dependencies": { "fs-exists-sync": "^0.1.0", "resolve-dir": "^0.1.0" @@ -9361,6 +9357,7 @@ "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz", "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==", "dev": true, + "license": "MIT", "dependencies": { "find-file-up": "^0.1.2" }, @@ -9373,6 +9370,7 @@ "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz", "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "commander": "^5.1.0", @@ -9436,10 +9434,11 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.6", @@ -9532,21 +9531,17 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, "node_modules/fs-exists-sync": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9750,16 +9745,6 @@ "node": ">= 14" } }, - "node_modules/gettext-parser": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.4.0.tgz", - "integrity": "sha512-sedZYLHlHeBop/gZ1jdg59hlUEcpcZJofLq2JFwJT1zTqAU3l2wFv6IsuwFHGqbiT9DWzMUW4/em2+hspnmMMA==", - "dev": true, - "dependencies": { - "encoding": "^0.1.12", - "safe-buffer": "^5.1.1" - } - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -9796,13 +9781,15 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/global-modules": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", "integrity": "sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==", "dev": true, + "license": "MIT", "dependencies": { "global-prefix": "^0.1.4", "is-windows": "^0.2.0" @@ -9816,6 +9803,7 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", "integrity": "sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==", "dev": true, + "license": "MIT", "dependencies": { "homedir-polyfill": "^1.0.0", "ini": "^1.3.4", @@ -9826,6 +9814,19 @@ "node": ">=0.10.0" } }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -9875,7 +9876,8 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/gopd": { "version": "1.0.1", @@ -9890,10 +9892,11 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" }, "node_modules/grapheme-splitter": { "version": "1.0.4", @@ -10033,6 +10036,7 @@ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, + "license": "MIT", "dependencies": { "parse-passwd": "^1.0.0" }, @@ -10129,10 +10133,11 @@ "dev": true }, "node_modules/html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -10151,6 +10156,7 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -10167,6 +10173,7 @@ "resolved": "https://registry.npmjs.org/http-link-header/-/http-link-header-1.1.3.tgz", "integrity": "sha512-3cZ0SRL8fb9MUlU3mKM61FcQvPfXx2dBrZW3Vbg5CXa8jFlK8OaEpePenLe1oEXQduhz8b0QjsqfS59QP4AJDQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -10206,10 +10213,11 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -10320,7 +10328,15 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/image-ssim/-/image-ssim-0.2.0.tgz", "integrity": "sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true, + "license": "MIT" }, "node_modules/immutable": { "version": "4.2.4", @@ -10344,15 +10360,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -10410,7 +10417,8 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/internal-slot": { "version": "1.0.7", @@ -10436,21 +10444,18 @@ } }, "node_modules/intl-messageformat": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-4.4.0.tgz", - "integrity": "sha512-z+Bj2rS3LZSYU4+sNitdHrwnBhr0wO80ZJSW8EzKDBowwUe3Q/UsvgCGjrwa+HPzoGCLEb9HAjfJgo4j2Sac8w==", + "version": "10.7.10", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.10.tgz", + "integrity": "sha512-hp7iejCBiJdW3zmOe18FdlJu8U/JsADSDiBPQhfdSeI8B9POtvPRvPh3nMlvhYayGMKLv6maldhR7y3Pf1vkpw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "intl-messageformat-parser": "^1.8.1" + "@formatjs/ecma402-abstract": "2.3.1", + "@formatjs/fast-memoize": "2.2.5", + "@formatjs/icu-messageformat-parser": "2.9.7", + "tslib": "2" } }, - "node_modules/intl-messageformat-parser": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.8.1.tgz", - "integrity": "sha512-IMSCKVf0USrM/959vj3xac7s8f87sc+80Y/ipBzdKy4ifBv5Gsj2tZ41EAaURVg01QU71fYr77uA8Meh6kELbg==", - "deprecated": "We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser", - "dev": true - }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -10793,6 +10798,7 @@ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -10961,7 +10967,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-unicode-supported": { "version": "0.1.0", @@ -11020,6 +11027,7 @@ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11046,7 +11054,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", @@ -11343,18 +11352,19 @@ } }, "node_modules/jest-dev-server": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-9.0.2.tgz", - "integrity": "sha512-Zc/JB0IlNNrpXkhBw+h86cGrde/Mey52KvF+FER2eyrtYJTHObOwW7Iarxm3rPyTKby5+3Y2QZtl8pRz/5GCxg==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-10.1.4.tgz", + "integrity": "sha512-bGQ6sedNGtT6AFHhCVqGTXMPz7UyJi/ZrhNBgyqsP0XU9N8acCEIfqZEA22rOaZ+NdEVsaltk6tL7UT6aXfI7w==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.2", "cwd": "^0.10.0", "find-process": "^1.4.7", "prompts": "^2.4.2", - "spawnd": "^9.0.2", + "spawnd": "^10.1.4", "tree-kill": "^1.2.2", - "wait-on": "^7.2.0" + "wait-on": "^8.0.1" }, "engines": { "node": ">=16" @@ -11868,6 +11878,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -11882,6 +11893,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -11893,14 +11905,15 @@ } }, "node_modules/joi": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", - "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } @@ -11909,13 +11922,15 @@ "version": "0.4.4", "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/js-library-detector": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/js-library-detector/-/js-library-detector-6.7.0.tgz", "integrity": "sha512-c80Qupofp43y4cJ7+8TTDN/AsDwLi5oOm/plBrWI+iQt485vKXCco+yVmOwEgdo9VOdsYTuV0UlTeetVPTriXA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" } @@ -12010,17 +12025,25 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -12099,6 +12122,16 @@ "node": ">=4.0" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -12130,10 +12163,11 @@ } }, "node_modules/known-css-properties": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", - "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", - "dev": true + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", + "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", + "dev": true, + "license": "MIT" }, "node_modules/language-subtag-registry": { "version": "0.3.23", @@ -12194,36 +12228,48 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lighthouse": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-10.4.0.tgz", - "integrity": "sha512-XQWHEWkJ8YxSPsxttBJORy5+hQrzbvGkYfeP3fJjyYKioWkF2MXfFqNK4ZuV4jL8pBu7Z91qnQP6In0bq1yXww==", + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-12.3.0.tgz", + "integrity": "sha512-OaLE8DasnwQkn2CBo2lKtD+IQv42mNP3T+Vaw29I++rAh0Zpgc6SM15usdIYyzhRMR5EWFxze5Fyb+HENJSh2A==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@sentry/node": "^6.17.4", - "axe-core": "4.7.2", - "chrome-launcher": "^0.15.2", + "@paulirish/trace_engine": "0.0.39", + "@sentry/node": "^7.0.0", + "axe-core": "^4.10.2", + "chrome-launcher": "^1.1.2", "configstore": "^5.0.1", "csp_evaluator": "1.1.1", - "devtools-protocol": "0.0.1155343", + "devtools-protocol": "0.0.1312386", "enquirer": "^2.3.6", "http-link-header": "^1.1.1", - "intl-messageformat": "^4.4.0", + "intl-messageformat": "^10.5.3", "jpeg-js": "^0.4.4", - "js-library-detector": "^6.6.0", - "lighthouse-logger": "^1.4.1", - "lighthouse-stack-packs": "1.11.0", - "lodash": "^4.17.21", + "js-library-detector": "^6.7.0", + "lighthouse-logger": "^2.0.1", + "lighthouse-stack-packs": "1.12.2", + "lodash-es": "^4.17.21", "lookup-closest-locale": "6.2.0", "metaviewport-parser": "0.3.0", "open": "^8.4.0", "parse-cache-control": "1.0.1", - "ps-list": "^8.0.0", - "puppeteer-core": "^20.8.0", - "robots-parser": "^3.0.0", + "puppeteer-core": "^23.10.4", + "robots-parser": "^3.0.1", "semver": "^5.3.0", "speedline-core": "^1.4.3", - "third-party-web": "^0.23.3", + "third-party-web": "^0.26.1", + "tldts-icann": "^6.1.16", "ws": "^7.0.0", "yargs": "^17.3.1", "yargs-parser": "^21.0.0" @@ -12234,14 +12280,15 @@ "smokehouse": "cli/test/smokehouse/frontends/smokehouse-bin.js" }, "engines": { - "node": ">=16.16" + "node": ">=18.16" } }, "node_modules/lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-2.0.1.tgz", + "integrity": "sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -12252,6 +12299,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -12260,146 +12308,39 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/lighthouse-stack-packs": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.11.0.tgz", - "integrity": "sha512-sRr0z1S/I26VffRLq9KJsKtLk856YrJlNGmcJmbLX8dFn3MuzVPUbstuChEhqnSxZb8TZmVfthuXuwhG9vRoSw==", - "dev": true - }, - "node_modules/lighthouse/node_modules/axe-core": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", - "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", "dev": true, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "node_modules/lighthouse/node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "node_modules/lighthouse-stack-packs": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.12.2.tgz", + "integrity": "sha512-Ug8feS/A+92TMTCK6yHYLwaFMuelK/hAKRMdldYkMNwv+d9PtWxjXEg6rwKtsUXTADajhdrhXyuNCJ5/sfmPFw==", "dev": true, - "dependencies": { - "node-fetch": "^2.6.12" - } + "license": "Apache-2.0" }, "node_modules/lighthouse/node_modules/devtools-protocol": { - "version": "0.0.1155343", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1155343.tgz", - "integrity": "sha512-oD9vGBV2wTc7fAzAM6KC0chSgs234V8+qDEeK+mcbRj2UvcuA7lgBztGi/opj/iahcXD3BSj8Ymvib628yy9FA==", - "dev": true - }, - "node_modules/lighthouse/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/lighthouse/node_modules/puppeteer-core": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", - "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", - "dev": true, - "dependencies": { - "@puppeteer/browsers": "1.4.6", - "chromium-bidi": "0.4.16", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1147663", - "ws": "8.13.0" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.1147663", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", - "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==", - "dev": true - }, - "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "0.0.1312386", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", + "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==", "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } + "license": "BSD-3-Clause" }, "node_modules/lighthouse/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver" } }, - "node_modules/lighthouse/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/lighthouse/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/lighthouse/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/lighthouse/node_modules/ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -12421,6 +12362,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } @@ -12454,6 +12396,7 @@ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.11.5" } @@ -12472,6 +12415,16 @@ "node": ">=8.9.0" } }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -12493,6 +12446,13 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -12515,7 +12475,8 @@ "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", @@ -12543,7 +12504,8 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/lookup-closest-locale/-/lookup-closest-locale-6.2.0.tgz", "integrity": "sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", @@ -12566,12 +12528,6 @@ "tslib": "^2.0.3" } }, - "node_modules/lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", - "dev": true - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -12586,6 +12542,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -12739,13 +12696,15 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -12768,6 +12727,7 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -12784,12 +12744,6 @@ "node": ">= 4.0.0" } }, - "node_modules/memize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/memize/-/memize-2.1.0.tgz", - "integrity": "sha512-yywVJy8ctVlN5lNPxsep5urnZ6TTclwPEyigM9M3Bi8vseJBOfqNrGWN/r8NzuIt3PovM323W04blJfGQfQSVg==", - "dev": true - }, "node_modules/meow": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", @@ -12903,10 +12857,14 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -12927,7 +12885,8 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/metaviewport-parser/-/metaviewport-parser-0.3.0.tgz", "integrity": "sha512-EoYJ8xfjQ6kpe9VbVHvZTZHiOl4HL1Z18CrZ+qahvLXT7ZO4YTC2JMyt5FaUp9JJp6J4Ybb/z7IsCXZt86/QkQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/methods": { "version": "1.1.2", @@ -12939,12 +12898,13 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -13003,12 +12963,14 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", - "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", "dev": true, + "license": "MIT", "dependencies": { - "schema-utils": "^4.0.0" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "engines": { "node": ">= 12.13.0" @@ -13022,15 +12984,16 @@ } }, "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -13042,6 +13005,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -13053,21 +13017,23 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -13133,12 +13099,6 @@ "node": ">=0.10.0" } }, - "node_modules/mitt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", - "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==", - "dev": true - }, "node_modules/mixin-object": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", @@ -13161,12 +13121,6 @@ "node": ">=0.10.0" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -13196,9 +13150,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, "funding": [ { @@ -13206,6 +13160,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -13232,7 +13187,8 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netmask": { "version": "2.0.2", @@ -13253,48 +13209,6 @@ "tslib": "^2.0.3" } }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -13311,10 +13225,11 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" }, "node_modules/normalize-package-data": { "version": "2.5.0", @@ -13703,6 +13618,7 @@ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -13791,6 +13707,7 @@ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13857,32 +13774,31 @@ } }, "node_modules/pac-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", - "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.1.0.tgz", + "integrity": "sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==", "dev": true, + "license": "MIT", "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "pac-resolver": "^7.0.0", - "socks-proxy-agent": "^8.0.2" + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" }, "engines": { "node": ">= 14" } }, "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, + "license": "MIT", "engines": { "node": ">= 14" } @@ -13901,12 +13817,13 @@ } }, "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -13977,6 +13894,7 @@ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -14062,10 +13980,11 @@ "dev": true }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true, + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", @@ -14083,10 +14002,11 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -14228,9 +14148,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "funding": [ { @@ -14246,10 +14166,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -14898,25 +14819,37 @@ } }, "node_modules/postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", - "dev": true + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true, + "license": "MIT" }, "node_modules/postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "node": ">=18.0" }, "peerDependencies": { - "postcss": "^8.3.3" + "postcss": "^8.4.31" } }, "node_modules/postcss-scss": { @@ -15122,42 +15055,127 @@ "node": ">= 0.10" } }, - "node_modules/proxy-agent": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", - "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.1" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer-core": { + "version": "23.10.4", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.10.4.tgz", + "integrity": "sha512-pQAY7+IFAndWDkDodsQGguW1/ifV5OMlGXJDspwtK49Asb7poJZ/V5rXJxVSpq57bWrJasjQBZ1X27z1oWVq4Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.6.1", + "chromium-bidi": "0.8.0", + "debug": "^4.4.0", + "devtools-protocol": "0.0.1367902", + "typed-query-selector": "^2.12.0", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core/node_modules/@puppeteer/browsers": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.6.1.tgz", + "integrity": "sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.0", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.6.3", + "tar-fs": "^3.0.6", + "unbzip2-stream": "^1.4.3", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 14" } }, - "node_modules/proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "node_modules/puppeteer-core/node_modules/chromium-bidi": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.8.0.tgz", + "integrity": "sha512-uJydbGdTw0DEUjhoogGveneJVWX/9YuqkWePzMmkBYwtdAqo5d3J/ovNKFr+/2hWXYmYCr6it8mSSTIj6SS6Ug==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "debug": "^4.3.4" + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0", + "zod": "3.23.8" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/puppeteer-core/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" }, "engines": { - "node": ">= 14" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/proxy-agent/node_modules/http-proxy-agent": { + "node_modules/puppeteer-core/node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -15166,134 +15184,75 @@ "node": ">= 14" } }, - "node_modules/proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "node_modules/puppeteer-core/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { "node": ">= 14" } }, - "node_modules/proxy-agent/node_modules/lru-cache": { + "node_modules/puppeteer-core/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/ps-list": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-8.1.1.tgz", - "integrity": "sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "node_modules/puppeteer-core/node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } + "license": "MIT" }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "node_modules/puppeteer-core/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/puppeteer-core": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-13.7.0.tgz", - "integrity": "sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q==", + "node_modules/puppeteer-core/node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", "dev": true, + "license": "MIT", "dependencies": { - "cross-fetch": "3.1.5", - "debug": "4.3.4", - "devtools-protocol": "0.0.981744", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.1", - "pkg-dir": "4.2.0", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "ws": "8.5.0" + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" }, "engines": { - "node": ">=10.18.1" + "node": ">= 14" } }, - "node_modules/puppeteer-core/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/puppeteer-core/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, + "license": "ISC", "bin": { - "rimraf": "bin.js" + "semver": "bin/semver.js" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/puppeteer-core/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true, "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node": ">=10" } }, "node_modules/pure-rand": { @@ -15313,12 +15272,13 @@ ] }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -15391,6 +15351,7 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -15406,6 +15367,7 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -15415,6 +15377,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -15742,12 +15705,6 @@ "jsesc": "bin/jsesc" } }, - "node_modules/remove-accents": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", - "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==", - "dev": true - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -15833,6 +15790,7 @@ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==", "dev": true, + "license": "MIT", "dependencies": { "expand-tilde": "^1.2.2", "global-modules": "^0.2.3" @@ -15895,15 +15853,17 @@ "resolved": "https://registry.npmjs.org/robots-parser/-/robots-parser-3.0.1.tgz", "integrity": "sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" } }, "node_modules/rtlcss": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", - "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", "dev": true, + "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0", @@ -16077,30 +16037,30 @@ } }, "node_modules/sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.4.tgz", + "integrity": "sha512-LavLbgbBGUt3wCiYzhuLLu65+fWXaXLmq7YxivLhEqmiupCFZ5sKUAipK3do6V80YSU0jvSxNhEdT13IXNr3rg==", "dev": true, + "license": "MIT", "dependencies": { - "klona": "^2.0.4", "neo-async": "^2.6.2" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" }, "peerDependenciesMeta": { - "fibers": { + "@rspack/core": { "optional": true }, "node-sass": { @@ -16111,6 +16071,9 @@ }, "sass-embedded": { "optional": true + }, + "webpack": { + "optional": true } } }, @@ -16173,10 +16136,11 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -16201,6 +16165,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -16209,14 +16174,26 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, - "bin": { + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { "mime": "cli.js" }, "engines": { @@ -16227,7 +16204,8 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/sentence-case": { "version": "3.0.4", @@ -16241,10 +16219,11 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } @@ -16328,15 +16307,16 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, + "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -16378,7 +16358,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/shallow-clone": { "version": "0.1.2", @@ -16417,24 +16398,26 @@ } }, "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/shell-quote": { @@ -16504,6 +16487,7 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -16521,6 +16505,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -16531,24 +16516,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -16595,27 +16562,26 @@ } }, "node_modules/socks-proxy-agent": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", - "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "^7.1.1", + "agent-base": "^7.1.2", "debug": "^4.3.4", - "socks": "^2.7.1" + "socks": "^2.8.3" }, "engines": { "node": ">= 14" } }, "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, + "license": "MIT", "engines": { "node": ">= 14" } @@ -16630,10 +16596,11 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -16664,6 +16631,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -16674,21 +16642,17 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/spawn-command": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", - "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", - "dev": true - }, "node_modules/spawnd": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-9.0.2.tgz", - "integrity": "sha512-nl8DVHEDQ57IcKakzpjanspVChkMpGLuVwMR/eOn9cXE55Qr6luD2Kn06sA0ootRMdgrU4tInN6lA6ohTNvysw==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-10.1.4.tgz", + "integrity": "sha512-drqHc0mKJmtMsiGMOCwzlc5eZ0RPtRvT7tQAluW2A0qUc0G7TQ8KLcn3E6K5qzkLkH2UkS3nYQiVGULvvsD9dw==", "dev": true, + "license": "MIT", "dependencies": { "signal-exit": "^4.1.0", "tree-kill": "^1.2.2" @@ -16702,6 +16666,7 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -16776,6 +16741,7 @@ "resolved": "https://registry.npmjs.org/speedline-core/-/speedline-core-1.4.3.tgz", "integrity": "sha512-DI7/OuAUD+GMpR6dmu8lliO2Wg5zfeh+/xsdyJZCzd8o5JgFUjCeLsBDuZjIQJdwXS3J0L/uZYrELKYqx+PXog==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "image-ssim": "^0.2.0", @@ -16823,6 +16789,7 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -16840,10 +16807,11 @@ } }, "node_modules/streamx": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", - "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.1.tgz", + "integrity": "sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==", "dev": true, + "license": "MIT", "dependencies": { "fast-fifo": "^1.3.2", "queue-tick": "^1.0.1", @@ -17046,12 +17014,6 @@ "node": ">=0.10.0" } }, - "node_modules/style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", - "dev": true - }, "node_modules/stylehacks": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.1.tgz", @@ -17069,59 +17031,66 @@ } }, "node_modules/stylelint": { - "version": "14.16.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz", - "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==", + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.11.0.tgz", + "integrity": "sha512-zrl4IrKmjJQ+h9FoMp69UMCq5SxeHk0URhxUBj4d3ISzo/DplOFBJZc7t7Dr6otB+1bfbbKNLOmCDpzKSlW+Nw==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", "dependencies": { - "@csstools/selector-specificity": "^2.0.2", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2", + "@csstools/selector-specificity": "^5.0.0", + "@dual-bundle/import-meta-resolve": "^4.1.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", - "cosmiconfig": "^7.1.0", - "css-functions-list": "^3.1.0", - "debug": "^4.3.4", - "fast-glob": "^3.2.12", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.3", + "css-tree": "^3.0.1", + "debug": "^4.3.7", + "fast-glob": "^3.3.2", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^9.1.0", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", - "html-tags": "^3.2.0", - "ignore": "^5.2.1", - "import-lazy": "^4.0.0", + "html-tags": "^3.3.1", + "ignore": "^6.0.2", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.26.0", + "known-css-properties": "^0.35.0", "mathml-tag-names": "^2.1.3", - "meow": "^9.0.0", - "micromatch": "^4.0.5", + "meow": "^13.2.0", + "micromatch": "^4.0.8", "normalize-path": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.19", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.11", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "style-search": "^0.1.0", - "supports-hyperlinks": "^2.3.0", + "supports-hyperlinks": "^3.1.0", "svg-tags": "^1.0.0", - "table": "^6.8.1", - "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^4.0.2" + "table": "^6.8.2", + "write-file-atomic": "^5.0.1" }, "bin": { - "stylelint": "bin/stylelint.js" + "stylelint": "bin/stylelint.mjs" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/stylelint" + "node": ">=18.12.0" } }, "node_modules/stylelint-a11y": { @@ -17174,17 +17143,112 @@ "stylelint": "^14.5.1 || ^15.0.0" } }, + "node_modules/stylelint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, "node_modules/stylelint/node_modules/balanced-match": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/stylelint/node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/stylelint/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/stylelint/node_modules/file-entry-cache": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", + "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/stylelint/node_modules/flat-cache": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", + "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.3.1", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=18" + } }, "node_modules/stylelint/node_modules/global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, + "license": "MIT", "dependencies": { "global-prefix": "^3.0.0" }, @@ -17197,6 +17261,7 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, + "license": "MIT", "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", @@ -17207,32 +17272,129 @@ } }, "node_modules/stylelint/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", + "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, + "node_modules/stylelint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/stylelint/node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/stylelint/node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/stylelint/node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/stylelint/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/stylelint/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/stylelint/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/stylelint/node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -17246,16 +17408,20 @@ } }, "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", + "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -17339,10 +17505,11 @@ } }, "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -17355,15 +17522,16 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -17374,59 +17542,52 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/tannin": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tannin/-/tannin-1.2.0.tgz", - "integrity": "sha512-U7GgX/RcSeUETbV7gYgoz8PD7Ni4y95pgIP/Z6ayI3CfhSujwKEBlGFTCRN+Aqnuyf4AN2yHL+L8x+TCGjb9uA==", "dev": true, - "dependencies": { - "@tannin/plural-forms": "^1.1.0" - } + "license": "MIT" }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", "dev": true, + "license": "MIT", "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" } }, "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", "dev": true, + "license": "MIT", "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" } }, "node_modules/terser": { - "version": "5.19.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", - "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -17441,16 +17602,17 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", + "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -17474,11 +17636,69 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/test-exclude": { "version": "6.0.0", @@ -17516,10 +17736,11 @@ "dev": true }, "node_modules/third-party-web": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.23.4.tgz", - "integrity": "sha512-kwYnSZRhEvv0SBW2fp8SBBKRglMoBjV8xz6C31m0ewqOtknB5UL+Ihg+M81hyFY5ldkZuGWPb+e4GVDkzf/gYg==", - "dev": true + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.26.2.tgz", + "integrity": "sha512-taJ0Us0lKoYBqcbccMuDElSUPOxmBfwlHe1OkHQ3KFf+RwovvBHdXhbFk9XJVQE2vHzxbTwvwg5GFsT9hbDokQ==", + "dev": true, + "license": "MIT" }, "node_modules/through": { "version": "2.3.8", @@ -17533,21 +17754,29 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "node_modules/tldts-core": { + "version": "6.1.67", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.67.tgz", + "integrity": "sha512-12K5O4m3uUW6YM5v45Z7wc6NTSmAYj4Tq3de7eXghZkp879IlfPJrUWeWFwu1FS94U5t2vwETgJ1asu8UGNKVQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tldts-icann": { + "version": "6.1.67", + "resolved": "https://registry.npmjs.org/tldts-icann/-/tldts-icann-6.1.67.tgz", + "integrity": "sha512-CJLFTYBgbnkP6nB8rqSYzd1oyWbM02SeQx9hrEpB6fTjx2+5FJ1lSkovxIWCjMgvzE7Nv54LCrf3lVW0zhupxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.67" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -17565,6 +17794,7 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6" } @@ -17745,6 +17975,7 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -17826,11 +18057,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typed-query-selector": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", + "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "dev": true, + "license": "MIT" + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, + "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } @@ -17923,6 +18162,7 @@ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, + "license": "MIT", "dependencies": { "crypto-random-string": "^2.0.0" }, @@ -17944,14 +18184,15 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -17967,9 +18208,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -18042,6 +18284,13 @@ "requires-port": "^1.0.0" } }, + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "dev": true, + "license": "MIT" + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -18066,12 +18315,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "node_modules/v8-to-istanbul": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", @@ -18130,13 +18373,14 @@ } }, "node_modules/wait-on": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", - "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.1.tgz", + "integrity": "sha512-1wWQOyR2LVVtaqrcIL2+OM+x7bkpmzVROa0Nf6FryXkS+er5Sa1kzFGjzZRqLnHa3n1rACFLeTwUqE1ETL9Mig==", "dev": true, + "license": "MIT", "dependencies": { - "axios": "^1.6.1", - "joi": "^17.11.0", + "axios": "^1.7.7", + "joi": "^17.13.3", "lodash": "^4.17.21", "minimist": "^1.2.8", "rxjs": "^7.8.1" @@ -18158,10 +18402,11 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -18180,10 +18425,11 @@ } }, "node_modules/web-vitals": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-3.5.2.tgz", - "integrity": "sha512-c0rhqNcHXRkY/ogGDJQxZ9Im9D19hDihbzSQJrsioex+KnFgmMzBiy57Z1EjkhX/+OjyBpclDCzz2ITtjokFmg==", - "dev": true + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", + "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", + "dev": true, + "license": "Apache-2.0" }, "node_modules/webidl-conversions": { "version": "7.0.0", @@ -18195,34 +18441,34 @@ } }, "node_modules/webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -18364,56 +18610,6 @@ "node": ">=14" } }, - "node_modules/webpack-cli/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/webpack-cli/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-cli/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-cli/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/webpack-dev-middleware": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", @@ -18683,6 +18879,7 @@ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } @@ -18744,16 +18941,20 @@ "node": ">=12" } }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, "bin": { - "which": "bin/which" + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/which-boxed-primitive": { @@ -18882,24 +19083,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -18920,10 +19103,11 @@ } }, "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -18945,6 +19129,7 @@ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -19045,6 +19230,16 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } }, "dependencies": { @@ -19059,37 +19254,38 @@ } }, "@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "requires": { - "@babel/highlight": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", + "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", "dev": true }, "@babel/core": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", - "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", + "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.6", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", - "@babel/types": "^7.23.6", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -19109,15 +19305,16 @@ } }, "@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", "dev": true, "requires": { - "@babel/types": "^7.24.7", + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" } }, "@babel/helper-annotate-as-pure": { @@ -19139,14 +19336,14 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } @@ -19230,26 +19427,24 @@ } }, "@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, "requires": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" } }, "@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" } }, "@babel/helper-optimise-call-expression": { @@ -19317,21 +19512,21 @@ } }, "@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true }, "@babel/helper-wrap-function": { @@ -19346,71 +19541,24 @@ } }, "@babel/helpers": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", - "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, "requires": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", - "@babel/types": "^7.23.6" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" } }, - "@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "@babel/parser": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "@babel/types": "^7.26.3" } }, - "@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", - "dev": true - }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", @@ -20374,43 +20522,39 @@ } }, "@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" } }, "@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", + "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.3", + "@babel/parser": "^7.26.3", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.3", "debug": "^4.3.1", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" } }, "@bcoe/v8-coverage": { @@ -20419,10 +20563,28 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "dev": true + }, + "@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "dev": true + }, + "@csstools/media-query-list-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", + "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "dev": true + }, "@csstools/selector-specificity": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz", - "integrity": "sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", "dev": true }, "@discoveryjs/json-ext": { @@ -20431,6 +20593,12 @@ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, + "@dual-bundle/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", + "dev": true + }, "@es-joy/jsdoccomment": { "version": "0.41.0", "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.41.0.tgz", @@ -20508,6 +20676,57 @@ } } }, + "@formatjs/ecma402-abstract": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.1.tgz", + "integrity": "sha512-Ip9uV+/MpLXWRk03U/GzeJMuPeOXpJBSB5V1tjA6kJhvqssye5J5LoYLc7Z5IAHb7nR62sRoguzrFiVCP/hnzw==", + "dev": true, + "requires": { + "@formatjs/fast-memoize": "2.2.5", + "@formatjs/intl-localematcher": "0.5.9", + "decimal.js": "10", + "tslib": "2" + } + }, + "@formatjs/fast-memoize": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.5.tgz", + "integrity": "sha512-6PoewUMrrcqxSoBXAOJDiW1m+AmkrAj0RiXnOMD59GRaswjXhm3MDhgepXPBgonc09oSirAJTsAggzAGQf6A6g==", + "dev": true, + "requires": { + "tslib": "2" + } + }, + "@formatjs/icu-messageformat-parser": { + "version": "2.9.7", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.7.tgz", + "integrity": "sha512-cuEHyRM5VqLQobANOjtjlgU7+qmk9Q3fDQuBiRRJ3+Wp3ZoZhpUPtUfuimZXsir6SaI2TaAJ+SLo9vLnV5QcbA==", + "dev": true, + "requires": { + "@formatjs/ecma402-abstract": "2.3.1", + "@formatjs/icu-skeleton-parser": "1.8.11", + "tslib": "2" + } + }, + "@formatjs/icu-skeleton-parser": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.11.tgz", + "integrity": "sha512-8LlHHE/yL/zVJZHAX3pbKaCjZKmBIO6aJY1mkVh4RMSEu/2WRZ4Ysvv3kKXJ9M8RJLBHdnk1/dUQFdod1Dt7Dw==", + "dev": true, + "requires": { + "@formatjs/ecma402-abstract": "2.3.1", + "tslib": "2" + } + }, + "@formatjs/intl-localematcher": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.9.tgz", + "integrity": "sha512-8zkGu/sv5euxbjfZ/xmklqLyDGQSxsLqg8XOq88JW3cmJtzhCP8EtSJXlaKZnVO4beEaoiT9wj4eIoCQ9smwxA==", + "dev": true, + "requires": { + "tslib": "2" + } + }, "@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -20920,13 +21139,13 @@ "dev": true }, "@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "@jridgewell/sourcemap-codec": { @@ -20986,6 +21205,15 @@ "fastq": "^1.6.0" } }, + "@paulirish/trace_engine": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@paulirish/trace_engine/-/trace_engine-0.0.39.tgz", + "integrity": "sha512-2Y/ejHX5DDi5bjfWY/0c/BLVSfQ61Jw1Hy60Hnh0hfEO632D3FVctkzT4Q/lVAdvIPR0bUaok9JDTr1pu/OziA==", + "dev": true, + "requires": { + "third-party-web": "latest" + } + }, "@pkgr/core": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", @@ -21015,177 +21243,71 @@ "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==", "dev": true }, - "@puppeteer/browsers": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz", - "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==", + "@sentry-internal/tracing": { + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.120.2.tgz", + "integrity": "sha512-eo2F8cP6X+vr54Mp6vu+NoQEDz0M5O24Tz8jPY0T1CpiWdwCmHb7Sln+oLXeQ3/LlWdVQihBfKDBZfBdUfsBTg==", "dev": true, "requires": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - }, - "dependencies": { - "tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "dev": true, - "requires": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, - "tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dev": true, - "requires": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - } + "@sentry/core": "7.120.2", + "@sentry/types": "7.120.2", + "@sentry/utils": "7.120.2" } }, "@sentry/core": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.19.7.tgz", - "integrity": "sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw==", - "dev": true, - "requires": { - "@sentry/hub": "6.19.7", - "@sentry/minimal": "6.19.7", - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@sentry/hub": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", - "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==", + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.120.2.tgz", + "integrity": "sha512-eurLBFQJC7WWWYoEna25Z9I/GJjqAmH339tv52XP8sqXV7B5hRcHDcfrsT/UGHpU316M24p3lWhj0eimtCZ0SQ==", "dev": true, "requires": { - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } + "@sentry/types": "7.120.2", + "@sentry/utils": "7.120.2" } }, - "@sentry/minimal": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz", - "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==", + "@sentry/integrations": { + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.120.2.tgz", + "integrity": "sha512-bMvL2fD3TGLM5YAUoQ2Qz6bYeVU8f7YRFNSjKNxK4EbvFgAU9j1FD6EKg0V0RNOJYnJjGIZYMmcWTXBbVTJL6w==", "dev": true, "requires": { - "@sentry/hub": "6.19.7", - "@sentry/types": "6.19.7", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } + "@sentry/core": "7.120.2", + "@sentry/types": "7.120.2", + "@sentry/utils": "7.120.2", + "localforage": "^1.8.1" } }, "@sentry/node": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-6.19.7.tgz", - "integrity": "sha512-gtmRC4dAXKODMpHXKfrkfvyBL3cI8y64vEi3fDD046uqYcrWdgoQsffuBbxMAizc6Ez1ia+f0Flue6p15Qaltg==", + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.120.2.tgz", + "integrity": "sha512-ZnW9gpIGaoU+vYZyVZca9dObfmWYiXEWIMUM/JXaFb8AhP1OXvYweNiU0Pe/gNrz4oGAogU8scJc70ar7Vj0ww==", "dev": true, "requires": { - "@sentry/core": "6.19.7", - "@sentry/hub": "6.19.7", - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } + "@sentry-internal/tracing": "7.120.2", + "@sentry/core": "7.120.2", + "@sentry/integrations": "7.120.2", + "@sentry/types": "7.120.2", + "@sentry/utils": "7.120.2" } }, "@sentry/types": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", - "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==", + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.2.tgz", + "integrity": "sha512-FWVoiblHQJ892GaOqdXx/5/n5XDLF28z81vJ0lCY49PMh8waz8LJ0b9RSmt9tasSDl0OQ7eUlPl1xu1jTrv1NA==", "dev": true }, "@sentry/utils": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", - "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.120.2.tgz", + "integrity": "sha512-jgnQlw11mRfQrQRAXbq4zEd+tbYwHel5eqeS/oU6EImXRjmHNtS79nB8MHvJeQu1FMCpFs1Ymrrs5FICwS6VeQ==", "dev": true, "requires": { - "@sentry/types": "6.19.7", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } + "@sentry/types": "7.120.2" } }, "@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", "dev": true, "requires": { "@hapi/hoek": "^9.0.0" @@ -21417,37 +21539,6 @@ "@svgr/plugin-svgo": "8.1.0" } }, - "@tannin/compile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@tannin/compile/-/compile-1.1.0.tgz", - "integrity": "sha512-n8m9eNDfoNZoxdvWiTfW/hSPhehzLJ3zW7f8E7oT6mCROoMNWCB4TYtv041+2FMAxweiE0j7i1jubQU4MEC/Gg==", - "dev": true, - "requires": { - "@tannin/evaluate": "^1.2.0", - "@tannin/postfix": "^1.1.0" - } - }, - "@tannin/evaluate": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@tannin/evaluate/-/evaluate-1.2.0.tgz", - "integrity": "sha512-3ioXvNowbO/wSrxsDG5DKIMxC81P0QrQTYai8zFNY+umuoHWRPbQ/TuuDEOju9E+jQDXmj6yI5GyejNuh8I+eg==", - "dev": true - }, - "@tannin/plural-forms": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@tannin/plural-forms/-/plural-forms-1.1.0.tgz", - "integrity": "sha512-xl9R2mDZO/qiHam1AgMnAES6IKIg7OBhcXqy6eDsRCdXuxAFPcjrej9HMjyCLE0DJ/8cHf0i5OQTstuBRhpbHw==", - "dev": true, - "requires": { - "@tannin/compile": "^1.1.0" - } - }, - "@tannin/postfix": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@tannin/postfix/-/postfix-1.1.0.tgz", - "integrity": "sha512-oocsqY7g0cR+Gur5jRQLSrX2OtpMLMse1I10JQBm8CdGMrDkh1Mg2gjsiquMHRtBs4Qwu5wgEp5GgIYHk4SNPw==", - "dev": true - }, "@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -21546,9 +21637,9 @@ } }, "@types/eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, "requires": { "@types/estree": "*", @@ -21556,9 +21647,9 @@ } }, "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, "requires": { "@types/eslint": "*", @@ -21566,9 +21657,9 @@ } }, "@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true }, "@types/express": { @@ -22050,148 +22141,148 @@ } }, "@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "requires": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true }, "@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -22213,17 +22304,6 @@ "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true }, - "@wordpress/api-fetch": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-7.1.0.tgz", - "integrity": "sha512-mtEJi9IBPCRtNxyhP1VAwcLmncpQzt7CQX8rxhC4eAMnicamCG/fwZ3pFEKGXk3MUul3Bl1Q7y/UhdMtCGktGg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.16.0", - "@wordpress/i18n": "^5.1.0", - "@wordpress/url": "^4.1.0" - } - }, "@wordpress/babel-preset-default": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-8.1.0.tgz", @@ -22250,9 +22330,9 @@ "dev": true }, "@wordpress/browserslist-config": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.1.0.tgz", - "integrity": "sha512-cf5iwPq6JetQjiaRwlvzW5eX0S3OphVmy1YTxHQdrVqp79rOGvamVftxqvmf3C/GSRaNyI4eZV+nNwNRN0DkrQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.14.0.tgz", + "integrity": "sha512-a26hxY8R/A7FH/Z8oZsYS31ZC/Xy9QSBTi5w84MKSeYdWlck7t1QdCwUNF1u621wbuP7beiiu9FkYY4hI3Bk9A==", "dev": true }, "@wordpress/dependency-extraction-webpack-plugin": { @@ -22265,20 +22345,17 @@ } }, "@wordpress/e2e-test-utils-playwright": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.1.0.tgz", - "integrity": "sha512-lGA7/6S1Rsa9Zf7qnAs1nOWn8lPpg8vBOwUWHPBqV1a79r7nsD2KQqsrqsKy8wIJ763fIt5LljjD9VSca0UtIQ==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.14.0.tgz", + "integrity": "sha512-G9r3ZysgzAmUbR4bjGAEEP6P2RCIAG8uMU7yyzxOAHegINSbF3shEZKvVNBeKxNwHKAVa9koh/niGN3U4Kr6Rw==", "dev": true, "requires": { - "@wordpress/api-fetch": "^7.1.0", - "@wordpress/keycodes": "^4.1.0", - "@wordpress/url": "^4.1.0", "change-case": "^4.1.2", "form-data": "^4.0.0", "get-port": "^5.1.1", - "lighthouse": "^10.4.0", + "lighthouse": "^12.2.2", "mime": "^3.0.0", - "web-vitals": "^3.5.0" + "web-vitals": "^4.2.1" } }, "@wordpress/eslint-plugin": { @@ -22317,29 +22394,6 @@ } } }, - "@wordpress/hooks": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-4.1.0.tgz", - "integrity": "sha512-uJ2zyLLs6AwWuEdLGv/P7oSXJuX27Ym6JglzWGBavxAKNXpTCCjiJwgxlZJbSjT3BzhRsRGl3bUMmzt3eh50Pg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.16.0" - } - }, - "@wordpress/i18n": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-5.1.0.tgz", - "integrity": "sha512-zNJiudByLnpIVhIS45hr92r53t+wRYp9a6XOJ585xNYeUmoUpymY5GTdLSrExmQaytMhV5cSXSn3qMMDBMjUsg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.16.0", - "@wordpress/hooks": "^4.1.0", - "gettext-parser": "^1.3.1", - "memize": "^2.1.0", - "sprintf-js": "^1.1.1", - "tannin": "^1.2.0" - } - }, "@wordpress/jest-console": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-8.1.0.tgz", @@ -22360,16 +22414,6 @@ "babel-jest": "^29.6.2" } }, - "@wordpress/keycodes": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-4.1.0.tgz", - "integrity": "sha512-ibAR7qg4q7082s9kOPnZ0Hqb6KM/zjAZBjEH2Yrc2jwLJ83QDGKDWCSx6dNYkN7m9jGpH52w8j4nz1wcbFZSiw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.16.0", - "@wordpress/i18n": "^5.1.0" - } - }, "@wordpress/npm-package-json-lint-config": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-5.1.0.tgz", @@ -22393,33 +22437,33 @@ "dev": true }, "@wordpress/scripts": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-28.1.0.tgz", - "integrity": "sha512-BWmYA0fqOhfMcl20ppcJA/nw/zixt0FP6KPV+IiI560qpSHx6ZZieU354oX/5Vdaoe4O3ahPlGdUr9fWcprApQ==", + "version": "30.7.0", + "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-30.7.0.tgz", + "integrity": "sha512-vwrf6Xo1GXV2ug4xdYMgZ2CVpNNfArOEJyX6w9CafIRmLOm8GkVGSza0VlEoOh1BTqQPv/awq6uiOKVMbVNB5Q==", "dev": true, "requires": { - "@babel/core": "^7.16.0", + "@babel/core": "7.25.7", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", "@svgr/webpack": "^8.0.1", - "@wordpress/babel-preset-default": "^8.1.0", - "@wordpress/browserslist-config": "^6.1.0", - "@wordpress/dependency-extraction-webpack-plugin": "^6.1.0", - "@wordpress/e2e-test-utils-playwright": "^1.1.0", - "@wordpress/eslint-plugin": "^19.1.0", - "@wordpress/jest-preset-default": "^12.1.0", - "@wordpress/npm-package-json-lint-config": "^5.1.0", - "@wordpress/postcss-plugins-preset": "^5.1.0", - "@wordpress/prettier-config": "^4.1.0", - "@wordpress/stylelint-config": "^22.1.0", + "@wordpress/babel-preset-default": "*", + "@wordpress/browserslist-config": "*", + "@wordpress/dependency-extraction-webpack-plugin": "*", + "@wordpress/e2e-test-utils-playwright": "*", + "@wordpress/eslint-plugin": "*", + "@wordpress/jest-preset-default": "*", + "@wordpress/npm-package-json-lint-config": "*", + "@wordpress/postcss-plugins-preset": "*", + "@wordpress/prettier-config": "*", + "@wordpress/stylelint-config": "*", "adm-zip": "^0.5.9", - "babel-jest": "^29.6.2", - "babel-loader": "^8.2.3", + "babel-jest": "29.7.0", + "babel-loader": "9.2.1", "browserslist": "^4.21.10", "chalk": "^4.0.0", "check-node-version": "^4.1.0", "clean-webpack-plugin": "^3.0.0", "copy-webpack-plugin": "^10.2.0", - "cross-spawn": "^5.1.0", + "cross-spawn": "^7.0.6", "css-loader": "^6.2.0", "cssnano": "^6.0.1", "cwd": "^0.10.0", @@ -22429,33 +22473,82 @@ "fast-glob": "^3.2.7", "filenamify": "^4.2.0", "jest": "^29.6.2", - "jest-dev-server": "^9.0.1", + "jest-dev-server": "^10.1.4", "jest-environment-jsdom": "^29.6.2", "jest-environment-node": "^29.6.2", + "json2php": "^0.0.9", "markdownlint-cli": "^0.31.1", "merge-deep": "^3.0.3", - "mini-css-extract-plugin": "^2.5.1", + "mini-css-extract-plugin": "^2.9.2", "minimist": "^1.2.0", "npm-package-json-lint": "^6.4.0", "npm-packlist": "^3.0.0", "postcss": "^8.4.5", "postcss-loader": "^6.2.1", "prettier": "npm:wp-prettier@3.0.3", - "puppeteer-core": "^13.2.0", + "puppeteer-core": "^23.10.1", "react-refresh": "^0.14.0", "read-pkg-up": "^7.0.1", "resolve-bin": "^0.4.0", "rtlcss-webpack-plugin": "^4.0.7", - "sass": "^1.35.2", - "sass-loader": "^12.1.0", + "sass": "^1.50.1", + "sass-loader": "^16.0.3", + "schema-utils": "^4.2.0", "source-map-loader": "^3.0.0", - "stylelint": "^14.2.0", - "terser-webpack-plugin": "^5.3.9", + "stylelint": "^16.8.2", + "terser-webpack-plugin": "^5.3.10", "url-loader": "^4.1.1", - "webpack": "^5.88.2", + "webpack": "^5.97.0", "webpack-bundle-analyzer": "^4.9.1", "webpack-cli": "^5.1.4", "webpack-dev-server": "^4.15.1" + }, + "dependencies": { + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "json2php": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/json2php/-/json2php-0.0.9.tgz", + "integrity": "sha512-fQMYwvPsQt8hxRnCGyg1r2JVi6yL8Um0DIIawiKiMK9yhAAkcRNj5UsBWoaFvFzPpcWbgw9L6wzj+UMYA702Mw==", + "dev": true + }, + "schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + } } }, "@wordpress/stylelint-config": { @@ -22468,16 +22561,6 @@ "stylelint-config-recommended-scss": "^5.0.2" } }, - "@wordpress/url": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-4.1.0.tgz", - "integrity": "sha512-6Yi9EbTgUGJgsm6XtfO4By8q2+9pTzWkxzx27ShKGF+PqIgIZjiDssf2NfD/oNUevIy48LbQMbyEyK+9r2Bw9A==", - "dev": true, - "requires": { - "@babel/runtime": "^7.16.0", - "remove-accents": "^0.5.0" - } - }, "@wordpress/warning": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.1.0.tgz", @@ -22513,9 +22596,9 @@ } }, "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true }, "acorn-globals": { @@ -22528,12 +22611,6 @@ "acorn-walk": "^8.0.2" } }, - "acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true - }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -22872,16 +22949,16 @@ "dev": true }, "autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "requires": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" } }, @@ -22895,18 +22972,18 @@ } }, "axe-core": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz", - "integrity": "sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", + "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", "dev": true }, "axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", "dev": true, "requires": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -22942,26 +23019,52 @@ } }, "babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dev": true, "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" }, "dependencies": { + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" } } } @@ -23103,6 +23206,45 @@ "dev": true, "optional": true }, + "bare-fs": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", + "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", + "dev": true, + "optional": true, + "requires": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" + } + }, + "bare-os": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", + "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", + "dev": true, + "optional": true + }, + "bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "dev": true, + "optional": true, + "requires": { + "bare-os": "^2.1.0" + } + }, + "bare-stream": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.1.tgz", + "integrity": "sha512-eVZbtKM+4uehzrsj49KtCy3Pbg7kO1pJ3SKZ1SFrIH/0pnj9scuGGgUlNDf/7qS8WKtGdiJY5Kyhs/ivYPTB/g==", + "dev": true, + "optional": true, + "requires": { + "streamx": "^2.21.0" + } + }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -23133,21 +23275,10 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "requires": { "bytes": "3.1.2", @@ -23158,7 +23289,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -23234,15 +23365,15 @@ } }, "browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" } }, "bser": { @@ -23390,9 +23521,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001636", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", - "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "version": "1.0.30001688", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001688.tgz", + "integrity": "sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==", "dev": true }, "capital-case": { @@ -23424,21 +23555,6 @@ "requires": { "color-convert": "^2.0.1" } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true } } }, @@ -23500,21 +23616,6 @@ "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true } } }, @@ -23534,22 +23635,16 @@ "readdirp": "~3.6.0" } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, "chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-1.1.2.tgz", + "integrity": "sha512-YclTJey34KUm5jB1aEJCq807bSievi7Nb/TU4Gu504fUYi3jw3KCIaH6L7nFWQhdEgH3V+wCh+kKD1P5cXnfxw==", "dev": true, "requires": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" + "lighthouse-logger": "^2.0.1" }, "dependencies": { "escape-string-regexp": { @@ -23561,20 +23656,11 @@ } }, "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true }, - "chromium-bidi": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", - "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", - "dev": true, - "requires": { - "mitt": "3.0.0" - } - }, "ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -23645,18 +23731,18 @@ "dev": true }, "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "colord": { @@ -23698,12 +23784,6 @@ "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "dev": true }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -23758,17 +23838,15 @@ "dev": true }, "concurrently": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", - "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.1.0.tgz", + "integrity": "sha512-VxkzwMAn4LP7WyMnJNbHN5mKV9L2IbyDjpzemKr99sXNR3GqRNMMHdm7prV1ws9wg7ETj6WUkNOigZVsptwbgg==", "dev": true, "requires": { "chalk": "^4.1.2", - "date-fns": "^2.30.0", "lodash": "^4.17.21", "rxjs": "^7.8.1", "shell-quote": "^1.8.1", - "spawn-command": "0.0.2", "supports-color": "^8.1.1", "tree-kill": "^1.2.2", "yargs": "^17.7.2" @@ -23852,9 +23930,9 @@ "dev": true }, "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true }, "cookie-signature": { @@ -24008,42 +24086,15 @@ "prompts": "^2.0.1" } }, - "cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dev": true, - "requires": { - "node-fetch": "2.6.7" - } - }, "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - } + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "crypto-random-string": { @@ -24065,9 +24116,9 @@ "dev": true }, "css-functions-list": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz", - "integrity": "sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", "dev": true }, "css-loader": { @@ -24316,15 +24367,6 @@ "is-data-view": "^1.0.1" } }, - "date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.21.0" - } - }, "debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", @@ -24552,9 +24594,9 @@ "dev": true }, "devtools-protocol": { - "version": "0.0.981744", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.981744.tgz", - "integrity": "sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==", + "version": "0.0.1367902", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz", + "integrity": "sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==", "dev": true }, "diff-sequences": { @@ -24674,9 +24716,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.810", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.810.tgz", - "integrity": "sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ==", + "version": "1.5.73", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz", + "integrity": "sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==", "dev": true }, "emittery": { @@ -24698,20 +24740,11 @@ "dev": true }, "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -24722,9 +24755,9 @@ } }, "enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -24747,6 +24780,12 @@ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true + }, "envinfo": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", @@ -24880,9 +24919,9 @@ } }, "es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, "es-object-atoms": { @@ -24926,9 +24965,9 @@ } }, "escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, "escape-html": { @@ -25023,17 +25062,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -25103,30 +25131,6 @@ "requires": { "argparse": "^2.0.1" } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -25566,43 +25570,6 @@ "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } } }, "exit": { @@ -25640,37 +25607,37 @@ "dev": true }, "express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -25684,12 +25651,6 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, - "cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -25773,6 +25734,12 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true + }, "fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -25851,13 +25818,13 @@ } }, "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -25871,28 +25838,87 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "requires": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "dependencies": { + "find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "requires": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + } + }, + "locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + }, + "pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "requires": { + "find-up": "^6.3.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true } } }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, "find-file-up": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", @@ -25967,9 +25993,9 @@ } }, "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", "dev": true }, "follow-redirects": { @@ -26031,12 +26057,6 @@ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, "fs-exists-sync": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", @@ -26177,16 +26197,6 @@ "fs-extra": "^11.2.0" } }, - "gettext-parser": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.4.0.tgz", - "integrity": "sha512-sedZYLHlHeBop/gZ1jdg59hlUEcpcZJofLq2JFwJT1zTqAU3l2wFv6IsuwFHGqbiT9DWzMUW4/em2+hspnmMMA==", - "dev": true, - "requires": { - "encoding": "^0.1.12", - "safe-buffer": "^5.1.1" - } - }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -26236,6 +26246,17 @@ "ini": "^1.3.4", "is-windows": "^0.2.0", "which": "^1.2.12" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "globals": { @@ -26284,9 +26305,9 @@ } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "grapheme-splitter": { @@ -26470,9 +26491,9 @@ "dev": true }, "html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "dev": true }, "http-deceiver": { @@ -26529,9 +26550,9 @@ } }, "http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "dev": true, "requires": { "@types/http-proxy": "^1.17.8", @@ -26599,6 +26620,12 @@ "integrity": "sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==", "dev": true }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, "immutable": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", @@ -26615,12 +26642,6 @@ "resolve-from": "^4.0.0" } }, - "import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true - }, "import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -26683,20 +26704,17 @@ "dev": true }, "intl-messageformat": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-4.4.0.tgz", - "integrity": "sha512-z+Bj2rS3LZSYU4+sNitdHrwnBhr0wO80ZJSW8EzKDBowwUe3Q/UsvgCGjrwa+HPzoGCLEb9HAjfJgo4j2Sac8w==", + "version": "10.7.10", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.10.tgz", + "integrity": "sha512-hp7iejCBiJdW3zmOe18FdlJu8U/JsADSDiBPQhfdSeI8B9POtvPRvPh3nMlvhYayGMKLv6maldhR7y3Pf1vkpw==", "dev": true, "requires": { - "intl-messageformat-parser": "^1.8.1" + "@formatjs/ecma402-abstract": "2.3.1", + "@formatjs/fast-memoize": "2.2.5", + "@formatjs/icu-messageformat-parser": "2.9.7", + "tslib": "2" } }, - "intl-messageformat-parser": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.8.1.tgz", - "integrity": "sha512-IMSCKVf0USrM/959vj3xac7s8f87sc+80Y/ipBzdKy4ifBv5Gsj2tZ41EAaURVg01QU71fYr77uA8Meh6kELbg==", - "dev": true - }, "ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -27298,18 +27316,18 @@ } }, "jest-dev-server": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-9.0.2.tgz", - "integrity": "sha512-Zc/JB0IlNNrpXkhBw+h86cGrde/Mey52KvF+FER2eyrtYJTHObOwW7Iarxm3rPyTKby5+3Y2QZtl8pRz/5GCxg==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-10.1.4.tgz", + "integrity": "sha512-bGQ6sedNGtT6AFHhCVqGTXMPz7UyJi/ZrhNBgyqsP0XU9N8acCEIfqZEA22rOaZ+NdEVsaltk6tL7UT6aXfI7w==", "dev": true, "requires": { "chalk": "^4.1.2", "cwd": "^0.10.0", "find-process": "^1.4.7", "prompts": "^2.4.2", - "spawnd": "^9.0.2", + "spawnd": "^10.1.4", "tree-kill": "^1.2.2", - "wait-on": "^7.2.0" + "wait-on": "^8.0.1" } }, "jest-diff": { @@ -27733,14 +27751,14 @@ } }, "joi": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", - "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", "dev": true, "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } @@ -27826,9 +27844,15 @@ } }, "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, "json-parse-even-better-errors": { @@ -27897,6 +27921,15 @@ "object.values": "^1.1.6" } }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -27919,9 +27952,9 @@ "dev": true }, "known-css-properties": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", - "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", + "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", "dev": true }, "language-subtag-registry": { @@ -27971,127 +28004,63 @@ "type-check": "~0.4.0" } }, + "lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, "lighthouse": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-10.4.0.tgz", - "integrity": "sha512-XQWHEWkJ8YxSPsxttBJORy5+hQrzbvGkYfeP3fJjyYKioWkF2MXfFqNK4ZuV4jL8pBu7Z91qnQP6In0bq1yXww==", + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-12.3.0.tgz", + "integrity": "sha512-OaLE8DasnwQkn2CBo2lKtD+IQv42mNP3T+Vaw29I++rAh0Zpgc6SM15usdIYyzhRMR5EWFxze5Fyb+HENJSh2A==", "dev": true, "requires": { - "@sentry/node": "^6.17.4", - "axe-core": "4.7.2", - "chrome-launcher": "^0.15.2", + "@paulirish/trace_engine": "0.0.39", + "@sentry/node": "^7.0.0", + "axe-core": "^4.10.2", + "chrome-launcher": "^1.1.2", "configstore": "^5.0.1", "csp_evaluator": "1.1.1", - "devtools-protocol": "0.0.1155343", + "devtools-protocol": "0.0.1312386", "enquirer": "^2.3.6", "http-link-header": "^1.1.1", - "intl-messageformat": "^4.4.0", + "intl-messageformat": "^10.5.3", "jpeg-js": "^0.4.4", - "js-library-detector": "^6.6.0", - "lighthouse-logger": "^1.4.1", - "lighthouse-stack-packs": "1.11.0", - "lodash": "^4.17.21", + "js-library-detector": "^6.7.0", + "lighthouse-logger": "^2.0.1", + "lighthouse-stack-packs": "1.12.2", + "lodash-es": "^4.17.21", "lookup-closest-locale": "6.2.0", "metaviewport-parser": "0.3.0", "open": "^8.4.0", "parse-cache-control": "1.0.1", - "ps-list": "^8.0.0", - "puppeteer-core": "^20.8.0", - "robots-parser": "^3.0.0", + "puppeteer-core": "^23.10.4", + "robots-parser": "^3.0.1", "semver": "^5.3.0", "speedline-core": "^1.4.3", - "third-party-web": "^0.23.3", + "third-party-web": "^0.26.1", + "tldts-icann": "^6.1.16", "ws": "^7.0.0", "yargs": "^17.3.1", "yargs-parser": "^21.0.0" }, "dependencies": { - "axe-core": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", - "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", - "dev": true - }, - "cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dev": true, - "requires": { - "node-fetch": "^2.6.12" - } - }, "devtools-protocol": { - "version": "0.0.1155343", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1155343.tgz", - "integrity": "sha512-oD9vGBV2wTc7fAzAM6KC0chSgs234V8+qDEeK+mcbRj2UvcuA7lgBztGi/opj/iahcXD3BSj8Ymvib628yy9FA==", + "version": "0.0.1312386", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", + "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==", "dev": true }, - "node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "puppeteer-core": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", - "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", - "dev": true, - "requires": { - "@puppeteer/browsers": "1.4.6", - "chromium-bidi": "0.4.16", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1147663", - "ws": "8.13.0" - }, - "dependencies": { - "devtools-protocol": { - "version": "0.0.1147663", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", - "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==", - "dev": true - }, - "ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "dev": true - } - } - }, "semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", @@ -28107,9 +28076,9 @@ } }, "lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-2.0.1.tgz", + "integrity": "sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==", "dev": true, "requires": { "debug": "^2.6.9", @@ -28134,9 +28103,9 @@ } }, "lighthouse-stack-packs": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.11.0.tgz", - "integrity": "sha512-sRr0z1S/I26VffRLq9KJsKtLk856YrJlNGmcJmbLX8dFn3MuzVPUbstuChEhqnSxZb8TZmVfthuXuwhG9vRoSw==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.12.2.tgz", + "integrity": "sha512-Ug8feS/A+92TMTCK6yHYLwaFMuelK/hAKRMdldYkMNwv+d9PtWxjXEg6rwKtsUXTADajhdrhXyuNCJ5/sfmPFw==", "dev": true }, "lilconfig": { @@ -28177,6 +28146,15 @@ "json5": "^2.1.2" } }, + "localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "dev": true, + "requires": { + "lie": "3.1.1" + } + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -28192,6 +28170,12 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -28256,12 +28240,6 @@ "tslib": "^2.0.3" } }, - "lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", - "dev": true - }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -28432,12 +28410,6 @@ "fs-monkey": "^1.0.4" } }, - "memize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/memize/-/memize-2.1.0.tgz", - "integrity": "sha512-yywVJy8ctVlN5lNPxsep5urnZ6TTclwPEyigM9M3Bi8vseJBOfqNrGWN/r8NzuIt3PovM323W04blJfGQfQSVg==", - "dev": true - }, "meow": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", @@ -28523,9 +28495,9 @@ } }, "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true }, "merge-stream": { @@ -28553,12 +28525,12 @@ "dev": true }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, @@ -28596,24 +28568,25 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", - "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", "dev": true, "requires": { - "schema-utils": "^4.0.0" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "dependencies": { "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" } }, "ajv-keywords": { @@ -28632,15 +28605,15 @@ "dev": true }, "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" } } } @@ -28691,12 +28664,6 @@ } } }, - "mitt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", - "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==", - "dev": true - }, "mixin-object": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", @@ -28715,12 +28682,6 @@ } } }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, "mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -28744,9 +28705,9 @@ } }, "nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true }, "natural-compare": { @@ -28783,39 +28744,6 @@ "tslib": "^2.0.3" } }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, "node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -28829,9 +28757,9 @@ "dev": true }, "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true }, "normalize-package-data": { @@ -29226,29 +29154,26 @@ "dev": true }, "pac-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", - "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.1.0.tgz", + "integrity": "sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==", "dev": true, "requires": { "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "pac-resolver": "^7.0.0", - "socks-proxy-agent": "^8.0.2" + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" }, "dependencies": { "agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "requires": { - "debug": "^4.3.4" - } + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true }, "http-proxy-agent": { "version": "7.0.2", @@ -29261,12 +29186,12 @@ } }, "https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "requires": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" } } @@ -29391,9 +29316,9 @@ "dev": true }, "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "dev": true }, "path-type": { @@ -29409,9 +29334,9 @@ "dev": true }, "picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "picomatch": { @@ -29511,14 +29436,14 @@ "dev": true }, "postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "requires": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" } }, "postcss-calc": { @@ -29908,15 +29833,15 @@ } }, "postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", "dev": true }, "postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", "dev": true }, "postcss-scss": { @@ -30057,77 +29982,12 @@ } } }, - "proxy-agent": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", - "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", - "dev": true, - "requires": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.1" - }, - "dependencies": { - "agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "requires": { - "debug": "^4.3.4" - } - }, - "http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "requires": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - } - }, - "https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "dev": true, - "requires": { - "agent-base": "^7.0.2", - "debug": "4" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - } - } - }, "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, - "ps-list": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-8.1.1.tgz", - "integrity": "sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -30151,38 +30011,119 @@ "dev": true }, "puppeteer-core": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-13.7.0.tgz", - "integrity": "sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q==", + "version": "23.10.4", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.10.4.tgz", + "integrity": "sha512-pQAY7+IFAndWDkDodsQGguW1/ifV5OMlGXJDspwtK49Asb7poJZ/V5rXJxVSpq57bWrJasjQBZ1X27z1oWVq4Q==", "dev": true, "requires": { - "cross-fetch": "3.1.5", - "debug": "4.3.4", - "devtools-protocol": "0.0.981744", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.1", - "pkg-dir": "4.2.0", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "ws": "8.5.0" + "@puppeteer/browsers": "2.6.1", + "chromium-bidi": "0.8.0", + "debug": "^4.4.0", + "devtools-protocol": "0.0.1367902", + "typed-query-selector": "^2.12.0", + "ws": "^8.18.0" }, "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "@puppeteer/browsers": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.6.1.tgz", + "integrity": "sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==", + "dev": true, + "requires": { + "debug": "^4.4.0", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.6.3", + "tar-fs": "^3.0.6", + "unbzip2-stream": "^1.4.3", + "yargs": "^17.7.2" + } + }, + "agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true + }, + "chromium-bidi": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.8.0.tgz", + "integrity": "sha512-uJydbGdTw0DEUjhoogGveneJVWX/9YuqkWePzMmkBYwtdAqo5d3J/ovNKFr+/2hWXYmYCr6it8mSSTIj6SS6Ug==", + "dev": true, + "requires": { + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0", + "zod": "3.23.8" + } + }, + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "requires": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + } + }, + "https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "requires": { + "agent-base": "^7.1.2", + "debug": "4" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", "dev": true, "requires": { - "glob": "^7.1.3" + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" } }, - "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -30194,12 +30135,12 @@ "dev": true }, "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "requires": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" } }, "querystringify": { @@ -30517,12 +30458,6 @@ } } }, - "remove-accents": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", - "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==", - "dev": true - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -30634,9 +30569,9 @@ "dev": true }, "rtlcss": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", - "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -30754,12 +30689,11 @@ } }, "sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.4.tgz", + "integrity": "sha512-LavLbgbBGUt3wCiYzhuLLu65+fWXaXLmq7YxivLhEqmiupCFZ5sKUAipK3do6V80YSU0jvSxNhEdT13IXNr3rg==", "dev": true, "requires": { - "klona": "^2.0.4", "neo-async": "^2.6.2" } }, @@ -30806,9 +30740,9 @@ "dev": true }, "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, "requires": { "debug": "2.6.9", @@ -30843,6 +30777,12 @@ } } }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -30869,9 +30809,9 @@ } }, "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -30946,15 +30886,15 @@ } }, "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "requires": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" } }, "set-function-length": { @@ -31019,18 +30959,18 @@ } }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "shell-quote": { @@ -31099,21 +31039,6 @@ "requires": { "color-convert": "^2.0.1" } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true } } }, @@ -31155,24 +31080,21 @@ } }, "socks-proxy-agent": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", - "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, "requires": { - "agent-base": "^7.1.1", + "agent-base": "^7.1.2", "debug": "^4.3.4", - "socks": "^2.7.1" + "socks": "^2.8.3" }, "dependencies": { "agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "requires": { - "debug": "^4.3.4" - } + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true } } }, @@ -31183,9 +31105,9 @@ "dev": true }, "source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true }, "source-map-loader": { @@ -31217,16 +31139,10 @@ } } }, - "spawn-command": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", - "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", - "dev": true - }, "spawnd": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-9.0.2.tgz", - "integrity": "sha512-nl8DVHEDQ57IcKakzpjanspVChkMpGLuVwMR/eOn9cXE55Qr6luD2Kn06sA0ootRMdgrU4tInN6lA6ohTNvysw==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-10.1.4.tgz", + "integrity": "sha512-drqHc0mKJmtMsiGMOCwzlc5eZ0RPtRvT7tQAluW2A0qUc0G7TQ8KLcn3E6K5qzkLkH2UkS3nYQiVGULvvsD9dw==", "dev": true, "requires": { "signal-exit": "^4.1.0", @@ -31356,9 +31272,9 @@ } }, "streamx": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", - "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.1.tgz", + "integrity": "sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==", "dev": true, "requires": { "bare-events": "^2.2.0", @@ -31514,12 +31430,6 @@ "escape-string-regexp": "^1.0.2" } }, - "style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", - "dev": true - }, "stylehacks": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.1.tgz", @@ -31531,57 +31441,113 @@ } }, "stylelint": { - "version": "14.16.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz", - "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==", + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.11.0.tgz", + "integrity": "sha512-zrl4IrKmjJQ+h9FoMp69UMCq5SxeHk0URhxUBj4d3ISzo/DplOFBJZc7t7Dr6otB+1bfbbKNLOmCDpzKSlW+Nw==", "dev": true, "requires": { - "@csstools/selector-specificity": "^2.0.2", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2", + "@csstools/selector-specificity": "^5.0.0", + "@dual-bundle/import-meta-resolve": "^4.1.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", - "cosmiconfig": "^7.1.0", - "css-functions-list": "^3.1.0", - "debug": "^4.3.4", - "fast-glob": "^3.2.12", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.3", + "css-tree": "^3.0.1", + "debug": "^4.3.7", + "fast-glob": "^3.3.2", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^9.1.0", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", - "html-tags": "^3.2.0", - "ignore": "^5.2.1", - "import-lazy": "^4.0.0", + "html-tags": "^3.3.1", + "ignore": "^6.0.2", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.26.0", + "known-css-properties": "^0.35.0", "mathml-tag-names": "^2.1.3", - "meow": "^9.0.0", - "micromatch": "^4.0.5", + "meow": "^13.2.0", + "micromatch": "^4.0.8", "normalize-path": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.19", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.11", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "style-search": "^0.1.0", - "supports-hyperlinks": "^2.3.0", + "supports-hyperlinks": "^3.1.0", "svg-tags": "^1.0.0", - "table": "^6.8.1", - "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^4.0.2" + "table": "^6.8.2", + "write-file-atomic": "^5.0.1" }, "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "balanced-match": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", "dev": true }, + "cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "requires": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + } + }, + "css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "requires": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + } + }, + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "file-entry-cache": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", + "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==", + "dev": true, + "requires": { + "flat-cache": "^5.0.0" + } + }, + "flat-cache": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", + "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", + "dev": true, + "requires": { + "flatted": "^3.3.1", + "keyv": "^4.5.4" + } + }, "global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", @@ -31603,22 +31569,84 @@ } }, "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", + "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", "dev": true }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, + "mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true + }, + "meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + } } } }, @@ -31667,9 +31695,9 @@ } }, "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", + "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", "dev": true, "requires": { "has-flag": "^4.0.0", @@ -31734,9 +31762,9 @@ } }, "table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, "requires": { "ajv": "^8.0.1", @@ -31747,15 +31775,15 @@ }, "dependencies": { "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" } }, "json-schema-traverse": { @@ -31766,15 +31794,6 @@ } } }, - "tannin": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tannin/-/tannin-1.2.0.tgz", - "integrity": "sha512-U7GgX/RcSeUETbV7gYgoz8PD7Ni4y95pgIP/Z6ayI3CfhSujwKEBlGFTCRN+Aqnuyf4AN2yHL+L8x+TCGjb9uA==", - "dev": true, - "requires": { - "@tannin/plural-forms": "^1.1.0" - } - }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -31782,34 +31801,32 @@ "dev": true }, "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", "dev": true, "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0", "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "tar-stream": "^3.1.5" } }, "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", "dev": true, "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" } }, "terser": { - "version": "5.19.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", - "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.3", @@ -31827,16 +31844,57 @@ } }, "terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", + "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "dependencies": { + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + } } }, "test-exclude": { @@ -31872,9 +31930,9 @@ "dev": true }, "third-party-web": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.23.4.tgz", - "integrity": "sha512-kwYnSZRhEvv0SBW2fp8SBBKRglMoBjV8xz6C31m0ewqOtknB5UL+Ihg+M81hyFY5ldkZuGWPb+e4GVDkzf/gYg==", + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.26.2.tgz", + "integrity": "sha512-taJ0Us0lKoYBqcbccMuDElSUPOxmBfwlHe1OkHQ3KFf+RwovvBHdXhbFk9XJVQE2vHzxbTwvwg5GFsT9hbDokQ==", "dev": true }, "through": { @@ -31889,18 +31947,27 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "tldts-core": { + "version": "6.1.67", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.67.tgz", + "integrity": "sha512-12K5O4m3uUW6YM5v45Z7wc6NTSmAYj4Tq3de7eXghZkp879IlfPJrUWeWFwu1FS94U5t2vwETgJ1asu8UGNKVQ==", + "dev": true + }, + "tldts-icann": { + "version": "6.1.67", + "resolved": "https://registry.npmjs.org/tldts-icann/-/tldts-icann-6.1.67.tgz", + "integrity": "sha512-CJLFTYBgbnkP6nB8rqSYzd1oyWbM02SeQx9hrEpB6fTjx2+5FJ1lSkovxIWCjMgvzE7Nv54LCrf3lVW0zhupxQ==", + "dev": true, + "requires": { + "tldts-core": "^6.1.67" + } + }, "tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -32105,6 +32172,12 @@ "possible-typed-array-names": "^1.0.0" } }, + "typed-query-selector": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", + "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "dev": true + }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -32198,13 +32271,13 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "requires": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" } }, "upper-case": { @@ -32255,6 +32328,12 @@ "requires-port": "^1.0.0" } }, + "urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "dev": true + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -32273,12 +32352,6 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "v8-to-istanbul": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", @@ -32325,13 +32398,13 @@ } }, "wait-on": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", - "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.1.tgz", + "integrity": "sha512-1wWQOyR2LVVtaqrcIL2+OM+x7bkpmzVROa0Nf6FryXkS+er5Sa1kzFGjzZRqLnHa3n1rACFLeTwUqE1ETL9Mig==", "dev": true, "requires": { - "axios": "^1.6.1", - "joi": "^17.11.0", + "axios": "^1.7.7", + "joi": "^17.13.3", "lodash": "^4.17.21", "minimist": "^1.2.8", "rxjs": "^7.8.1" @@ -32347,9 +32420,9 @@ } }, "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -32366,9 +32439,9 @@ } }, "web-vitals": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-3.5.2.tgz", - "integrity": "sha512-c0rhqNcHXRkY/ogGDJQxZ9Im9D19hDihbzSQJrsioex+KnFgmMzBiy57Z1EjkhX/+OjyBpclDCzz2ITtjokFmg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", + "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", "dev": true }, "webidl-conversions": { @@ -32378,34 +32451,33 @@ "dev": true }, "webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" } }, @@ -32476,41 +32548,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -32753,9 +32790,9 @@ } }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -32850,21 +32887,6 @@ "requires": { "color-convert": "^2.0.1" } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true } } }, @@ -32885,9 +32907,9 @@ } }, "ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true }, "xdg-basedir": { @@ -32970,6 +32992,12 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true + }, + "zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "dev": true } } } diff --git a/src/wp-content/themes/twentytwenty/package.json b/src/wp-content/themes/twentytwenty/package.json index 58f600ee5f29d..d0e3942cb15d2 100644 --- a/src/wp-content/themes/twentytwenty/package.json +++ b/src/wp-content/themes/twentytwenty/package.json @@ -10,6 +10,10 @@ "TwentyTwenty" ], "homepage": "https://wordpress.org/themes/twentytwenty/", + "repository": { + "type": "svn", + "url": "https://develop.svn.wordpress.org/trunk" + }, "bugs": { "url": "https://core.trac.wordpress.org/" }, @@ -18,13 +22,13 @@ "npm": ">=9.8.1" }, "devDependencies": { - "@wordpress/browserslist-config": "^6.1.0", - "@wordpress/scripts": "^28.1.0", - "autoprefixer": "^10.4.19", - "concurrently": "^8.2.2", - "postcss": "^8.4.38", + "@wordpress/browserslist-config": "^6.14.0", + "@wordpress/scripts": "^30.7.0", + "autoprefixer": "^10.4.20", + "concurrently": "^9.1.0", + "postcss": "^8.4.49", "postcss-cli": "^11.0.0", - "rtlcss": "^4.1.1", + "rtlcss": "^4.3.0", "stylelint-a11y": "^1.2.3" }, "browserslist": [ diff --git a/src/wp-content/themes/twentytwentyone/package-lock.json b/src/wp-content/themes/twentytwentyone/package-lock.json index 100300dcca9d9..703e5300ffed0 100644 --- a/src/wp-content/themes/twentytwentyone/package-lock.json +++ b/src/wp-content/themes/twentytwentyone/package-lock.json @@ -9,28 +9,28 @@ "version": "2.4.0", "license": "GPL-2.0-or-later", "devDependencies": { - "@wordpress/browserslist-config": "^6.1.0", + "@wordpress/browserslist-config": "^6.14.0", "@wordpress/eslint-plugin": "^17.4.0", "@wordpress/stylelint-config": "^21.30.0", - "autoprefixer": "^10.4.19", + "autoprefixer": "^10.4.20", "chokidar-cli": "^3.0.0", "eslint": "^8.55.0", "minimist": "^1.2.8", "npm-run-all": "^4.1.5", - "postcss": "^8.4.38", - "postcss-calc": "^10.0.0", + "postcss": "^8.4.49", + "postcss-calc": "^10.0.2", "postcss-cli": "^11.0.0", "postcss-css-variables": "^0.19.0", - "postcss-custom-media": "^10.0.6", - "postcss-discard-duplicates": "^7.0.0", + "postcss-custom-media": "^11.0.5", + "postcss-discard-duplicates": "^7.0.1", "postcss-discard-empty": "^7.0.0", - "postcss-focus-within": "^8.0.1", - "postcss-merge-rules": "^7.0.2", - "postcss-nested": "^6.0.0", - "rtlcss": "^4.0.0", - "sass": "^1.77.6", + "postcss-focus-within": "^9.0.1", + "postcss-merge-rules": "^7.0.4", + "postcss-nested": "^7.0.2", + "rtlcss": "^4.3.0", + "sass": "^1.83.0", "stylelint": "^14.16.1", - "stylelint-config-recommended-scss": "^14.0.0" + "stylelint-config-recommended-scss": "^14.1.0" }, "engines": { "node": ">=20.10.0", @@ -1959,9 +1959,9 @@ } }, "node_modules/@csstools/cascade-layer-name-parser": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.11.tgz", - "integrity": "sha512-yhsonEAhaWRQvHFYhSzOUobH2Ev++fMci+ppFRagw0qVSPlcPV4FnNmlwpM/b2BM10ZeMRkVV4So6YRswD0O0w==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.4.tgz", + "integrity": "sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA==", "dev": true, "funding": [ { @@ -1973,18 +1973,19 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.3", - "@csstools/css-tokenizer": "^2.3.1" + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.3.tgz", - "integrity": "sha512-xI/tL2zxzEbESvnSxwFgwvy5HS00oCXxL4MLs6HUiDcYfwowsoQaABKxUElp1ARITrINzBnsECOc1q0eg2GOrA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", "dev": true, "funding": [ { @@ -1996,17 +1997,18 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.3.1" + "@csstools/css-tokenizer": "^3.0.3" } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.3.1.tgz", - "integrity": "sha512-iMNHTyxLbBlWIfGtabT157LH9DUx9X8+Y3oymFEuMj8HNc+rpE3dPFGFgHjpKfjeFDjLjYIAIhXPGvS2lKxL9g==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", "dev": true, "funding": [ { @@ -2018,14 +2020,15 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" } }, "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.11.tgz", - "integrity": "sha512-uox5MVhvNHqitPP+SynrB1o8oPxPMt2JLgp5ghJOWf54WGQ5OKu47efne49r1SWqs3wRP8xSWjnO9MBKxhB1dA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", + "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", "dev": true, "funding": [ { @@ -2037,12 +2040,13 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.3", - "@csstools/css-tokenizer": "^2.3.1" + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" } }, "node_modules/@csstools/selector-specificity": { @@ -2050,6 +2054,7 @@ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", "dev": true, + "license": "CC0-1.0", "engines": { "node": "^14 || ^16 || >=18" }, @@ -2259,6 +2264,316 @@ "node": ">= 8" } }, + "node_modules/@parcel/watcher": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", + "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.0", + "@parcel/watcher-darwin-arm64": "2.5.0", + "@parcel/watcher-darwin-x64": "2.5.0", + "@parcel/watcher-freebsd-x64": "2.5.0", + "@parcel/watcher-linux-arm-glibc": "2.5.0", + "@parcel/watcher-linux-arm-musl": "2.5.0", + "@parcel/watcher-linux-arm64-glibc": "2.5.0", + "@parcel/watcher-linux-arm64-musl": "2.5.0", + "@parcel/watcher-linux-x64-glibc": "2.5.0", + "@parcel/watcher-linux-x64-musl": "2.5.0", + "@parcel/watcher-win32-arm64": "2.5.0", + "@parcel/watcher-win32-ia32": "2.5.0", + "@parcel/watcher-win32-x64": "2.5.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", + "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", + "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", + "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", + "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", + "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", + "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", + "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", + "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", + "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", + "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", + "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", + "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", + "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/@pkgr/utils": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", @@ -2307,13 +2622,15 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -2579,10 +2896,11 @@ } }, "node_modules/@wordpress/browserslist-config": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.1.0.tgz", - "integrity": "sha512-cf5iwPq6JetQjiaRwlvzW5eX0S3OphVmy1YTxHQdrVqp79rOGvamVftxqvmf3C/GSRaNyI4eZV+nNwNRN0DkrQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.14.0.tgz", + "integrity": "sha512-a26hxY8R/A7FH/Z8oZsYS31ZC/Xy9QSBTi5w84MKSeYdWlck7t1QdCwUNF1u621wbuP7beiiu9FkYY4hI3Bk9A==", "dev": true, + "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", "npm": ">=8.19.2" @@ -3309,6 +3627,7 @@ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3324,14 +3643,15 @@ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "funding": [ { @@ -3347,12 +3667,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -3487,9 +3808,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "dev": true, "funding": [ { @@ -3505,11 +3826,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -3581,6 +3903,7 @@ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, + "license": "MIT", "dependencies": { "camelcase": "^5.3.1", "map-obj": "^4.0.0", @@ -3606,9 +3929,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001636", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", - "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "version": "1.0.30001689", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001689.tgz", + "integrity": "sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==", "dev": true, "funding": [ { @@ -3623,7 +3946,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "2.4.2", @@ -3784,10 +4108,11 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3798,14 +4123,29 @@ } }, "node_modules/css-functions-list": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz", - "integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12 || >=16" } }, + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -3837,12 +4177,13 @@ "dev": true }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3867,6 +4208,7 @@ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, + "license": "MIT", "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -3883,6 +4225,7 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3960,6 +4303,20 @@ "node": ">= 0.6.0" } }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -3985,10 +4342,11 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.810", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.810.tgz", - "integrity": "sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ==", - "dev": true + "version": "1.5.74", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.74.tgz", + "integrity": "sha512-ck3//9RC+6oss/1Bh9tiAVFy5vfSKbRHAFh7Z3/eTRkEqJeWgymloShB17Vg3Z4nmDNp35vAd1BZ6CMW4Wt6Iw==", + "dev": true, + "license": "ISC" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -4058,10 +4416,11 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -5021,6 +5380,13 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -5090,10 +5456,11 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true, + "license": "ISC" }, "node_modules/fraction.js": { "version": "4.3.7", @@ -5387,6 +5754,7 @@ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -5509,10 +5877,11 @@ } }, "node_modules/immutable": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", - "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==", - "dev": true + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "dev": true, + "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -5535,6 +5904,7 @@ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5553,6 +5923,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5841,6 +6212,7 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6147,10 +6519,11 @@ } }, "node_modules/known-css-properties": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", - "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", - "dev": true + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", + "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", + "dev": true, + "license": "MIT" }, "node_modules/language-subtag-registry": { "version": "0.3.21", @@ -6267,7 +6640,8 @@ "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", @@ -6304,6 +6678,7 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -6321,6 +6696,13 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -6335,6 +6717,7 @@ "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/minimist": "^1.2.0", "camelcase-keys": "^6.2.2", @@ -6361,6 +6744,7 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -6373,6 +6757,7 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -6383,23 +6768,12 @@ "node": ">=10" } }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/meow/node_modules/yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -6420,12 +6794,13 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -6449,6 +6824,7 @@ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -6479,6 +6855,7 @@ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, + "license": "MIT", "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -6489,15 +6866,16 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, "funding": [ { @@ -6505,6 +6883,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -6524,11 +6903,20 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" }, "node_modules/normalize-package-data": { "version": "2.5.0", @@ -6595,10 +6983,11 @@ } }, "node_modules/npm-run-all/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, + "license": "MIT", "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -7575,10 +7964,11 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -7614,9 +8004,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "funding": [ { @@ -7632,22 +8022,24 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-calc": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.0.tgz", - "integrity": "sha512-OmjhudoNTP0QleZCwl1i6NeBwN+5MZbY5ersLZz69mjJiDVv/p57RjRuKDkHeDWr4T+S97wQfsqRTNoDHB2e3g==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.2.tgz", + "integrity": "sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==", "dev": true, + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.16", + "postcss-selector-parser": "^6.1.2", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -7657,6 +8049,20 @@ "postcss": "^8.4.38" } }, + "node_modules/postcss-calc/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-cli": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-11.0.0.tgz", @@ -7907,9 +8313,9 @@ } }, "node_modules/postcss-custom-media": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.6.tgz", - "integrity": "sha512-BjihQoIO4Wjqv9fQNExSJIim8UAmkhLxuJnhJsLTRFSba1y1MhxkJK5awsM//6JJ+/Tu5QUxf624RQAvKHv6SA==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.5.tgz", + "integrity": "sha512-SQHhayVNgDvSAdX9NQ/ygcDQGEY+aSF4b/96z7QUX6mqL5yl/JgG/DywcF6fW9XbnCRE+aVYk+9/nqGuzOPWeQ==", "dev": true, "funding": [ { @@ -7921,24 +8327,26 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.11", - "@csstools/css-parser-algorithms": "^2.6.3", - "@csstools/css-tokenizer": "^2.3.1", - "@csstools/media-query-list-parser": "^2.1.11" + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-discard-duplicates": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.0.tgz", - "integrity": "sha512-bAnSuBop5LpAIUmmOSsuvtKAAKREB6BBIYStWUTGq8oG5q9fClDMMuY8i4UPI/cEcDx2TN+7PMnXYIId20UVDw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz", + "integrity": "sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==", "dev": true, + "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, @@ -7959,9 +8367,9 @@ } }, "node_modules/postcss-focus-within": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-8.0.1.tgz", - "integrity": "sha512-NFU3xcY/xwNaapVb+1uJ4n23XImoC86JNwkY/uduytSl2s9Ekc2EpzmRR63+ExitnW3Mab3Fba/wRPCT5oDILA==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", "dev": true, "funding": [ { @@ -7973,16 +8381,31 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { - "postcss-selector-parser": "^6.0.13" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, + "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-load-config": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz", @@ -8041,15 +8464,16 @@ "dev": true }, "node_modules/postcss-merge-rules": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.2.tgz", - "integrity": "sha512-VAR47UNvRsdrTHLe7TV1CeEtF9SJYR5ukIB9U4GZyZOptgtsS20xSxy+k5wMrI3udST6O1XuIn7cjQkg7sDAAw==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.4.tgz", + "integrity": "sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==", "dev": true, + "license": "MIT", "dependencies": { - "browserslist": "^4.23.1", + "browserslist": "^4.23.3", "caniuse-api": "^3.0.0", "cssnano-utils": "^5.0.0", - "postcss-selector-parser": "^6.1.0" + "postcss-selector-parser": "^6.1.2" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" @@ -8058,23 +8482,58 @@ "postcss": "^8.4.31" } }, + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-7.0.2.tgz", + "integrity": "sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nested/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dev": true, + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.11" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" + "node": ">=4" } }, "node_modules/postcss-reporter": { @@ -8098,16 +8557,18 @@ } }, "node_modules/postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", - "dev": true + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true, + "license": "MIT" }, "node_modules/postcss-safe-parser": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.0" }, @@ -8239,6 +8700,7 @@ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -8298,6 +8760,7 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", @@ -8315,6 +8778,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -8328,6 +8792,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -8340,6 +8805,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -8352,6 +8818,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -8361,6 +8828,7 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, + "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", @@ -8376,6 +8844,17 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } @@ -8409,6 +8888,7 @@ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, + "license": "MIT", "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" @@ -8546,6 +9026,7 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8613,10 +9094,11 @@ } }, "node_modules/rtlcss": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", - "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", "dev": true, + "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0", @@ -8758,13 +9240,14 @@ } }, "node_modules/sass": { - "version": "1.77.6", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", - "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.0.tgz", + "integrity": "sha512-qsSxlayzoOjdvXMVLkzF84DJFc2HZEL/rFyGIKbbilYtAvlCxyuzUeff9LawTn4btVnLKg75Z8MMr1lxU1lfGw==", "dev": true, + "license": "MIT", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", + "chokidar": "^4.0.0", + "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { @@ -8772,6 +9255,39 @@ }, "engines": { "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.2.tgz", + "integrity": "sha512-/b57FK+bblSU+dfewfFe0rT1YjVDfOmeLQwCAuC+vwvgLkXboATqqmy+Ipux6JrF6L5joe5CBnFOw+gLWH6yKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/semver": { @@ -8870,6 +9386,7 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -8887,6 +9404,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8902,6 +9420,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -8913,22 +9432,25 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -9233,6 +9755,7 @@ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, + "license": "MIT", "dependencies": { "min-indent": "^1.0.0" }, @@ -9256,13 +9779,15 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/stylelint": { "version": "14.16.1", "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz", "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==", "dev": true, + "license": "MIT", "dependencies": { "@csstools/selector-specificity": "^2.0.2", "balanced-match": "^2.0.0", @@ -9324,21 +9849,22 @@ } }, "node_modules/stylelint-config-recommended-scss": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.0.0.tgz", - "integrity": "sha512-HDvpoOAQ1RpF+sPbDOT2Q2/YrBDEJDnUymmVmZ7mMCeNiFSdhRdyGEimBkz06wsN+HaFwUh249gDR+I9JR7Onw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.1.0.tgz", + "integrity": "sha512-bhaMhh1u5dQqSsf6ri2GVWWQW5iUjBYgcHkh7SgDDn92ijoItC/cfO/W+fpXshgTQWhwFkP1rVcewcv4jaftRg==", "dev": true, + "license": "MIT", "dependencies": { "postcss-scss": "^4.0.9", - "stylelint-config-recommended": "^14.0.0", - "stylelint-scss": "^6.0.0" + "stylelint-config-recommended": "^14.0.1", + "stylelint-scss": "^6.4.0" }, "engines": { "node": ">=18.12.0" }, "peerDependencies": { "postcss": "^8.3.3", - "stylelint": "^16.0.2" + "stylelint": "^16.6.1" }, "peerDependenciesMeta": { "postcss": { @@ -9369,15 +9895,19 @@ } }, "node_modules/stylelint-scss": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.3.2.tgz", - "integrity": "sha512-pNk9mXOVKkQtd+SROPC9io8ISSgX+tOVPhFdBE+LaKQnJMLdWPbGKAGYv4Wmf/RrnOjkutunNTN9kKMhkdE5qA==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.10.0.tgz", + "integrity": "sha512-y03if6Qw9xBMoVaf7tzp5BbnYhYvudIKzURkhSHzcHG0bW0fAYvQpTUVJOe7DyhHaxeThBil4ObEMvGbV7+M+w==", "dev": true, + "license": "MIT", "dependencies": { - "known-css-properties": "^0.31.0", + "css-tree": "^3.0.1", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.35.0", + "mdn-data": "^2.12.2", "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-selector-parser": "^6.1.0", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -9387,11 +9917,19 @@ "stylelint": "^16.0.2" } }, - "node_modules/stylelint-scss/node_modules/known-css-properties": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.31.0.tgz", - "integrity": "sha512-sBPIUGTNF0czz0mwGGUoKKJC8Q7On1GPbCSFPfyEsfHb2DyBG0Y4QtV+EVWpINSaiGKZblDNuF5AezxSgOhesQ==", - "dev": true + "node_modules/stylelint-scss/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } }, "node_modules/stylelint/node_modules/ansi-regex": { "version": "5.0.1", @@ -9423,6 +9961,13 @@ "node": ">=8" } }, + "node_modules/stylelint/node_modules/known-css-properties": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", + "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", + "dev": true, + "license": "MIT" + }, "node_modules/stylelint/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -9475,6 +10020,7 @@ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -9488,6 +10034,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9497,6 +10044,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9539,10 +10087,11 @@ } }, "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -9555,15 +10104,16 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -9575,6 +10125,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9583,13 +10134,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/table/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9598,13 +10151,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/table/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -9619,6 +10174,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -9676,6 +10232,7 @@ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9744,12 +10301,16 @@ } }, "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/unbox-primitive": { @@ -9877,9 +10438,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -9895,9 +10456,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -9925,7 +10487,8 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/validate-npm-package-license": { "version": "3.0.4", @@ -9999,6 +10562,7 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -11445,27 +12009,27 @@ } }, "@csstools/cascade-layer-name-parser": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.11.tgz", - "integrity": "sha512-yhsonEAhaWRQvHFYhSzOUobH2Ev++fMci+ppFRagw0qVSPlcPV4FnNmlwpM/b2BM10ZeMRkVV4So6YRswD0O0w==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.4.tgz", + "integrity": "sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA==", "dev": true }, "@csstools/css-parser-algorithms": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.3.tgz", - "integrity": "sha512-xI/tL2zxzEbESvnSxwFgwvy5HS00oCXxL4MLs6HUiDcYfwowsoQaABKxUElp1ARITrINzBnsECOc1q0eg2GOrA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", "dev": true }, "@csstools/css-tokenizer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.3.1.tgz", - "integrity": "sha512-iMNHTyxLbBlWIfGtabT157LH9DUx9X8+Y3oymFEuMj8HNc+rpE3dPFGFgHjpKfjeFDjLjYIAIhXPGvS2lKxL9g==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", "dev": true }, "@csstools/media-query-list-parser": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.11.tgz", - "integrity": "sha512-uox5MVhvNHqitPP+SynrB1o8oPxPMt2JLgp5ghJOWf54WGQ5OKu47efne49r1SWqs3wRP8xSWjnO9MBKxhB1dA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", + "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", "dev": true }, "@csstools/selector-specificity": { @@ -11619,6 +12183,123 @@ "fastq": "^1.6.0" } }, + "@parcel/watcher": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", + "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "dev": true, + "optional": true, + "requires": { + "@parcel/watcher-android-arm64": "2.5.0", + "@parcel/watcher-darwin-arm64": "2.5.0", + "@parcel/watcher-darwin-x64": "2.5.0", + "@parcel/watcher-freebsd-x64": "2.5.0", + "@parcel/watcher-linux-arm-glibc": "2.5.0", + "@parcel/watcher-linux-arm-musl": "2.5.0", + "@parcel/watcher-linux-arm64-glibc": "2.5.0", + "@parcel/watcher-linux-arm64-musl": "2.5.0", + "@parcel/watcher-linux-x64-glibc": "2.5.0", + "@parcel/watcher-linux-x64-musl": "2.5.0", + "@parcel/watcher-win32-arm64": "2.5.0", + "@parcel/watcher-win32-ia32": "2.5.0", + "@parcel/watcher-win32-x64": "2.5.0", + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + } + }, + "@parcel/watcher-android-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", + "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "dev": true, + "optional": true + }, + "@parcel/watcher-darwin-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", + "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "dev": true, + "optional": true + }, + "@parcel/watcher-darwin-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", + "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-freebsd-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", + "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", + "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", + "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", + "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", + "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-x64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", + "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-x64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", + "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-win32-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", + "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "dev": true, + "optional": true + }, + "@parcel/watcher-win32-ia32": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", + "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-win32-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", + "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "dev": true, + "optional": true + }, "@pkgr/utils": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", @@ -11824,9 +12505,9 @@ } }, "@wordpress/browserslist-config": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.1.0.tgz", - "integrity": "sha512-cf5iwPq6JetQjiaRwlvzW5eX0S3OphVmy1YTxHQdrVqp79rOGvamVftxqvmf3C/GSRaNyI4eZV+nNwNRN0DkrQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.14.0.tgz", + "integrity": "sha512-a26hxY8R/A7FH/Z8oZsYS31ZC/Xy9QSBTi5w84MKSeYdWlck7t1QdCwUNF1u621wbuP7beiiu9FkYY4hI3Bk9A==", "dev": true }, "@wordpress/eslint-plugin": { @@ -12355,16 +13036,16 @@ "dev": true }, "autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "requires": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" } }, @@ -12465,15 +13146,15 @@ } }, "browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" } }, "builtin-modules": { @@ -12537,9 +13218,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001636", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", - "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "version": "1.0.30001689", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001689.tgz", + "integrity": "sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==", "dev": true }, "chalk": { @@ -12666,9 +13347,9 @@ } }, "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -12677,11 +13358,21 @@ } }, "css-functions-list": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz", - "integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", "dev": true }, + "css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "requires": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + } + }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -12701,12 +13392,12 @@ "dev": true }, "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.3" } }, "decamelize": { @@ -12782,6 +13473,13 @@ "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", "dev": true }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "optional": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -12801,9 +13499,9 @@ } }, "electron-to-chromium": { - "version": "1.4.810", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.810.tgz", - "integrity": "sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ==", + "version": "1.5.74", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.74.tgz", + "integrity": "sha512-ck3//9RC+6oss/1Bh9tiAVFy5vfSKbRHAFh7Z3/eTRkEqJeWgymloShB17Vg3Z4nmDNp35vAd1BZ6CMW4Wt6Iw==", "dev": true }, "emoji-regex": { @@ -12862,9 +13560,9 @@ } }, "escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, "escape-string-regexp": { @@ -13536,6 +14234,12 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true + }, "fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -13590,9 +14294,9 @@ } }, "flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", "dev": true }, "fraction.js": { @@ -13886,9 +14590,9 @@ "dev": true }, "immutable": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", - "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", "dev": true }, "import-fresh": { @@ -14349,9 +15053,9 @@ "dev": true }, "known-css-properties": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", - "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", + "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", "dev": true }, "language-subtag-registry": { @@ -14491,6 +15195,12 @@ "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", "dev": true }, + "mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true + }, "memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -14538,12 +15248,6 @@ "validate-npm-package-license": "^3.0.1" } }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - }, "yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", @@ -14565,12 +15269,12 @@ "dev": true }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, @@ -14613,15 +15317,15 @@ } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true }, "natural-compare": { @@ -14636,10 +15340,17 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "optional": true + }, "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true }, "normalize-package-data": { @@ -14692,9 +15403,9 @@ }, "dependencies": { "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, "requires": { "nice-try": "^1.0.4", @@ -15395,9 +16106,9 @@ "dev": true }, "picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "picomatch": { @@ -15419,24 +16130,36 @@ "dev": true }, "postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "requires": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" } }, "postcss-calc": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.0.tgz", - "integrity": "sha512-OmjhudoNTP0QleZCwl1i6NeBwN+5MZbY5ersLZz69mjJiDVv/p57RjRuKDkHeDWr4T+S97wQfsqRTNoDHB2e3g==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.2.tgz", + "integrity": "sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.16", + "postcss-selector-parser": "^6.1.2", "postcss-value-parser": "^4.2.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } } }, "postcss-cli": { @@ -15616,21 +16339,21 @@ } }, "postcss-custom-media": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.6.tgz", - "integrity": "sha512-BjihQoIO4Wjqv9fQNExSJIim8UAmkhLxuJnhJsLTRFSba1y1MhxkJK5awsM//6JJ+/Tu5QUxf624RQAvKHv6SA==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.5.tgz", + "integrity": "sha512-SQHhayVNgDvSAdX9NQ/ygcDQGEY+aSF4b/96z7QUX6mqL5yl/JgG/DywcF6fW9XbnCRE+aVYk+9/nqGuzOPWeQ==", "dev": true, "requires": { - "@csstools/cascade-layer-name-parser": "^1.0.11", - "@csstools/css-parser-algorithms": "^2.6.3", - "@csstools/css-tokenizer": "^2.3.1", - "@csstools/media-query-list-parser": "^2.1.11" + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" } }, "postcss-discard-duplicates": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.0.tgz", - "integrity": "sha512-bAnSuBop5LpAIUmmOSsuvtKAAKREB6BBIYStWUTGq8oG5q9fClDMMuY8i4UPI/cEcDx2TN+7PMnXYIId20UVDw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz", + "integrity": "sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==", "dev": true }, "postcss-discard-empty": { @@ -15640,12 +16363,24 @@ "dev": true }, "postcss-focus-within": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-8.0.1.tgz", - "integrity": "sha512-NFU3xcY/xwNaapVb+1uJ4n23XImoC86JNwkY/uduytSl2s9Ekc2EpzmRR63+ExitnW3Mab3Fba/wRPCT5oDILA==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.13" + "postcss-selector-parser": "^7.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } } }, "postcss-load-config": { @@ -15673,24 +16408,48 @@ "dev": true }, "postcss-merge-rules": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.2.tgz", - "integrity": "sha512-VAR47UNvRsdrTHLe7TV1CeEtF9SJYR5ukIB9U4GZyZOptgtsS20xSxy+k5wMrI3udST6O1XuIn7cjQkg7sDAAw==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.4.tgz", + "integrity": "sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==", "dev": true, "requires": { - "browserslist": "^4.23.1", + "browserslist": "^4.23.3", "caniuse-api": "^3.0.0", "cssnano-utils": "^5.0.0", - "postcss-selector-parser": "^6.1.0" + "postcss-selector-parser": "^6.1.2" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } } }, "postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-7.0.2.tgz", + "integrity": "sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.11" + "postcss-selector-parser": "^7.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } } }, "postcss-reporter": { @@ -15704,9 +16463,9 @@ } }, "postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", "dev": true }, "postcss-safe-parser": { @@ -15905,6 +16664,12 @@ "dev": true } } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true } } }, @@ -16078,9 +16843,9 @@ } }, "rtlcss": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", - "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -16169,14 +16934,32 @@ } }, "sass": { - "version": "1.77.6", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", - "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.0.tgz", + "integrity": "sha512-qsSxlayzoOjdvXMVLkzF84DJFc2HZEL/rFyGIKbbilYtAvlCxyuzUeff9LawTn4btVnLKg75Z8MMr1lxU1lfGw==", "dev": true, "requires": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", + "@parcel/watcher": "^2.4.1", + "chokidar": "^4.0.0", + "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" + }, + "dependencies": { + "chokidar": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.2.tgz", + "integrity": "sha512-/b57FK+bblSU+dfewfFe0rT1YjVDfOmeLQwCAuC+vwvgLkXboATqqmy+Ipux6JrF6L5joe5CBnFOw+gLWH6yKg==", + "dev": true, + "requires": { + "readdirp": "^4.0.1" + } + }, + "readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true + } } }, "semver": { @@ -16295,9 +17078,9 @@ } }, "source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true }, "spdx-correct": { @@ -16615,6 +17398,12 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "known-css-properties": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", + "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", + "dev": true + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -16650,14 +17439,14 @@ "dev": true }, "stylelint-config-recommended-scss": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.0.0.tgz", - "integrity": "sha512-HDvpoOAQ1RpF+sPbDOT2Q2/YrBDEJDnUymmVmZ7mMCeNiFSdhRdyGEimBkz06wsN+HaFwUh249gDR+I9JR7Onw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.1.0.tgz", + "integrity": "sha512-bhaMhh1u5dQqSsf6ri2GVWWQW5iUjBYgcHkh7SgDDn92ijoItC/cfO/W+fpXshgTQWhwFkP1rVcewcv4jaftRg==", "dev": true, "requires": { "postcss-scss": "^4.0.9", - "stylelint-config-recommended": "^14.0.0", - "stylelint-scss": "^6.0.0" + "stylelint-config-recommended": "^14.0.1", + "stylelint-scss": "^6.4.0" }, "dependencies": { "stylelint-config-recommended": { @@ -16669,23 +17458,30 @@ } }, "stylelint-scss": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.3.2.tgz", - "integrity": "sha512-pNk9mXOVKkQtd+SROPC9io8ISSgX+tOVPhFdBE+LaKQnJMLdWPbGKAGYv4Wmf/RrnOjkutunNTN9kKMhkdE5qA==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.10.0.tgz", + "integrity": "sha512-y03if6Qw9xBMoVaf7tzp5BbnYhYvudIKzURkhSHzcHG0bW0fAYvQpTUVJOe7DyhHaxeThBil4ObEMvGbV7+M+w==", "dev": true, "requires": { - "known-css-properties": "^0.31.0", + "css-tree": "^3.0.1", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.35.0", + "mdn-data": "^2.12.2", "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-selector-parser": "^6.1.0", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0" }, "dependencies": { - "known-css-properties": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.31.0.tgz", - "integrity": "sha512-sBPIUGTNF0czz0mwGGUoKKJC8Q7On1GPbCSFPfyEsfHb2DyBG0Y4QtV+EVWpINSaiGKZblDNuF5AezxSgOhesQ==", - "dev": true + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } } } }, @@ -16748,9 +17544,9 @@ } }, "table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, "requires": { "ajv": "^8.0.1", @@ -16761,15 +17557,15 @@ }, "dependencies": { "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" } }, "ansi-regex": { @@ -16908,9 +17704,9 @@ } }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true }, "unbox-primitive": { @@ -17001,13 +17797,13 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "requires": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" } }, "uri-js": { diff --git a/src/wp-content/themes/twentytwentyone/package.json b/src/wp-content/themes/twentytwentyone/package.json index 077ba6396cfe3..f073b6c99bebc 100644 --- a/src/wp-content/themes/twentytwentyone/package.json +++ b/src/wp-content/themes/twentytwentyone/package.json @@ -17,28 +17,28 @@ "npm": ">=10.2.3" }, "devDependencies": { - "@wordpress/browserslist-config": "^6.1.0", + "@wordpress/browserslist-config": "^6.14.0", "@wordpress/eslint-plugin": "^17.4.0", "@wordpress/stylelint-config": "^21.30.0", - "autoprefixer": "^10.4.19", + "autoprefixer": "^10.4.20", "chokidar-cli": "^3.0.0", "eslint": "^8.55.0", "minimist": "^1.2.8", "npm-run-all": "^4.1.5", - "postcss": "^8.4.38", - "postcss-calc": "^10.0.0", + "postcss": "^8.4.49", + "postcss-calc": "^10.0.2", "postcss-cli": "^11.0.0", "postcss-css-variables": "^0.19.0", - "postcss-custom-media": "^10.0.6", - "postcss-discard-duplicates": "^7.0.0", + "postcss-custom-media": "^11.0.5", + "postcss-discard-duplicates": "^7.0.1", "postcss-discard-empty": "^7.0.0", - "postcss-focus-within": "^8.0.1", - "postcss-merge-rules": "^7.0.2", - "postcss-nested": "^6.0.0", - "rtlcss": "^4.0.0", - "sass": "^1.77.6", + "postcss-focus-within": "^9.0.1", + "postcss-merge-rules": "^7.0.4", + "postcss-nested": "^7.0.2", + "rtlcss": "^4.3.0", + "sass": "^1.83.0", "stylelint": "^14.16.1", - "stylelint-config-recommended-scss": "^14.0.0" + "stylelint-config-recommended-scss": "^14.1.0" }, "rtlcssConfig": { "options": { From c697356c29effcfa8115d852bc89385f7112c202 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Tue, 17 Dec 2024 17:20:35 +0000 Subject: [PATCH 117/323] Build/Test Tools: Document every matrix exclusion. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There should be inline documentation anytime a strategy matrix has an `exclude` combination configured so that contributors have proper context as to why it’s there. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59531 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/install-testing.yml | 4 ++++ .github/workflows/local-docker-environment.yml | 4 ++-- .github/workflows/phpunit-tests.yml | 2 +- .github/workflows/upgrade-testing.yml | 9 +++++++-- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/.github/workflows/install-testing.yml b/.github/workflows/install-testing.yml index ca03ebd518a00..f40f044586c88 100644 --- a/.github/workflows/install-testing.yml +++ b/.github/workflows/install-testing.yml @@ -78,15 +78,19 @@ jobs: # Exclude some PHP and MySQL versions that cannot currently be tested with Docker containers. exclude: + # There are no local WordPress Docker environment containers for PHP <= 5.3. - php: '5.2' - php: '5.3' + # MySQL containers <= 5.5 do not exist or fail to start properly. - db-version: '5.0' - db-version: '5.1' - db-version: '5.5' + # The PHP <= 7.3/MySQL 8.4 jobs currently fail due to mysql_native_password being disabled by default. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '8.4' - php: '7.3' db-version: '8.4' + # MySQL 9.0+ will not work on PHP 7.2 & 7.3. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '9.0' - php: '7.3' diff --git a/.github/workflows/local-docker-environment.yml b/.github/workflows/local-docker-environment.yml index 1e25c82ef1287..17d078198c009 100644 --- a/.github/workflows/local-docker-environment.yml +++ b/.github/workflows/local-docker-environment.yml @@ -88,9 +88,9 @@ jobs: db-version: ${{ fromJSON( needs.build-test-matrix.outputs.mysql-versions ) }} exclude: - # The MySQL 5.5 containers will not start. + # MySQL containers <= 5.5 do not exist or fail to start properly. - db-version: '5.5' - # MySQL 9.0+ will not work on PHP 7.2 & 7.3 + # MySQL 9.0+ will not work on PHP 7.2 & 7.3. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '9.0' - php: '7.3' diff --git a/.github/workflows/phpunit-tests.yml b/.github/workflows/phpunit-tests.yml index d5aa3fa3de5cd..3ea45fcdc331e 100644 --- a/.github/workflows/phpunit-tests.yml +++ b/.github/workflows/phpunit-tests.yml @@ -93,7 +93,7 @@ jobs: report: true exclude: - # MySQL 9.0+ will not work on PHP 7.2 & 7.3 + # MySQL 9.0+ will not work on PHP 7.2 & 7.3. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '9.0' - php: '7.3' diff --git a/.github/workflows/upgrade-testing.yml b/.github/workflows/upgrade-testing.yml index bfa94f3874e08..9ee2665b0bd6b 100644 --- a/.github/workflows/upgrade-testing.yml +++ b/.github/workflows/upgrade-testing.yml @@ -72,11 +72,12 @@ jobs: multisite: [ false, true ] exclude: + # The PHP <= 7.3/MySQL 8.4 jobs currently fail due to mysql_native_password being disabled by default. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '8.4' - php: '7.3' db-version: '8.4' - # MySQL 9.0+ will not work on PHP 7.2 & 7.3 + # MySQL 9.0+ will not work on PHP 7.2 & 7.3. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '9.1' - php: '7.3' @@ -108,6 +109,7 @@ jobs: multisite: [ false, true ] exclude: + # The PHP <= 7.3/MySQL 8.4 jobs currently fail due to mysql_native_password being disabled by default. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '8.4' - php: '7.3' @@ -137,6 +139,7 @@ jobs: multisite: [ false, true ] exclude: + # The PHP <= 7.3/MySQL 8.4 jobs currently fail due to mysql_native_password being disabled by default. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '8.4' - php: '7.3' @@ -195,6 +198,7 @@ jobs: multisite: [ false, true ] exclude: + # The PHP <= 7.3/MySQL 8.4 jobs currently fail due to mysql_native_password being disabled by default. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '8.4' - php: '7.3' @@ -254,11 +258,12 @@ jobs: multisite: [ false, true ] exclude: + # The PHP <= 7.3/MySQL 8.4 jobs currently fail due to mysql_native_password being disabled by default. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '8.4' - php: '7.3' db-version: '8.4' - # MySQL 9.0+ will not work on PHP 7.2 & 7.3 + # MySQL 9.0+ will not work on PHP 7.2 & 7.3. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '9.1' - php: '7.3' From 68c4efcd5729fbc1859f01f4a40928d5e33a0216 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Tue, 17 Dec 2024 23:56:28 +0000 Subject: [PATCH 118/323] Privacy: Use SHA-256 hashing algorithm for Gravatar. This aims to improve privacy by switching to a more secure algorithm, as an MD5 string can be reversed. Follow-up to [6748], [31107]. Props henry.wright, jucaduca, haozi, desrosj, dd32, SergeyBiryukov. See #60638. git-svn-id: https://develop.svn.wordpress.org/trunk@59532 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/link-template.php | 18 ++++++---- tests/phpunit/tests/avatar.php | 9 +++-- .../tests/rest-api/rest-schema-setup.php | 6 ++-- tests/qunit/fixtures/wp-api-generated.js | 36 +++++++++---------- 4 files changed, 38 insertions(+), 31 deletions(-) diff --git a/src/wp-includes/link-template.php b/src/wp-includes/link-template.php index 61798c379841b..a375b0ee06a4b 100644 --- a/src/wp-includes/link-template.php +++ b/src/wp-includes/link-template.php @@ -4289,7 +4289,7 @@ function the_shortlink( $text = '', $title = '', $before = '', $after = '' ) { * * @since 4.2.0 * - * @param mixed $id_or_email The avatar to retrieve a URL for. Accepts a user ID, Gravatar MD5 hash, + * @param mixed $id_or_email The avatar to retrieve a URL for. Accepts a user ID, Gravatar SHA-256 or MD5 hash, * user email, WP_User object, WP_Post object, or WP_Comment object. * @param array $args { * Optional. Arguments to use instead of the default arguments. @@ -4353,8 +4353,9 @@ function is_avatar_comment_type( $comment_type ) { * * @since 4.2.0 * @since 6.7.0 Gravatar URLs always use HTTPS. + * @since 6.8.0 Gravatar URLs use the SHA-256 hashing algorithm. * - * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash, + * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar SHA-256 or MD5 hash, * user email, WP_User object, WP_Post object, or WP_Comment object. * @param array $args { * Optional. Arguments to use instead of the default arguments. @@ -4474,7 +4475,7 @@ function get_avatar_data( $id_or_email, $args = null ) { * @since 4.2.0 * * @param array $args Arguments passed to get_avatar_data(), after processing. - * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash, + * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar SHA-256 or MD5 hash, * user email, WP_User object, WP_Post object, or WP_Comment object. */ $args = apply_filters( 'pre_get_avatar_data', $args, $id_or_email ); @@ -4496,7 +4497,10 @@ function get_avatar_data( $id_or_email, $args = null ) { if ( is_numeric( $id_or_email ) ) { $user = get_user_by( 'id', absint( $id_or_email ) ); } elseif ( is_string( $id_or_email ) ) { - if ( str_contains( $id_or_email, '@md5.gravatar.com' ) ) { + if ( str_contains( $id_or_email, '@sha256.gravatar.com' ) ) { + // SHA-256 hash. + list( $email_hash ) = explode( '@', $id_or_email ); + } else if ( str_contains( $id_or_email, '@md5.gravatar.com' ) ) { // MD5 hash. list( $email_hash ) = explode( '@', $id_or_email ); } else { @@ -4530,7 +4534,7 @@ function get_avatar_data( $id_or_email, $args = null ) { } if ( $email ) { - $email_hash = md5( strtolower( trim( $email ) ) ); + $email_hash = hash( 'sha256', strtolower( trim( $email ) ) ); } } @@ -4564,7 +4568,7 @@ function get_avatar_data( $id_or_email, $args = null ) { * @since 4.2.0 * * @param string $url The URL of the avatar. - * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash, + * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar SHA-256 or MD5 hash, * user email, WP_User object, WP_Post object, or WP_Comment object. * @param array $args Arguments passed to get_avatar_data(), after processing. */ @@ -4576,7 +4580,7 @@ function get_avatar_data( $id_or_email, $args = null ) { * @since 4.2.0 * * @param array $args Arguments passed to get_avatar_data(), after processing. - * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash, + * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar SHA-256 or MD5 hash, * user email, WP_User object, WP_Post object, or WP_Comment object. */ return apply_filters( 'get_avatar_data', $args, $id_or_email ); diff --git a/tests/phpunit/tests/avatar.php b/tests/phpunit/tests/avatar.php index 97f24841e372b..baec404c81285 100644 --- a/tests/phpunit/tests/avatar.php +++ b/tests/phpunit/tests/avatar.php @@ -11,7 +11,7 @@ class Tests_Avatar extends WP_UnitTestCase { */ public function test_get_avatar_url_gravatar_url() { $url = get_avatar_url( 1 ); - $this->assertSame( preg_match( '|^https?://secure.gravatar.com/avatar/[0-9a-f]{32}\?|', $url ), 1 ); + $this->assertSame( preg_match( '|^https?://secure.gravatar.com/avatar/[0-9a-f]{64}\?|', $url ), 1 ); } /** @@ -90,9 +90,12 @@ public function test_get_avatar_url_user() { $url2 = get_avatar_url( WP_TESTS_EMAIL ); $this->assertSame( $url, $url2 ); - $url2 = get_avatar_url( md5( WP_TESTS_EMAIL ) . '@md5.gravatar.com' ); + $url2 = get_avatar_url( hash( 'sha256', WP_TESTS_EMAIL ) . '@sha256.gravatar.com' ); $this->assertSame( $url, $url2 ); + $url2 = get_avatar_url( md5( WP_TESTS_EMAIL ) . '@md5.gravatar.com' ); + $this->assertSame( preg_match( '|^https?://secure.gravatar.com/avatar/[0-9a-f]{32}\?|', $url2 ), 1 ); + $user = get_user_by( 'id', 1 ); $url2 = get_avatar_url( $user ); $this->assertSame( $url, $url2 ); @@ -267,7 +270,7 @@ public function test_get_avatar_data_should_return_gravatar_url_when_input_avata $actual_data = get_avatar_data( $comment ); $this->assertTrue( is_avatar_comment_type( $comment_type ) ); - $this->assertMatchesRegularExpression( '|^https?://secure.gravatar.com/avatar/[0-9a-f]{32}\?|', $actual_data['url'] ); + $this->assertMatchesRegularExpression( '|^https?://secure.gravatar.com/avatar/[0-9a-f]{64}\?|', $actual_data['url'] ); } /** diff --git a/tests/phpunit/tests/rest-api/rest-schema-setup.php b/tests/phpunit/tests/rest-api/rest-schema-setup.php index 4d5c269357a68..03dcb0631f133 100644 --- a/tests/phpunit/tests/rest-api/rest-schema-setup.php +++ b/tests/phpunit/tests/rest-api/rest-schema-setup.php @@ -729,9 +729,9 @@ public function test_build_wp_api_client_fixtures() { 'TagModel.meta.test_multi' => array(), 'TagModel.meta.test_tag_meta' => '', 'UsersCollection.0.link' => 'http://example.org/?author=1', - 'UsersCollection.0.avatar_urls.24' => 'https://secure.gravatar.com/avatar/96614ec98aa0c0d2ee75796dced6df54?s=24&d=mm&r=g', - 'UsersCollection.0.avatar_urls.48' => 'https://secure.gravatar.com/avatar/96614ec98aa0c0d2ee75796dced6df54?s=48&d=mm&r=g', - 'UsersCollection.0.avatar_urls.96' => 'https://secure.gravatar.com/avatar/96614ec98aa0c0d2ee75796dced6df54?s=96&d=mm&r=g', + 'UsersCollection.0.avatar_urls.24' => 'https://secure.gravatar.com/avatar/9387ed9432ec25ef93df84b8a0b9697ddef435a945e7f244670c4f79f88363e9?s=24&d=mm&r=g', + 'UsersCollection.0.avatar_urls.48' => 'https://secure.gravatar.com/avatar/9387ed9432ec25ef93df84b8a0b9697ddef435a945e7f244670c4f79f88363e9?s=48&d=mm&r=g', + 'UsersCollection.0.avatar_urls.96' => 'https://secure.gravatar.com/avatar/9387ed9432ec25ef93df84b8a0b9697ddef435a945e7f244670c4f79f88363e9?s=96&d=mm&r=g', 'UsersCollection.0._links.self.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/users/1', 'UsersCollection.0._links.collection.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/users', 'UsersCollection.1.id' => 2, diff --git a/tests/qunit/fixtures/wp-api-generated.js b/tests/qunit/fixtures/wp-api-generated.js index 4fc897a6242e7..448548aab0c07 100644 --- a/tests/qunit/fixtures/wp-api-generated.js +++ b/tests/qunit/fixtures/wp-api-generated.js @@ -13877,9 +13877,9 @@ mockedApiResponse.UsersCollection = [ "link": "http://example.org/?author=1", "slug": "admin", "avatar_urls": { - "24": "https://secure.gravatar.com/avatar/96614ec98aa0c0d2ee75796dced6df54?s=24&d=mm&r=g", - "48": "https://secure.gravatar.com/avatar/96614ec98aa0c0d2ee75796dced6df54?s=48&d=mm&r=g", - "96": "https://secure.gravatar.com/avatar/96614ec98aa0c0d2ee75796dced6df54?s=96&d=mm&r=g" + "24": "https://secure.gravatar.com/avatar/9387ed9432ec25ef93df84b8a0b9697ddef435a945e7f244670c4f79f88363e9?s=24&d=mm&r=g", + "48": "https://secure.gravatar.com/avatar/9387ed9432ec25ef93df84b8a0b9697ddef435a945e7f244670c4f79f88363e9?s=48&d=mm&r=g", + "96": "https://secure.gravatar.com/avatar/9387ed9432ec25ef93df84b8a0b9697ddef435a945e7f244670c4f79f88363e9?s=96&d=mm&r=g" }, "meta": { "meta_key": "meta_value" @@ -13914,9 +13914,9 @@ mockedApiResponse.UsersCollection = [ "link": "http://example.org/?author=2", "slug": "restapiclientfixtureuser", "avatar_urls": { - "24": "https://secure.gravatar.com/avatar/57cbd982c963c7eb2294e2eee1b4448e?s=24&d=mm&r=g", - "48": "https://secure.gravatar.com/avatar/57cbd982c963c7eb2294e2eee1b4448e?s=48&d=mm&r=g", - "96": "https://secure.gravatar.com/avatar/57cbd982c963c7eb2294e2eee1b4448e?s=96&d=mm&r=g" + "24": "https://secure.gravatar.com/avatar/ea862d9636c72500beece7b1990870e2776f89c2096d0c064c14f2beb910077d?s=24&d=mm&r=g", + "48": "https://secure.gravatar.com/avatar/ea862d9636c72500beece7b1990870e2776f89c2096d0c064c14f2beb910077d?s=48&d=mm&r=g", + "96": "https://secure.gravatar.com/avatar/ea862d9636c72500beece7b1990870e2776f89c2096d0c064c14f2beb910077d?s=96&d=mm&r=g" }, "meta": { "meta_key": "" @@ -13953,9 +13953,9 @@ mockedApiResponse.UserModel = { "link": "http://example.org/?author=2", "slug": "restapiclientfixtureuser", "avatar_urls": { - "24": "https://secure.gravatar.com/avatar/57cbd982c963c7eb2294e2eee1b4448e?s=24&d=mm&r=g", - "48": "https://secure.gravatar.com/avatar/57cbd982c963c7eb2294e2eee1b4448e?s=48&d=mm&r=g", - "96": "https://secure.gravatar.com/avatar/57cbd982c963c7eb2294e2eee1b4448e?s=96&d=mm&r=g" + "24": "https://secure.gravatar.com/avatar/ea862d9636c72500beece7b1990870e2776f89c2096d0c064c14f2beb910077d?s=24&d=mm&r=g", + "48": "https://secure.gravatar.com/avatar/ea862d9636c72500beece7b1990870e2776f89c2096d0c064c14f2beb910077d?s=48&d=mm&r=g", + "96": "https://secure.gravatar.com/avatar/ea862d9636c72500beece7b1990870e2776f89c2096d0c064c14f2beb910077d?s=96&d=mm&r=g" }, "meta": { "meta_key": "" @@ -13970,9 +13970,9 @@ mockedApiResponse.me = { "link": "http://example.org/?author=2", "slug": "restapiclientfixtureuser", "avatar_urls": { - "24": "https://secure.gravatar.com/avatar/57cbd982c963c7eb2294e2eee1b4448e?s=24&d=mm&r=g", - "48": "https://secure.gravatar.com/avatar/57cbd982c963c7eb2294e2eee1b4448e?s=48&d=mm&r=g", - "96": "https://secure.gravatar.com/avatar/57cbd982c963c7eb2294e2eee1b4448e?s=96&d=mm&r=g" + "24": "https://secure.gravatar.com/avatar/ea862d9636c72500beece7b1990870e2776f89c2096d0c064c14f2beb910077d?s=24&d=mm&r=g", + "48": "https://secure.gravatar.com/avatar/ea862d9636c72500beece7b1990870e2776f89c2096d0c064c14f2beb910077d?s=48&d=mm&r=g", + "96": "https://secure.gravatar.com/avatar/ea862d9636c72500beece7b1990870e2776f89c2096d0c064c14f2beb910077d?s=96&d=mm&r=g" }, "meta": { "meta_key": "" @@ -13996,9 +13996,9 @@ mockedApiResponse.CommentsCollection = [ "status": "approved", "type": "comment", "author_avatar_urls": { - "24": "https://secure.gravatar.com/avatar/bd7c2b505bcf39cc71cfee564c614956?s=24&d=mm&r=g", - "48": "https://secure.gravatar.com/avatar/bd7c2b505bcf39cc71cfee564c614956?s=48&d=mm&r=g", - "96": "https://secure.gravatar.com/avatar/bd7c2b505bcf39cc71cfee564c614956?s=96&d=mm&r=g" + "24": "https://secure.gravatar.com/avatar/9ca51ced0b389ffbeba3d269c6d824be664c84fa1b35503282abdd302e1f417c?s=24&d=mm&r=g", + "48": "https://secure.gravatar.com/avatar/9ca51ced0b389ffbeba3d269c6d824be664c84fa1b35503282abdd302e1f417c?s=48&d=mm&r=g", + "96": "https://secure.gravatar.com/avatar/9ca51ced0b389ffbeba3d269c6d824be664c84fa1b35503282abdd302e1f417c?s=96&d=mm&r=g" }, "meta": { "meta_key": "meta_value" @@ -14050,9 +14050,9 @@ mockedApiResponse.CommentModel = { "status": "approved", "type": "comment", "author_avatar_urls": { - "24": "https://secure.gravatar.com/avatar/bd7c2b505bcf39cc71cfee564c614956?s=24&d=mm&r=g", - "48": "https://secure.gravatar.com/avatar/bd7c2b505bcf39cc71cfee564c614956?s=48&d=mm&r=g", - "96": "https://secure.gravatar.com/avatar/bd7c2b505bcf39cc71cfee564c614956?s=96&d=mm&r=g" + "24": "https://secure.gravatar.com/avatar/9ca51ced0b389ffbeba3d269c6d824be664c84fa1b35503282abdd302e1f417c?s=24&d=mm&r=g", + "48": "https://secure.gravatar.com/avatar/9ca51ced0b389ffbeba3d269c6d824be664c84fa1b35503282abdd302e1f417c?s=48&d=mm&r=g", + "96": "https://secure.gravatar.com/avatar/9ca51ced0b389ffbeba3d269c6d824be664c84fa1b35503282abdd302e1f417c?s=96&d=mm&r=g" }, "meta": { "meta_key": "meta_value" From 2238011c33b55e68c1d8f91d850528c153582b67 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Wed, 18 Dec 2024 00:23:35 +0000 Subject: [PATCH 119/323] Coding Standards: Fix WPCS issues in `get_avatar_data()`. Follow-up to [59532]. See #60638. git-svn-id: https://develop.svn.wordpress.org/trunk@59533 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/link-template.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/link-template.php b/src/wp-includes/link-template.php index a375b0ee06a4b..da57ebd64df80 100644 --- a/src/wp-includes/link-template.php +++ b/src/wp-includes/link-template.php @@ -4353,7 +4353,7 @@ function is_avatar_comment_type( $comment_type ) { * * @since 4.2.0 * @since 6.7.0 Gravatar URLs always use HTTPS. - * @since 6.8.0 Gravatar URLs use the SHA-256 hashing algorithm. + * @since 6.8.0 Gravatar URLs use the SHA-256 hashing algorithm. * * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar SHA-256 or MD5 hash, * user email, WP_User object, WP_Post object, or WP_Comment object. @@ -4500,7 +4500,7 @@ function get_avatar_data( $id_or_email, $args = null ) { if ( str_contains( $id_or_email, '@sha256.gravatar.com' ) ) { // SHA-256 hash. list( $email_hash ) = explode( '@', $id_or_email ); - } else if ( str_contains( $id_or_email, '@md5.gravatar.com' ) ) { + } elseif ( str_contains( $id_or_email, '@md5.gravatar.com' ) ) { // MD5 hash. list( $email_hash ) = explode( '@', $id_or_email ); } else { From 7af04695d86ebeeb0d3f314c53f1f425a14323a7 Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Wed, 18 Dec 2024 11:29:53 +0000 Subject: [PATCH 120/323] Build/Test Tools: Remove an unnecessary call to svn in a debugging step. None of the steps in any of the workflows use svn, so this debugging step is unnecessary, and svn has been removed in the ubuntu-24.04 runner which will be rolling out to GitHub Actions imminently. See #62221 git-svn-id: https://develop.svn.wordpress.org/trunk@59534 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-phpunit-tests-v1.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/reusable-phpunit-tests-v1.yml b/.github/workflows/reusable-phpunit-tests-v1.yml index ad45726102dbe..e02a890a6debf 100644 --- a/.github/workflows/reusable-phpunit-tests-v1.yml +++ b/.github/workflows/reusable-phpunit-tests-v1.yml @@ -143,7 +143,6 @@ jobs: node --version curl --version git --version - svn --version - name: Log running Docker containers run: docker ps -a From a2107c2f3958f307ea748d2431775766dde77dfa Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Wed, 18 Dec 2024 18:49:53 +0000 Subject: [PATCH 121/323] External Libraries: Append a string to `react`/`react-dom` versions. In 6.7, [58775] changed the way `react` and `react-dom` are bundled in Core. This commit resulted in some changes to the built files that are distributed in WordPress even though the actual version of the libraries remained the same. The result can be a blank white screen when trying to edit a post when those two script files are heavily cached. This adds `-umd` to the end of the version number to properly purge caches until the next update to these libraries occurs. Props levskipg, get_dave, smerriman, jdnd, juanwp22, seanlanglands, robertstaddon. Fixes 62422. git-svn-id: https://develop.svn.wordpress.org/trunk@59536 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/script-loader.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/script-loader.php b/src/wp-includes/script-loader.php index d2c8dbe97e393..14027aa52a88f 100644 --- a/src/wp-includes/script-loader.php +++ b/src/wp-includes/script-loader.php @@ -106,8 +106,8 @@ function wp_default_packages_vendor( $scripts ) { ); $vendor_scripts_versions = array( - 'react' => '18.3.1', - 'react-dom' => '18.3.1', + 'react' => '18.3.1-umd', + 'react-dom' => '18.3.1-umd', 'react-jsx-runtime' => '18.3.1', 'regenerator-runtime' => '0.14.1', 'moment' => '2.30.1', From 9e4b268049b69e96e78bcc1ab77d9d6a4134f8cf Mon Sep 17 00:00:00 2001 From: Peter Wilson <peterwilsoncc@git.wordpress.org> Date: Thu, 19 Dec 2024 03:07:09 +0000 Subject: [PATCH 122/323] External Libraries: Append `.1` to `react`/`react-dom` versions. Replaces the `-umd` appendage for the `react` and `react-dom` script versions with `.1`. This it to prevent issues with third party code expecting the version number in the form `/^[\d\.]+$/`. Updates the version to tests in `Tests_Dependencies_Scripts::test_vendor_script_versions_registered_manually` to include the modified version used for cache busting. Follow up to [59536], [58775]. Props azaozz, desrosj, peterwilsoncc. Fixes #62422. git-svn-id: https://develop.svn.wordpress.org/trunk@59540 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/script-loader.php | 4 ++-- tests/phpunit/tests/dependencies/scripts.php | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/script-loader.php b/src/wp-includes/script-loader.php index 14027aa52a88f..f4e37d7164139 100644 --- a/src/wp-includes/script-loader.php +++ b/src/wp-includes/script-loader.php @@ -106,8 +106,8 @@ function wp_default_packages_vendor( $scripts ) { ); $vendor_scripts_versions = array( - 'react' => '18.3.1-umd', - 'react-dom' => '18.3.1-umd', + 'react' => '18.3.1.1', // Final .1 due to switch to UMD build, can be removed in the next update. + 'react-dom' => '18.3.1.1', // Final .1 due to switch to UMD build, can be removed in the next update. 'react-jsx-runtime' => '18.3.1', 'regenerator-runtime' => '0.14.1', 'moment' => '2.30.1', diff --git a/tests/phpunit/tests/dependencies/scripts.php b/tests/phpunit/tests/dependencies/scripts.php index 03dba5df69744..89bfb4ef922e6 100644 --- a/tests/phpunit/tests/dependencies/scripts.php +++ b/tests/phpunit/tests/dependencies/scripts.php @@ -3413,6 +3413,21 @@ public function test_vendor_script_versions_registered_manually( $script, $handl $handle = $script; } + /* + * Append '.1' to the version number for React and ReactDOM. + * + * This is due to a change in the build to use the UMD version of the + * scripts, requiring a different version number in order to break the + * caches of some CDNs. + * + * This can be removed in the next update to the packages. + * + * See https://core.trac.wordpress.org/ticket/62422 + */ + if ( in_array( $handle, array( 'react', 'react-dom' ), true ) ) { + $package_json[ $script ] .= '.1'; + } + $script_query = $wp_scripts->query( $handle, 'registered' ); $this->assertNotFalse( $script_query, "The script '{$handle}' should be registered." ); From 17b50d3d9c0c3f1383bae3c9241bd618c9160b09 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Thu, 19 Dec 2024 03:42:32 +0000 Subject: [PATCH 123/323] Privacy: Replace hardcoded MD5 references in `wp_credits_section_list()`. The Credits API has been updated to return SHA-256 email hashes. Follow-up to [59532], [meta14307]. Props haozi. Fixes #62706, #60638. git-svn-id: https://develop.svn.wordpress.org/trunk@59541 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/credits.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-admin/includes/credits.php b/src/wp-admin/includes/credits.php index 1ad2a37c2bb7e..79b2a0b46c854 100644 --- a/src/wp-admin/includes/credits.php +++ b/src/wp-admin/includes/credits.php @@ -147,8 +147,8 @@ function wp_credits_section_list( $credits = array(), $slug = '' ) { echo '<li class="wp-person" id="wp-person-' . esc_attr( $person_data[2] ) . '">' . "\n\t"; echo '<a href="' . esc_url( sprintf( $credits_data['profiles'], $person_data[2] ) ) . '" class="web">'; $size = $compact ? 80 : 160; - $data = get_avatar_data( $person_data[1] . '@md5.gravatar.com', array( 'size' => $size ) ); - $data2x = get_avatar_data( $person_data[1] . '@md5.gravatar.com', array( 'size' => $size * 2 ) ); + $data = get_avatar_data( $person_data[1] . '@sha256.gravatar.com', array( 'size' => $size ) ); + $data2x = get_avatar_data( $person_data[1] . '@sha256.gravatar.com', array( 'size' => $size * 2 ) ); echo '<span class="wp-person-avatar"><img src="' . esc_url( $data['url'] ) . '" srcset="' . esc_url( $data2x['url'] ) . ' 2x" class="gravatar" alt="" /></span>' . "\n"; echo esc_html( $person_data[0] ) . "</a>\n\t"; if ( ! $compact && ! empty( $person_data[3] ) ) { From 816ec5df8a5970254d4b6d6ab73ba01b06d3c6f4 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Thu, 19 Dec 2024 10:22:34 +0000 Subject: [PATCH 124/323] Docs: Add missing single quote in `WP_User_Query::prepare_query()` DocBlock. Follow-up to [38715], [52226]. Props kkmuffme, mukesh27. Fixes #62714. git-svn-id: https://develop.svn.wordpress.org/trunk@59542 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-user-query.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/class-wp-user-query.php b/src/wp-includes/class-wp-user-query.php index f9bb823c55900..fd35182eab9f5 100644 --- a/src/wp-includes/class-wp-user-query.php +++ b/src/wp-includes/class-wp-user-query.php @@ -202,7 +202,7 @@ public static function fill_query_vars( $args ) { * - 'login__in' * - 'user_nicename' (or 'nicename') * - 'nicename__in' - * - 'user_email (or 'email') + * - 'user_email' (or 'email') * - 'user_url' (or 'url') * - 'user_registered' (or 'registered') * - 'post_count' From ef7606073b8a016c5e32e230e50685ec62b3e7d2 Mon Sep 17 00:00:00 2001 From: bernhard-reiter <bernhard-reiter@git.wordpress.org> Date: Thu, 19 Dec 2024 13:24:22 +0000 Subject: [PATCH 125/323] Block Hooks: Apply to synced patterns. Apply Block Hooks to synced patterns (i.e. `core/block` instances). Props bernhard-reiter, gziolo. Fixes #62704. git-svn-id: https://develop.svn.wordpress.org/trunk@59543 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/blocks.php | 11 ++++++++++- src/wp-includes/default-filters.php | 4 +++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index 6a4ab4636c803..25a4a7e3b29a1 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -1219,6 +1219,8 @@ function update_ignored_hooked_blocks_postmeta( $post ) { if ( 'wp_navigation' === $post->post_type ) { $wrapper_block_type = 'core/navigation'; + } elseif ( 'wp_block' === $post->post_type ) { + $wrapper_block_type = 'core/block'; } else { $wrapper_block_type = 'core/post-content'; } @@ -1291,7 +1293,7 @@ function insert_hooked_blocks_and_set_ignored_hooked_blocks_metadata( &$parsed_a * @return WP_REST_Response The response object. */ function insert_hooked_blocks_into_rest_response( $response, $post ) { - if ( empty( $response->data['content']['raw'] ) || empty( $response->data['content']['rendered'] ) ) { + if ( empty( $response->data['content']['raw'] ) ) { return $response; } @@ -1306,6 +1308,8 @@ function insert_hooked_blocks_into_rest_response( $response, $post ) { if ( 'wp_navigation' === $post->post_type ) { $wrapper_block_type = 'core/navigation'; + } elseif ( 'wp_block' === $post->post_type ) { + $wrapper_block_type = 'core/block'; } else { $wrapper_block_type = 'core/post-content'; } @@ -1327,6 +1331,11 @@ function insert_hooked_blocks_into_rest_response( $response, $post ) { $response->data['content']['raw'] = $content; + // If the rendered content was previously empty, we leave it like that. + if ( empty( $response->data['content']['rendered'] ) ) { + return $response; + } + // `apply_block_hooks_to_content` is called above. Ensure it is not called again as a filter. $priority = has_filter( 'the_content', 'apply_block_hooks_to_content' ); if ( false !== $priority ) { diff --git a/src/wp-includes/default-filters.php b/src/wp-includes/default-filters.php index 18ef8517edce2..9eff6ecbeb67a 100644 --- a/src/wp-includes/default-filters.php +++ b/src/wp-includes/default-filters.php @@ -760,14 +760,16 @@ add_filter( 'rest_pre_insert_wp_template', 'inject_ignored_hooked_blocks_metadata_attributes' ); add_filter( 'rest_pre_insert_wp_template_part', 'inject_ignored_hooked_blocks_metadata_attributes' ); -// Update ignoredHookedBlocks postmeta for wp_navigation post type. +// Update ignoredHookedBlocks postmeta for some post types. add_filter( 'rest_pre_insert_page', 'update_ignored_hooked_blocks_postmeta' ); add_filter( 'rest_pre_insert_post', 'update_ignored_hooked_blocks_postmeta' ); +add_filter( 'rest_pre_insert_wp_block', 'update_ignored_hooked_blocks_postmeta' ); add_filter( 'rest_pre_insert_wp_navigation', 'update_ignored_hooked_blocks_postmeta' ); // Inject hooked blocks into the Posts endpoint REST response for some given post types. add_filter( 'rest_prepare_page', 'insert_hooked_blocks_into_rest_response', 10, 2 ); add_filter( 'rest_prepare_post', 'insert_hooked_blocks_into_rest_response', 10, 2 ); +add_filter( 'rest_prepare_wp_block', 'insert_hooked_blocks_into_rest_response', 10, 2 ); add_filter( 'rest_prepare_wp_navigation', 'insert_hooked_blocks_into_rest_response', 10, 2 ); unset( $filter, $action ); From 7381a8273a3c5c3e63a194dace734612a610a135 Mon Sep 17 00:00:00 2001 From: Peter Wilson <peterwilsoncc@git.wordpress.org> Date: Thu, 19 Dec 2024 21:41:19 +0000 Subject: [PATCH 126/323] REST API: Protect against fatal error for post types without format support. Ignore the `format` parameter introduced in WordPress 6.7 for post types that do not support post formats. This protects against a fatal error being thrown in later version of PHP or a warning in earlier versions of PHP. Follow up to r59115. Props dd32, sergeybiryukov, yogeshbhutkar. Fixes #62646. See #62014. git-svn-id: https://develop.svn.wordpress.org/trunk@59544 602fd350-edb4-49c9-b593-d223f7449a82 --- .../class-wp-rest-posts-controller.php | 2 +- .../tests/rest-api/rest-posts-controller.php | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php index 8852519ec45c9..95851199c6e4d 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php @@ -346,7 +346,7 @@ public function get_items( $request ) { $args = $this->prepare_tax_query( $args, $request ); - if ( ! empty( $request['format'] ) ) { + if ( isset( $registered['format'], $request['format'] ) ) { $formats = $request['format']; /* * The relation needs to be set to `OR` since the request can contain diff --git a/tests/phpunit/tests/rest-api/rest-posts-controller.php b/tests/phpunit/tests/rest-api/rest-posts-controller.php index 4574bde83621e..e2fd7139f3f54 100644 --- a/tests/phpunit/tests/rest-api/rest-posts-controller.php +++ b/tests/phpunit/tests/rest-api/rest-posts-controller.php @@ -5507,6 +5507,45 @@ public function test_draft_post_does_not_have_the_same_slug_as_existing_post() { ); } + /** + * Test the REST API ignores the post format parameter for post types that do not support them. + * + * @ticket 62646 + * @ticket 62014 + * + * @covers WP_REST_Posts_Controller::get_items + */ + public function test_standard_post_format_ignored_for_post_types_that_do_not_support_them() { + $initial_theme_support = get_theme_support( 'post-formats' ); + add_theme_support( 'post-formats', array( 'aside', 'gallery', 'link', 'image', 'quote', 'status', 'video', 'audio', 'chat' ) ); + + self::factory()->post->create( + array( + 'post_type' => 'page', + 'post_status' => 'publish', + ) + ); + + $request = new WP_REST_Request( 'GET', '/wp/v2/pages' ); + $request->set_param( 'format', 'invalid_type' ); + + $response = rest_get_server()->dispatch( $request ); + + /* + * Restore the initial post formats support. + * + * This needs to be done prior to the assertions to avoid unexpected + * results for other tests should an assertion fail. + */ + if ( $initial_theme_support ) { + add_theme_support( 'post-formats', $initial_theme_support[0] ); + } else { + remove_theme_support( 'post-formats' ); + } + + $this->assertCount( 1, $response->get_data(), 'The response should ignore the post format parameter' ); + } + /** * Test the REST API support for the standard post format. * From b8ecfbf9542198b1d88230221faeca6b71fa0ac7 Mon Sep 17 00:00:00 2001 From: Peter Wilson <peterwilsoncc@git.wordpress.org> Date: Thu, 19 Dec 2024 21:54:57 +0000 Subject: [PATCH 127/323] Help/About: Add additional release squad titles to credits page. Introduces translatable strings for additional [https://make.wordpress.org/core/handbook/about/release-cycle/wordpress-release-team-and-focus-leads/ release squad titles]. This is to allow improved acknowledgement of an individual's role in a release squad by enabling the use of these roles in the credits API going forward. Props audrasjb, desrosj, jorbin, timse201, yogeshbhutkar. Fixes #62386. git-svn-id: https://develop.svn.wordpress.org/trunk@59545 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/credits.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/wp-admin/credits.php b/src/wp-admin/credits.php index d3d0bbf7d6ece..acc8a21c28ab8 100644 --- a/src/wp-admin/credits.php +++ b/src/wp-admin/credits.php @@ -135,3 +135,17 @@ __( 'Release Deputy' ); __( 'Core Developer' ); __( 'External Libraries' ); +__( 'Release Coordination' ); +__( 'Core Tech Lead' ); +__( 'Core Triage Lead' ); +__( 'Editor Tech Lead' ); +__( 'Editor Triage Lead' ); +__( 'Documentation Lead' ); +__( 'Test Lead' ); +__( 'Design Lead' ); +__( 'Performance Lead' ); +__( 'Default Theme Design Lead' ); +__( 'Default Theme Development Lead' ); +__( 'Tech Lead' ); +__( 'Triage Lead' ); +__( 'Minor Release Lead' ); From a64ad57db6837a6b1c681676c0c31d43dced7508 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Fri, 20 Dec 2024 23:33:05 +0000 Subject: [PATCH 128/323] Docs: Update parameter type hints to include `null` for post thumbnail functions. Follow-up to [12320], [12351], [20646], [32618], [34167], [34373], [37915]. Props apermo, jasonsa19. Fixes #62720. git-svn-id: https://develop.svn.wordpress.org/trunk@59548 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post-thumbnail-template.php | 24 ++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/wp-includes/post-thumbnail-template.php b/src/wp-includes/post-thumbnail-template.php index 7d722ae9de407..59723c7fadb07 100644 --- a/src/wp-includes/post-thumbnail-template.php +++ b/src/wp-includes/post-thumbnail-template.php @@ -19,7 +19,7 @@ * @since 2.9.0 * @since 4.4.0 `$post` can be a post ID or WP_Post object. * - * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`. + * @param int|WP_Post|null $post Optional. Post ID or WP_Post object. Default is global `$post`. * @return bool Whether the post has an image attached. */ function has_post_thumbnail( $post = null ) { @@ -46,7 +46,7 @@ function has_post_thumbnail( $post = null ) { * @since 5.5.0 The return value for a non-existing post * was changed to false instead of an empty string. * - * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`. + * @param int|WP_Post|null $post Optional. Post ID or WP_Post object. Default is global `$post`. * @return int|false Post thumbnail ID (which can be 0 if the thumbnail is not set), * or false if the post does not exist. */ @@ -99,7 +99,7 @@ function the_post_thumbnail( $size = 'post-thumbnail', $attr = '' ) { * * @global WP_Query $wp_query WordPress Query object. * - * @param WP_Query $wp_query Optional. A WP_Query instance. Defaults to the $wp_query global. + * @param WP_Query|null $wp_query Optional. A WP_Query instance. Defaults to the $wp_query global. */ function update_post_thumbnail_cache( $wp_query = null ) { if ( ! $wp_query ) { @@ -156,10 +156,10 @@ function update_post_thumbnail_cache( $wp_query = null ) { * @since 2.9.0 * @since 4.4.0 `$post` can be a post ID or WP_Post object. * - * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`. - * @param string|int[] $size Optional. Image size. Accepts any registered image size name, or an array of - * width and height values in pixels (in that order). Default 'post-thumbnail'. - * @param string|array $attr Optional. Query string or array of attributes. Default empty. + * @param int|WP_Post|null $post Optional. Post ID or WP_Post object. Default is global `$post`. + * @param string|int[] $size Optional. Image size. Accepts any registered image size name, or an array of + * width and height values in pixels (in that order). Default 'post-thumbnail'. + * @param string|array $attr Optional. Query string or array of attributes. Default empty. * @return string The post thumbnail image tag. */ function get_the_post_thumbnail( $post = null, $size = 'post-thumbnail', $attr = '' ) { @@ -241,9 +241,9 @@ function get_the_post_thumbnail( $post = null, $size = 'post-thumbnail', $attr = * * @since 4.4.0 * - * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`. - * @param string|int[] $size Optional. Registered image size to retrieve the source for or a flat array - * of height and width dimensions. Default 'post-thumbnail'. + * @param int|WP_Post|null $post Optional. Post ID or WP_Post object. Default is global `$post`. + * @param string|int[] $size Optional. Registered image size to retrieve the source for or a flat array + * of height and width dimensions. Default 'post-thumbnail'. * @return string|false Post thumbnail URL or false if no image is available. If `$size` does not match * any registered image size, the original image URL will be returned. */ @@ -291,7 +291,7 @@ function the_post_thumbnail_url( $size = 'post-thumbnail' ) { * * @since 4.6.0 * - * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`. + * @param int|WP_Post|null $post Optional. Post ID or WP_Post object. Default is global `$post`. * @return string Post thumbnail caption. */ function get_the_post_thumbnail_caption( $post = null ) { @@ -315,7 +315,7 @@ function get_the_post_thumbnail_caption( $post = null ) { * * @since 4.6.0 * - * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`. + * @param int|WP_Post|null $post Optional. Post ID or WP_Post object. Default is global `$post`. */ function the_post_thumbnail_caption( $post = null ) { /** From afc8acfbf6ba5b03f28bed2716bfc48f54dd159e Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Sat, 21 Dec 2024 17:21:30 +0000 Subject: [PATCH 129/323] Docs: Docblock improvements in . Props shailu25. Fixes #62730. See #62281. git-svn-id: https://develop.svn.wordpress.org/trunk@59549 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/block-supports/block-style-variations.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/block-supports/block-style-variations.php b/src/wp-includes/block-supports/block-style-variations.php index 4397a34af9701..62fb04e1a0c86 100644 --- a/src/wp-includes/block-supports/block-style-variations.php +++ b/src/wp-includes/block-supports/block-style-variations.php @@ -62,7 +62,7 @@ function wp_resolve_block_style_variation_ref_values( &$variation_data, $theme_j } } /** - * Render the block style variation's styles. + * Renders the block style variation's styles. * * In the case of nested blocks with variations applied, we want the parent * variation's styles to be rendered before their descendants. This solves the @@ -194,15 +194,15 @@ function wp_render_block_style_variation_support_styles( $parsed_block ) { } /** - * Ensure the variation block support class name generated and added to + * Ensures the variation block support class name generated and added to * block attributes in the `render_block_data` filter gets applied to the * block's markup. * - * @see wp_render_block_style_variation_support_styles - * * @since 6.6.0 * @access private * + * @see wp_render_block_style_variation_support_styles + * * @param string $block_content Rendered block content. * @param array $block Block object. * From 17d5e47aee6c849f4cde733eba4d9403af1406e4 Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Sat, 21 Dec 2024 21:52:56 +0000 Subject: [PATCH 130/323] Media: Fix margin issues on the Media file upload screen. This changeset fixes an issue in the Media Library where icons or thumbnails of uploaded files were stuck to the border of their container after file upload. Follow-up to [58279]. Props sukhendu2002, im3dabasia1, sainathpoojary, joedolson. Fixes #62573. See #60141. git-svn-id: https://develop.svn.wordpress.org/trunk@59550 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/css/media.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-admin/css/media.css b/src/wp-admin/css/media.css index 41beffc2e8669..0db92775a9f2b 100644 --- a/src/wp-admin/css/media.css +++ b/src/wp-admin/css/media.css @@ -174,7 +174,7 @@ .media-item .pinkynail { float: left; - margin: 0 10px 0 0; + margin: 14px; max-height: 70px; max-width: 70px; } From 08c3dd4aff7298ffc882072f9c3d9f2c46a9a927 Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Sat, 21 Dec 2024 22:37:35 +0000 Subject: [PATCH 131/323] Login and Registration: Adjust login form margins for better consistency. This changeset addresses adjusts margins around the login form for visual consistency. The margin above and below the form is now consistently set to 24px, and the margin below the logo has also been adjusted to 24px. Follow-up to [26072]. Props deeppatel8950, audrasjb, priyank9033, viralsampat, vijaysinh9094, sabernhardt, . Fixes #61667. git-svn-id: https://develop.svn.wordpress.org/trunk@59551 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/css/login.css | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/wp-admin/css/login.css b/src/wp-admin/css/login.css index c2211d9da681e..269f1115e2417 100644 --- a/src/wp-admin/css/login.css +++ b/src/wp-admin/css/login.css @@ -139,8 +139,7 @@ p { } .login form { - margin-top: 20px; - margin-left: 0; + margin: 24px 0; padding: 26px 24px; font-weight: 400; overflow: hidden; @@ -284,7 +283,7 @@ p { font-size: 20px; font-weight: 400; line-height: 1.3; - margin: 0 auto 25px; + margin: 0 auto 24px; padding: 0; text-decoration: none; width: 84px; From 322b9843959c2cc7261001a336961cf1bc73f06e Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sat, 21 Dec 2024 23:14:46 +0000 Subject: [PATCH 132/323] Help/About: Reorder release squad titles for some consistency in translation tools. Follow-up to [59545]. See #62386. git-svn-id: https://develop.svn.wordpress.org/trunk@59552 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/credits.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wp-admin/credits.php b/src/wp-admin/credits.php index acc8a21c28ab8..46b035419cc87 100644 --- a/src/wp-admin/credits.php +++ b/src/wp-admin/credits.php @@ -133,9 +133,9 @@ __( 'Release Lead' ); __( 'Release Design Lead' ); __( 'Release Deputy' ); -__( 'Core Developer' ); -__( 'External Libraries' ); __( 'Release Coordination' ); +__( 'Minor Release Lead' ); +__( 'Core Developer' ); __( 'Core Tech Lead' ); __( 'Core Triage Lead' ); __( 'Editor Tech Lead' ); @@ -148,4 +148,4 @@ __( 'Default Theme Development Lead' ); __( 'Tech Lead' ); __( 'Triage Lead' ); -__( 'Minor Release Lead' ); +__( 'External Libraries' ); From 71eaaad6895608e85443a46106a4f3171c6557f4 Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Sun, 22 Dec 2024 08:34:08 +0000 Subject: [PATCH 133/323] Themes: Fix unwanted horizontal scrolling in theme details screen on mobile. This changeset fixes an issue where the theme browser created unwanted horizontal scrolling on some mobile devices. The issue occured when viewing theme details on mobile. Follow-up to [26142]. Props wildworks, abcd95, sainathpoojary, dhruvang21, sabernhardt. Fixes #62411. git-svn-id: https://develop.svn.wordpress.org/trunk@59553 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/css/themes.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/wp-admin/css/themes.css b/src/wp-admin/css/themes.css index e7c58b257fc76..2d81613dbce47 100644 --- a/src/wp-admin/css/themes.css +++ b/src/wp-admin/css/themes.css @@ -935,6 +935,7 @@ body.folded .theme-browser ~ .theme-overlay .theme-wrap { .theme-overlay .theme-screenshots { width: 100%; float: none; + margin: 0; } .theme-overlay .theme-info { From de76b6ee76b7052b2da246476cadc05c21686dd8 Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Sun, 22 Dec 2024 19:13:23 +0000 Subject: [PATCH 134/323] I18n: Add translator context for various occurrences of "upload". This changeset adds a `noun` or `verb` context to the various occurrences of "upload" in the admin, to make it easier for translators to differenciate these strings depending on the context. Props timse201, wpgerd. Fixes #62732. git-svn-id: https://develop.svn.wordpress.org/trunk@59554 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/class-custom-background.php | 2 +- src/wp-admin/includes/class-custom-image-header.php | 2 +- src/wp-admin/includes/class-wp-theme-install-list-table.php | 2 +- src/wp-admin/includes/media.php | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/wp-admin/includes/class-custom-background.php b/src/wp-admin/includes/class-custom-background.php index 3dab05c99a49c..d8500d8570405 100644 --- a/src/wp-admin/includes/class-custom-background.php +++ b/src/wp-admin/includes/class-custom-background.php @@ -354,7 +354,7 @@ public function admin_page() { <input type="file" id="upload" name="import" /> <input type="hidden" name="action" value="save" /> <?php wp_nonce_field( 'custom-background-upload', '_wpnonce-custom-background-upload' ); ?> - <?php submit_button( __( 'Upload' ), '', 'submit', false ); ?> + <?php submit_button( _x( 'Upload', 'verb' ), '', 'submit', false ); ?> </p> <p> <label for="choose-from-library-link"><?php _e( 'Or choose an image from your media library:' ); ?></label><br /> diff --git a/src/wp-admin/includes/class-custom-image-header.php b/src/wp-admin/includes/class-custom-image-header.php index 480a0643244d4..2e1bf47fdaf5e 100644 --- a/src/wp-admin/includes/class-custom-image-header.php +++ b/src/wp-admin/includes/class-custom-image-header.php @@ -664,7 +664,7 @@ public function step_1() { <input type="file" id="upload" name="import" /> <input type="hidden" name="action" value="save" /> <?php wp_nonce_field( 'custom-header-upload', '_wpnonce-custom-header-upload' ); ?> - <?php submit_button( __( 'Upload' ), '', 'submit', false ); ?> + <?php submit_button( _x( 'Upload', 'verb' ), '', 'submit', false ); ?> </p> <?php $modal_update_href = add_query_arg( diff --git a/src/wp-admin/includes/class-wp-theme-install-list-table.php b/src/wp-admin/includes/class-wp-theme-install-list-table.php index ca179b6c2d972..bf2d2fb34d36a 100644 --- a/src/wp-admin/includes/class-wp-theme-install-list-table.php +++ b/src/wp-admin/includes/class-wp-theme-install-list-table.php @@ -60,7 +60,7 @@ public function prepare_items() { if ( 'search' === $tab ) { $tabs['search'] = __( 'Search Results' ); } - $tabs['upload'] = __( 'Upload' ); + $tabs['upload'] = _x( 'Upload', 'noun' ); $tabs['featured'] = _x( 'Featured', 'themes' ); //$tabs['popular'] = _x( 'Popular', 'themes' ); $tabs['new'] = _x( 'Latest', 'themes' ); diff --git a/src/wp-admin/includes/media.php b/src/wp-admin/includes/media.php index 82187fd62e50d..4484d1672519e 100644 --- a/src/wp-admin/includes/media.php +++ b/src/wp-admin/includes/media.php @@ -2277,11 +2277,11 @@ function media_upload_form( $errors = null ) { <label class="screen-reader-text" for="async-upload"> <?php /* translators: Hidden accessibility text. */ - _e( 'Upload' ); + _ex( 'Upload', 'verb' ); ?> </label> <input type="file" name="async-upload" id="async-upload" /> - <?php submit_button( __( 'Upload' ), 'primary', 'html-upload', false ); ?> + <?php submit_button( _x( 'Upload', 'verb' ), 'primary', 'html-upload', false ); ?> <a href="#" onclick="try{top.tb_remove();}catch(e){}; return false;"><?php _e( 'Cancel' ); ?></a> </p> <div class="clear"></div> From d030306983076b1834fb9d6d25776d0b49112430 Mon Sep 17 00:00:00 2001 From: Joe Dolson <joedolson@git.wordpress.org> Date: Sun, 22 Dec 2024 20:44:06 +0000 Subject: [PATCH 135/323] Customizer: Allow custom accordion items with obsolete structure. In [59224], customizer accordion item HTML structure was changed to include a `button` element as the interactive control. However, some themes inject custom markup for panel headings. Fix `controls.js` to handle both the new markup and the old markup, which is relatively common in themes. Props paullb, desrosj, sabernhardt, joedolson, jorbin. Fixes #62494. git-svn-id: https://develop.svn.wordpress.org/trunk@59555 602fd350-edb4-49c9-b593-d223f7449a82 --- src/js/_enqueues/wp/customize/controls.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/js/_enqueues/wp/customize/controls.js b/src/js/_enqueues/wp/customize/controls.js index 1d402bc1c3273..7a6e69cf3eb9c 100644 --- a/src/js/_enqueues/wp/customize/controls.js +++ b/src/js/_enqueues/wp/customize/controls.js @@ -1530,7 +1530,7 @@ } // Expand/Collapse accordion sections on click. - section.container.find( '.accordion-section-title button, .customize-section-back' ).on( 'click keydown', function( event ) { + section.container.find( '.accordion-section-title button, .customize-section-back, .accordion-section-title[tabindex]' ).on( 'click keydown', function( event ) { if ( api.utils.isKeydownButNotEnterEvent( event ) ) { return; } @@ -1605,7 +1605,7 @@ content = section.contentContainer, overlay = section.headContainer.closest( '.wp-full-overlay' ), backBtn = content.find( '.customize-section-back' ), - sectionTitle = section.headContainer.find( '.accordion-section-title button' ).first(), + sectionTitle = section.headContainer.find( '.accordion-section-title button, .accordion-section-title[tabindex]' ).first(), expand, panel; if ( expanded && ! content.hasClass( 'open' ) ) { @@ -2694,7 +2694,7 @@ container = section.headContainer.closest( '.wp-full-overlay-sidebar-content' ), content = section.contentContainer, backBtn = content.find( '.customize-section-back' ), - sectionTitle = section.headContainer.find( '.accordion-section-title button' ).first(), + sectionTitle = section.headContainer.find( '.accordion-section-title button, .accordion-section-title[tabindex]' ).first(), body = $( document.body ), expand, panel; @@ -2833,7 +2833,7 @@ var meta, panel = this; // Expand/Collapse accordion sections on click. - panel.headContainer.find( '.accordion-section-title button' ).on( 'click keydown', function( event ) { + panel.headContainer.find( '.accordion-section-title button, .accordion-section-title[tabindex]' ).on( 'click keydown', function( event ) { if ( api.utils.isKeydownButNotEnterEvent( event ) ) { return; } @@ -2937,7 +2937,7 @@ accordionSection = panel.contentContainer, overlay = accordionSection.closest( '.wp-full-overlay' ), container = accordionSection.closest( '.wp-full-overlay-sidebar-content' ), - topPanel = panel.headContainer.find( '.accordion-section-title button' ), + topPanel = panel.headContainer.find( '.accordion-section-title button, .accordion-section-title[tabindex]' ), backBtn = accordionSection.find( '.customize-panel-back' ), childSections = panel.sections(), skipTransition; From 07be2445e45066147105206da08acf31bcee974d Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sun, 22 Dec 2024 22:42:35 +0000 Subject: [PATCH 136/323] Coding Standards: Use strict comparison in `wp_handle_comment_submission()`. Follow-up to [549], [1985], [2464], [2556], [2558], [34799], [40667]. Props deepakrohilla, narenin. See #62316. git-svn-id: https://develop.svn.wordpress.org/trunk@59556 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/comment.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/comment.php b/src/wp-includes/comment.php index 4360f14d09554..2762b77593308 100644 --- a/src/wp-includes/comment.php +++ b/src/wp-includes/comment.php @@ -3658,7 +3658,7 @@ function wp_handle_comment_submission( $comment_data ) { $comment_type = 'comment'; if ( get_option( 'require_name_email' ) && ! $user->exists() ) { - if ( '' == $comment_author_email || '' == $comment_author ) { + if ( '' === $comment_author_email || '' === $comment_author ) { return new WP_Error( 'require_name_email', __( '<strong>Error:</strong> Please fill the required fields.' ), 200 ); } elseif ( ! is_email( $comment_author_email ) ) { return new WP_Error( 'require_valid_email', __( '<strong>Error:</strong> Please enter a valid email address.' ), 200 ); From a9e2f1c1e55f55c105b58fcc9c2303fead4870fc Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Mon, 23 Dec 2024 20:04:18 +0000 Subject: [PATCH 137/323] Coding Standards: Use strict comparison in `wpmu_validate_user_signup()`. Follow-up to [14298], [19852]. Props debarghyabanerjee. See #62283. git-svn-id: https://develop.svn.wordpress.org/trunk@59557 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/ms-functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/ms-functions.php b/src/wp-includes/ms-functions.php index fa8df6d10875b..d17de7ead01da 100644 --- a/src/wp-includes/ms-functions.php +++ b/src/wp-includes/ms-functions.php @@ -462,7 +462,7 @@ function wpmu_validate_user_signup( $user_name, $user_email ) { $orig_username = $user_name; $user_name = preg_replace( '/\s+/', '', sanitize_user( $user_name, true ) ); - if ( $user_name != $orig_username || preg_match( '/[^a-z0-9]/', $user_name ) ) { + if ( $user_name !== $orig_username || preg_match( '/[^a-z0-9]/', $user_name ) ) { $errors->add( 'user_name', __( 'Usernames can only contain lowercase letters (a-z) and numbers.' ) ); $user_name = $orig_username; } From 9dd87b8f91300917447c271968d3c36289b440e8 Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Mon, 23 Dec 2024 22:07:47 +0000 Subject: [PATCH 138/323] Coding Standards: Fix a comment indentation issue in `script-loader.php`. Follow-up to [58703]. Props mukesh27. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59558 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/script-loader.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/script-loader.php b/src/wp-includes/script-loader.php index f4e37d7164139..6a5768a8a4b9b 100644 --- a/src/wp-includes/script-loader.php +++ b/src/wp-includes/script-loader.php @@ -2517,9 +2517,9 @@ function wp_enqueue_global_styles() { if ( $is_block_theme ) { /* - * Dequeue the Customizer's custom CSS - * and add it before the global styles custom CSS. - */ + * Dequeue the Customizer's custom CSS + * and add it before the global styles custom CSS. + */ remove_action( 'wp_head', 'wp_custom_css_cb', 101 ); // Get the custom CSS from the Customizer and add it to the global stylesheet. $custom_css = wp_get_custom_css(); From 70ecc6b6423b4a7de607c196933bc5935588a091 Mon Sep 17 00:00:00 2001 From: Joe Dolson <joedolson@git.wordpress.org> Date: Mon, 23 Dec 2024 23:01:23 +0000 Subject: [PATCH 139/323] Themes: Add an ID to the block theme skip link. Add the ID `wp-skip-link` to the block theme generated skip link, so that block themes have a standardized target at the top of the `body` element. Props philliproth, audrasjb, debarghyabanerjee, sabernhardt, joedolson, apermo. Fixes #62311. git-svn-id: https://develop.svn.wordpress.org/trunk@59559 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/theme-templates.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/wp-includes/theme-templates.php b/src/wp-includes/theme-templates.php index c01a4ec6721e8..55b9c8fac4990 100644 --- a/src/wp-includes/theme-templates.php +++ b/src/wp-includes/theme-templates.php @@ -203,6 +203,7 @@ function wp_enqueue_block_template_skip_link() { // Create the skip link. skipLink = document.createElement( 'a' ); skipLink.classList.add( 'skip-link', 'screen-reader-text' ); + skipLink.id = 'wp-skip-link'; skipLink.href = '#' + skipLinkTargetID; skipLink.innerHTML = '<?php /* translators: Hidden accessibility text. */ esc_html_e( 'Skip to content' ); ?>'; From 87f99b4316bf2bf8f20efead24424e6fdeb1e976 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Tue, 24 Dec 2024 22:22:49 +0000 Subject: [PATCH 140/323] Coding Standards: Use strict comparison in `wpmu_signup_blog_notification()`. Follow-up to [https://mu.trac.wordpress.org/changeset/1970 mu:1970]. Props debarghyabanerjee. See #62283. git-svn-id: https://develop.svn.wordpress.org/trunk@59560 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/ms-functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/ms-functions.php b/src/wp-includes/ms-functions.php index d17de7ead01da..7cfb403e9e289 100644 --- a/src/wp-includes/ms-functions.php +++ b/src/wp-includes/ms-functions.php @@ -941,7 +941,7 @@ function wpmu_signup_blog_notification( $domain, $path, $title, $user_login, $us } // Send email with activation link. - if ( ! is_subdomain_install() || get_current_network_id() != 1 ) { + if ( ! is_subdomain_install() || get_current_network_id() !== 1 ) { $activate_url = network_site_url( "wp-activate.php?key=$key" ); } else { $activate_url = "http://{$domain}{$path}wp-activate.php?key=$key"; // @todo Use *_url() API. From 27bb7ac2349eb81eb4e0ff5d275ff4ff3b98f3c4 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Wed, 25 Dec 2024 18:29:51 +0000 Subject: [PATCH 141/323] Coding Standards: Use strict comparison in `remove_user_from_blog()`. Follow-up to [https://mu.trac.wordpress.org/changeset/543 mu:543]. Props debarghyabanerjee, aristath, poena, afercia, SergeyBiryukov. See #62279, #62283. git-svn-id: https://develop.svn.wordpress.org/trunk@59561 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/ms-functions.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/ms-functions.php b/src/wp-includes/ms-functions.php index 7cfb403e9e289..9f1889fda6b36 100644 --- a/src/wp-includes/ms-functions.php +++ b/src/wp-includes/ms-functions.php @@ -230,8 +230,10 @@ function add_user_to_blog( $blog_id, $user_id, $role ) { function remove_user_from_blog( $user_id, $blog_id = 0, $reassign = 0 ) { global $wpdb; - switch_to_blog( $blog_id ); $user_id = (int) $user_id; + $blog_id = (int) $blog_id; + + switch_to_blog( $blog_id ); /** * Fires before a user is removed from a site. @@ -249,13 +251,13 @@ function remove_user_from_blog( $user_id, $blog_id = 0, $reassign = 0 ) { * If being removed from the primary blog, set a new primary * if the user is assigned to multiple blogs. */ - $primary_blog = get_user_meta( $user_id, 'primary_blog', true ); - if ( $primary_blog == $blog_id ) { + $primary_blog = (int) get_user_meta( $user_id, 'primary_blog', true ); + if ( $primary_blog === $blog_id ) { $new_id = ''; $new_domain = ''; $blogs = get_blogs_of_user( $user_id ); foreach ( (array) $blogs as $blog ) { - if ( $blog->userblog_id == $blog_id ) { + if ( $blog->userblog_id === $blog_id ) { continue; } $new_id = $blog->userblog_id; From 20110f63aac507e2b64bb2b6270471957dec8ca3 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Thu, 26 Dec 2024 23:55:05 +0000 Subject: [PATCH 142/323] Coding Standards: Use strict comparison in `get_active_blog_for_user()`. Follow-up to [https://mu.trac.wordpress.org/changeset/804 mu:804], [https://mu.trac.wordpress.org/changeset/1918 mu:1918]. Props debarghyabanerjee, aristath, poena, afercia, SergeyBiryukov. See #62279, #62283. git-svn-id: https://develop.svn.wordpress.org/trunk@59562 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/ms-functions.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/ms-functions.php b/src/wp-includes/ms-functions.php index 9f1889fda6b36..fdbcc6fb78e83 100644 --- a/src/wp-includes/ms-functions.php +++ b/src/wp-includes/ms-functions.php @@ -71,18 +71,23 @@ function get_active_blog_for_user( $user_id ) { } } - if ( ( ! is_object( $primary ) ) || ( 1 == $primary->archived || 1 == $primary->spam || 1 == $primary->deleted ) ) { + if ( ( ! is_object( $primary ) ) + || ( '1' === $primary->archived || '1' === $primary->spam || '1' === $primary->deleted ) + ) { $blogs = get_blogs_of_user( $user_id, true ); // If a user's primary blog is shut down, check their other blogs. $ret = false; if ( is_array( $blogs ) && count( $blogs ) > 0 ) { foreach ( (array) $blogs as $blog_id => $blog ) { - if ( get_current_network_id() != $blog->site_id ) { + if ( get_current_network_id() !== $blog->site_id ) { continue; } + $details = get_site( $blog_id ); - if ( is_object( $details ) && 0 == $details->archived && 0 == $details->spam && 0 == $details->deleted ) { + if ( is_object( $details ) + && '0' === $details->archived && '0' === $details->spam && '0' === $details->deleted + ) { $ret = $details; - if ( get_user_meta( $user_id, 'primary_blog', true ) != $blog_id ) { + if ( (int) get_user_meta( $user_id, 'primary_blog', true ) !== $blog_id ) { update_user_meta( $user_id, 'primary_blog', $blog_id ); } if ( ! get_user_meta( $user_id, 'source_domain', true ) ) { From 779ed48a034c60a65cd1ac7ab35262e496e39c99 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Fri, 27 Dec 2024 23:00:41 +0000 Subject: [PATCH 143/323] Coding Standards: Use strict comparison in `is_user_spammy()`. Follow-up to [https://mu.trac.wordpress.org/changeset/1640 mu:1640]. Props debarghyabanerjee, aristath, poena, afercia, SergeyBiryukov. See #62279, #62283. git-svn-id: https://develop.svn.wordpress.org/trunk@59563 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/ms-functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/ms-functions.php b/src/wp-includes/ms-functions.php index fdbcc6fb78e83..e0ae1a0315f17 100644 --- a/src/wp-includes/ms-functions.php +++ b/src/wp-includes/ms-functions.php @@ -2304,7 +2304,7 @@ function is_user_spammy( $user = null ) { } } - return $user && isset( $user->spam ) && 1 == $user->spam; + return $user && isset( $user->spam ) && '1' === $user->spam; } /** From 4a6b12bea7761ec8f9037685aad3104285e15b21 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sat, 28 Dec 2024 22:08:19 +0000 Subject: [PATCH 144/323] Options, Meta APIs: Ensure `after_section` is printed for sections without any fields. This brings consistency with the `before_section` HTML content, which did get printed in `do_settings_sections()` regardless of whether the settings section has any fields attached. Follow-up to [8855], [21742], [54247]. Props alpipego, SergeyBiryukov. Fixes #62746. git-svn-id: https://develop.svn.wordpress.org/trunk@59564 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/template.php | 9 ++++--- .../phpunit/tests/admin/includesTemplate.php | 24 +++++++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/wp-admin/includes/template.php b/src/wp-admin/includes/template.php index 3bff8bc279b5f..a0d07696d3019 100644 --- a/src/wp-admin/includes/template.php +++ b/src/wp-admin/includes/template.php @@ -1784,12 +1784,11 @@ function do_settings_sections( $page ) { call_user_func( $section['callback'], $section ); } - if ( ! isset( $wp_settings_fields ) || ! isset( $wp_settings_fields[ $page ] ) || ! isset( $wp_settings_fields[ $page ][ $section['id'] ] ) ) { - continue; + if ( isset( $wp_settings_fields[ $page ][ $section['id'] ] ) ) { + echo '<table class="form-table" role="presentation">'; + do_settings_fields( $page, $section['id'] ); + echo '</table>'; } - echo '<table class="form-table" role="presentation">'; - do_settings_fields( $page, $section['id'] ); - echo '</table>'; if ( '' !== $section['after_section'] ) { echo wp_kses_post( $section['after_section'] ); diff --git a/tests/phpunit/tests/admin/includesTemplate.php b/tests/phpunit/tests/admin/includesTemplate.php index f24a046933922..66e3befd5f07b 100644 --- a/tests/phpunit/tests/admin/includesTemplate.php +++ b/tests/phpunit/tests/admin/includesTemplate.php @@ -240,6 +240,30 @@ public function test_add_settings_section_with_extra_args( $extra_args, $expecte $this->assertStringContainsString( $expected_after_section_html, $output, 'Test page output does not contain the custom markup to be placed after the section.' ); } + /** + * @ticket 62746 + * + * @param array $extra_args Extra arguments to pass to function `add_settings_section()`. + * @param array $expected_section_data Expected set of section data. + * @param string $expected_before_section_html Expected HTML markup to be rendered before the settings section. + * @param string $expected_after_section_html Expected HTML markup to be rendered after the settings section. + * + * @covers ::add_settings_section + * @covers ::do_settings_sections + * + * @dataProvider data_extra_args_for_add_settings_section + */ + public function test_add_settings_section_without_any_fields( $extra_args, $expected_section_data, $expected_before_section_html, $expected_after_section_html ) { + add_settings_section( 'test-section', 'Section title', '__return_false', 'test-page', $extra_args ); + + ob_start(); + do_settings_sections( 'test-page' ); + $output = ob_get_clean(); + + $this->assertStringContainsString( $expected_before_section_html, $output, 'Test page output does not contain the custom markup to be placed before the section.' ); + $this->assertStringContainsString( $expected_after_section_html, $output, 'Test page output does not contain the custom markup to be placed after the section.' ); + } + /** * Data provider for `test_add_settings_section_with_extra_args()`. * From 4e1752dee97eb3454c7a6da9176b8890d7c371a8 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sun, 29 Dec 2024 21:52:34 +0000 Subject: [PATCH 145/323] Coding Standards: Use strict comparison in `sanitize_post()`. Follow-up to [12062]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59565 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index eb90e762f5663..cadc929457979 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -2823,7 +2823,7 @@ function is_sticky( $post_id = 0 ) { function sanitize_post( $post, $context = 'display' ) { if ( is_object( $post ) ) { // Check if post already filtered for this context. - if ( isset( $post->filter ) && $context == $post->filter ) { + if ( isset( $post->filter ) && $context === $post->filter ) { return $post; } if ( ! isset( $post->ID ) ) { @@ -2835,7 +2835,7 @@ function sanitize_post( $post, $context = 'display' ) { $post->filter = $context; } elseif ( is_array( $post ) ) { // Check if post already filtered for this context. - if ( isset( $post['filter'] ) && $context == $post['filter'] ) { + if ( isset( $post['filter'] ) && $context === $post['filter'] ) { return $post; } if ( ! isset( $post['ID'] ) ) { From 2ba84334c9d412956322544564c1a8e32fb56363 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Mon, 30 Dec 2024 09:30:14 +0000 Subject: [PATCH 146/323] Coding Standards: Use strict comparison in `get_post_ancestors()`. Follow-up to [7074], [15758], [21559], [21953]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59566 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index cadc929457979..dfdd41ed5ef93 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -1135,7 +1135,7 @@ function get_post( $post = null, $output = OBJECT, $filter = 'raw' ) { function get_post_ancestors( $post ) { $post = get_post( $post ); - if ( ! $post || empty( $post->post_parent ) || $post->post_parent == $post->ID ) { + if ( ! $post || empty( $post->post_parent ) || $post->post_parent === $post->ID ) { return array(); } @@ -1146,7 +1146,9 @@ function get_post_ancestors( $post ) { while ( $ancestor = get_post( $id ) ) { // Loop detection: If the ancestor has been seen before, break. - if ( empty( $ancestor->post_parent ) || ( $ancestor->post_parent == $post->ID ) || in_array( $ancestor->post_parent, $ancestors, true ) ) { + if ( empty( $ancestor->post_parent ) || $ancestor->post_parent === $post->ID + || in_array( $ancestor->post_parent, $ancestors, true ) + ) { break; } From 7fedfd4dc13200edb7a1e467d78b619cd7235b92 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Tue, 31 Dec 2024 19:17:10 +0000 Subject: [PATCH 147/323] Coding Standards: Use strict comparison in `wp_count_attachments()`. Follow-up to [54255]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59567 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index dfdd41ed5ef93..3c3a422430324 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -3390,7 +3390,8 @@ function wp_count_attachments( $mime_type = '' ) { ); $counts = wp_cache_get( $cache_key, 'counts' ); - if ( false == $counts ) { + + if ( false === $counts ) { $and = wp_post_mime_type_where( $mime_type ); $count = $wpdb->get_results( "SELECT post_mime_type, COUNT( * ) AS num_posts FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status != 'trash' $and GROUP BY post_mime_type", ARRAY_A ); From de14028c7637ccfb0746311dd4da0c040f49126a Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Wed, 1 Jan 2025 00:10:57 +0000 Subject: [PATCH 148/323] =?UTF-8?q?Happy=20New=20Year!=20=F0=9F=8E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update copyright year to 2025 in `license.txt` and bundled themes. Follow-up to [18201], [23306], [28064], [36855], [36856], [39659], [40241], [42424], [46719], [46720], [47025], [47026], [49915], [52427], [55024], [57235]. git-svn-id: https://develop.svn.wordpress.org/trunk@59568 602fd350-edb4-49c9-b593-d223f7449a82 --- src/license.txt | 2 +- src/wp-content/themes/twentyeleven/readme.txt | 2 +- src/wp-content/themes/twentyfifteen/readme.txt | 2 +- src/wp-content/themes/twentyfourteen/readme.txt | 2 +- src/wp-content/themes/twentynineteen/readme.txt | 4 ++-- src/wp-content/themes/twentyseventeen/readme.txt | 2 +- src/wp-content/themes/twentysixteen/readme.txt | 2 +- src/wp-content/themes/twentyten/readme.txt | 2 +- src/wp-content/themes/twentythirteen/readme.txt | 2 +- src/wp-content/themes/twentytwelve/readme.txt | 2 +- src/wp-content/themes/twentytwenty/readme.txt | 8 ++++---- src/wp-content/themes/twentytwentyfour/readme.txt | 2 +- src/wp-content/themes/twentytwentyone/readme.txt | 12 ++++++------ src/wp-content/themes/twentytwentythree/readme.txt | 2 +- src/wp-content/themes/twentytwentytwo/readme.txt | 2 +- 15 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/license.txt b/src/license.txt index 90cf5383fe5a4..a22eda8f3bbf4 100644 --- a/src/license.txt +++ b/src/license.txt @@ -1,6 +1,6 @@ WordPress - Web publishing software -Copyright 2011-2024 by the contributors +Copyright 2011-2025 by the contributors This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/src/wp-content/themes/twentyeleven/readme.txt b/src/wp-content/themes/twentyeleven/readme.txt index 16d4d11e26b57..f8d794b9b8a23 100644 --- a/src/wp-content/themes/twentyeleven/readme.txt +++ b/src/wp-content/themes/twentyeleven/readme.txt @@ -23,7 +23,7 @@ For more information about Twenty Eleven please go to https://codex.wordpress.or == Copyright == -Twenty Eleven WordPress Theme, Copyright 2011-2024 WordPress.org, Automattic Inc., and contributors. +Twenty Eleven WordPress Theme, Copyright 2011-2025 WordPress.org, Automattic Inc., and contributors. Twenty Eleven is Distributed under the terms of the GNU GPL This program is free software: you can redistribute it and/or modify diff --git a/src/wp-content/themes/twentyfifteen/readme.txt b/src/wp-content/themes/twentyfifteen/readme.txt index 358101e7a55af..2fd9ff16029ad 100644 --- a/src/wp-content/themes/twentyfifteen/readme.txt +++ b/src/wp-content/themes/twentyfifteen/readme.txt @@ -31,7 +31,7 @@ For more information about Twenty Fifteen please go to https://wordpress.org/doc == Copyright == -Twenty Fifteen WordPress Theme, Copyright 2014-2024 WordPress.org, Automattic Inc., and contributors. +Twenty Fifteen WordPress Theme, Copyright 2014-2025 WordPress.org, Automattic Inc., and contributors. Twenty Fifteen is distributed under the terms of the GNU GPL This program is free software: you can redistribute it and/or modify diff --git a/src/wp-content/themes/twentyfourteen/readme.txt b/src/wp-content/themes/twentyfourteen/readme.txt index a54226a83f7fb..af119167596ea 100644 --- a/src/wp-content/themes/twentyfourteen/readme.txt +++ b/src/wp-content/themes/twentyfourteen/readme.txt @@ -23,7 +23,7 @@ For more information about Twenty Fourteen please go to https://codex.wordpress. == Copyright == -Twenty Fourteen WordPress Theme, Copyright 2013-2024 WordPress.org, Automattic Inc., and contributors. +Twenty Fourteen WordPress Theme, Copyright 2013-2025 WordPress.org, Automattic Inc., and contributors. Twenty Fourteen is Distributed under the terms of the GNU GPL This program is free software: you can redistribute it and/or modify diff --git a/src/wp-content/themes/twentynineteen/readme.txt b/src/wp-content/themes/twentynineteen/readme.txt index d3ca13553e2d1..e30e9291c221d 100644 --- a/src/wp-content/themes/twentynineteen/readme.txt +++ b/src/wp-content/themes/twentynineteen/readme.txt @@ -25,7 +25,7 @@ For more information about Twenty Nineteen please go to https://wordpress.org/do == Copyright == -Twenty Nineteen WordPress Theme, Copyright 2018-2024 WordPress.org, and contributors. +Twenty Nineteen WordPress Theme, Copyright 2018-2025 WordPress.org, and contributors. Twenty Nineteen is distributed under the terms of the GNU GPL This program is free software: you can redistribute it and/or modify @@ -147,7 +147,7 @@ Initial release == Resources == * normalize.css, © 2012-2018 Nicolas Gallagher and Jonathan Neal, MIT -* Underscores, © 2012-2024 Automattic, Inc., GNU GPL v2 or later +* Underscores, © 2012-2025 Automattic, Inc., GNU GPL v2 or later * Bundled block pattern images: * Abstract Background by HD Wallpapers, CC0. https://stocksnap.io/photo/abstract-background-0SRRVNMKBX * Abstract Waves by HD Wallpapers, CC0. https://stocksnap.io/photo/abstract-waves-0KREGLTZQ3 diff --git a/src/wp-content/themes/twentyseventeen/readme.txt b/src/wp-content/themes/twentyseventeen/readme.txt index c78ed84d89e3a..cc3246ea4d8e3 100644 --- a/src/wp-content/themes/twentyseventeen/readme.txt +++ b/src/wp-content/themes/twentyseventeen/readme.txt @@ -24,7 +24,7 @@ For more information about Twenty Seventeen please go to https://wordpress.org/d == Copyright == -Twenty Seventeen WordPress Theme, Copyright 2016-2024 WordPress.org, and contributors. +Twenty Seventeen WordPress Theme, Copyright 2016-2025 WordPress.org, and contributors. Twenty Seventeen is distributed under the terms of the GNU GPL This program is free software: you can redistribute it and/or modify diff --git a/src/wp-content/themes/twentysixteen/readme.txt b/src/wp-content/themes/twentysixteen/readme.txt index 6891502fe3b5e..e5a5a2776773d 100644 --- a/src/wp-content/themes/twentysixteen/readme.txt +++ b/src/wp-content/themes/twentysixteen/readme.txt @@ -30,7 +30,7 @@ For more information about Twenty Sixteen please go to https://wordpress.org/doc == Copyright == -Twenty Sixteen WordPress Theme, Copyright 2014-2024 WordPress.org, and contributors. +Twenty Sixteen WordPress Theme, Copyright 2014-2025 WordPress.org, and contributors. Twenty Sixteen is distributed under the terms of the GNU GPL This program is free software: you can redistribute it and/or modify diff --git a/src/wp-content/themes/twentyten/readme.txt b/src/wp-content/themes/twentyten/readme.txt index 1127216542e5d..f0e8c057cfb64 100644 --- a/src/wp-content/themes/twentyten/readme.txt +++ b/src/wp-content/themes/twentyten/readme.txt @@ -23,7 +23,7 @@ For more information about Twenty Ten theme please go to https://codex.wordpress == Copyright == -Twenty Ten WordPress Theme, Copyright 2010-2024 WordPress.org, Automattic Inc., and contributors. +Twenty Ten WordPress Theme, Copyright 2010-2025 WordPress.org, Automattic Inc., and contributors. Twenty Ten is Distributed under the terms of the GNU GPL This program is free software: you can redistribute it and/or modify diff --git a/src/wp-content/themes/twentythirteen/readme.txt b/src/wp-content/themes/twentythirteen/readme.txt index e02e6eae1cc07..94261e7c4c002 100644 --- a/src/wp-content/themes/twentythirteen/readme.txt +++ b/src/wp-content/themes/twentythirteen/readme.txt @@ -23,7 +23,7 @@ For more information about Twenty Thirteen please go to https://codex.wordpress. == Copyright == -Twenty Thirteen WordPress Theme, Copyright 2013-2024 WordPress.org, Automattic Inc., and contributors. +Twenty Thirteen WordPress Theme, Copyright 2013-2025 WordPress.org, Automattic Inc., and contributors. Twenty Thirteen is Distributed under the terms of the GNU GPL This program is free software: you can redistribute it and/or modify diff --git a/src/wp-content/themes/twentytwelve/readme.txt b/src/wp-content/themes/twentytwelve/readme.txt index 3e716ee1b4ab7..f746e9add5048 100644 --- a/src/wp-content/themes/twentytwelve/readme.txt +++ b/src/wp-content/themes/twentytwelve/readme.txt @@ -23,7 +23,7 @@ For more information about Twenty Twelve please go to https://codex.wordpress.or == Copyright == -Twenty Twelve WordPress Theme, Copyright 2012-2024 WordPress.org, Automattic Inc., and contributors. +Twenty Twelve WordPress Theme, Copyright 2012-2025 WordPress.org, Automattic Inc., and contributors. Twenty Twelve is Distributed under the terms of the GNU GPL This program is free software: you can redistribute it and/or modify diff --git a/src/wp-content/themes/twentytwenty/readme.txt b/src/wp-content/themes/twentytwenty/readme.txt index 293baaef7c382..cd5d4b01d62c3 100644 --- a/src/wp-content/themes/twentytwenty/readme.txt +++ b/src/wp-content/themes/twentytwenty/readme.txt @@ -121,7 +121,7 @@ Initial release == Copyright == -Twenty Twenty WordPress Theme, Copyright 2019-2024 WordPress.org and contributors. +Twenty Twenty WordPress Theme, Copyright 2019-2025 WordPress.org and contributors. Twenty Twenty is distributed under the terms of the GNU GPL. This program is free software: you can redistribute it and/or modify @@ -170,7 +170,7 @@ License URI: http://www.gnu.org/licenses/gpl-2.0.html Source: WordPress Social Link Block (See wp-includes\blocks\social-link.php) Code from Twenty Nineteen -Copyright (c) 2018-2024 WordPress.org +Copyright (c) 2018-2025 WordPress.org License: GPLv2 Source: https://wordpress.org/themes/twentynineteen/ Included as part of the following classes and functions: @@ -180,11 +180,11 @@ Included as part of the following classes and functions: - twentytwenty_nav_menu_social_icons() Code from Twenty Seventeen -Copyright (c) 2016-2024 WordPress.org +Copyright (c) 2016-2025 WordPress.org License: GPLv2 Source: https://wordpress.org/themes/twentyseventeen/ Included as part of the following classes and functions: - twentytwenty_unique_id() Underscores -https://underscores.me/, (C) 2012-2024 Automattic, Inc., [GPLv2 or later](https://www.gnu.org/licenses/gpl-2.0.html) +https://underscores.me/, (C) 2012-2025 Automattic, Inc., [GPLv2 or later](https://www.gnu.org/licenses/gpl-2.0.html) diff --git a/src/wp-content/themes/twentytwentyfour/readme.txt b/src/wp-content/themes/twentytwentyfour/readme.txt index 8008a10b2fd9b..299a63d4c997c 100644 --- a/src/wp-content/themes/twentytwentyfour/readme.txt +++ b/src/wp-content/themes/twentytwentyfour/readme.txt @@ -35,7 +35,7 @@ https://wordpress.org/documentation/article/twenty-twenty-four-changelog/#Versio == Copyright == -Twenty Twenty-Four WordPress Theme, (C) 2023-2024 WordPress.org and contributors. +Twenty Twenty-Four WordPress Theme, (C) 2023-2025 WordPress.org and contributors. Twenty Twenty-Four is distributed under the terms of the GNU GPL. This program is free software: you can redistribute it and/or modify diff --git a/src/wp-content/themes/twentytwentyone/readme.txt b/src/wp-content/themes/twentytwentyone/readme.txt index e0c9e6949c2d5..b955225ca6a83 100644 --- a/src/wp-content/themes/twentytwentyone/readme.txt +++ b/src/wp-content/themes/twentytwentyone/readme.txt @@ -107,7 +107,7 @@ https://wordpress.org/documentation/article/twenty-twenty-one-changelog/#Version == Copyright == -Twenty Twenty-One WordPress Theme, 2020-2024 WordPress.org and contributors. +Twenty Twenty-One WordPress Theme, 2020-2025 WordPress.org and contributors. Twenty Twenty-One is distributed under the terms of the GNU GPL. This program is free software: you can redistribute it and/or modify @@ -125,19 +125,19 @@ Twenty Twenty-One is derived from Seedlet, (C) 2020 Automattic, Inc. Twenty Twenty-One is also based on: -Twenty Nineteen. 2018-2024 WordPress.org +Twenty Nineteen. 2018-2025 WordPress.org Twenty Nineteen is distributed under the terms of the GNU GPL v2 or later. -Twenty Seventeen. Copyright (C) 2016-2024 WordPress.org +Twenty Seventeen. Copyright (C) 2016-2025 WordPress.org Twenty Seventeen is distributed under the terms of the GNU GPL v2 or later. -Twenty Sixteen. Copyright (C) 2015-2024 WordPress.org +Twenty Sixteen. Copyright (C) 2015-2025 WordPress.org Twenty Sixteen is distributed under the terms of the GNU GPL v2 or later. -Twenty Twenty. Copyright (C) 2020-2024 WordPress.org +Twenty Twenty. Copyright (C) 2020-2025 WordPress.org Twenty Twenty is distributed under the terms of the GNU GPL v2 or later. -Underscores https://underscores.me/, Copyright (C) 2012-2024 Automattic, Inc. +Underscores https://underscores.me/, Copyright (C) 2012-2025 Automattic, Inc. Underscores is distributed under the terms of the GNU GPL v2 or later. Normalizing styles have been helped along thanks to the fine work of diff --git a/src/wp-content/themes/twentytwentythree/readme.txt b/src/wp-content/themes/twentytwentythree/readme.txt index 237758249f85d..9e4653b7f4ec4 100644 --- a/src/wp-content/themes/twentytwentythree/readme.txt +++ b/src/wp-content/themes/twentytwentythree/readme.txt @@ -52,7 +52,7 @@ https://wordpress.org/documentation/article/twenty-twenty-three-changelog/#Versi == Copyright == -Twenty Twenty-Three WordPress Theme, (C) 2022-2024 WordPress.org and contributors. +Twenty Twenty-Three WordPress Theme, (C) 2022-2025 WordPress.org and contributors. Twenty Twenty-Three is distributed under the terms of the GNU GPL. This program is free software: you can redistribute it and/or modify diff --git a/src/wp-content/themes/twentytwentytwo/readme.txt b/src/wp-content/themes/twentytwentytwo/readme.txt index d2635dbfe0207..ace8251b15899 100644 --- a/src/wp-content/themes/twentytwentytwo/readme.txt +++ b/src/wp-content/themes/twentytwentytwo/readme.txt @@ -91,7 +91,7 @@ https://wordpress.org/documentation/article/twenty-twenty-two-changelog/#Version == Copyright == -Twenty Twenty-Two WordPress Theme, 2021-2024 WordPress.org and contributors. +Twenty Twenty-Two WordPress Theme, 2021-2025 WordPress.org and contributors. Twenty Twenty-Two is distributed under the terms of the GNU GPL. This program is free software: you can redistribute it and/or modify From 238f8657d7a06e5077e6177e308c464c73754a8e Mon Sep 17 00:00:00 2001 From: Peter Wilson <peterwilsoncc@git.wordpress.org> Date: Thu, 2 Jan 2025 01:06:38 +0000 Subject: [PATCH 149/323] =?UTF-8?q?Happy=20New=20Year=20Twenty=20Twenty-Fi?= =?UTF-8?q?ve!=20=F0=9F=8E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update copyright year to 2025 in the Twenty Twenty-Five bundled theme's `readme.txt`. Follow-up to [18201], [23306], [28064], [36855], [36856], [39659], [40241], [42424], [46719], [46720], [47025], [47026], [49915], [52427], [55024], [57235], [59568]. git-svn-id: https://develop.svn.wordpress.org/trunk@59569 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-content/themes/twentytwentyfive/readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-content/themes/twentytwentyfive/readme.txt b/src/wp-content/themes/twentytwentyfive/readme.txt index c04796c2e7343..b4dc89e9c9fe6 100644 --- a/src/wp-content/themes/twentytwentyfive/readme.txt +++ b/src/wp-content/themes/twentytwentyfive/readme.txt @@ -17,7 +17,7 @@ Twenty Twenty-Five emphasizes simplicity and adaptability. It offers flexible de == Copyright == -Twenty Twenty-Five WordPress Theme, (C) 2024 WordPress.org and contributors. +Twenty Twenty-Five WordPress Theme, (C) 2024-2025 WordPress.org and contributors. Twenty Twenty-Five is distributed under the terms of the GNU GPL. This program is free software: you can redistribute it and/or modify From 5948245e57bdbf18b45568b3bb9b5566a9e8d907 Mon Sep 17 00:00:00 2001 From: Felix Arntz <flixos90@git.wordpress.org> Date: Thu, 2 Jan 2025 16:11:14 +0000 Subject: [PATCH 150/323] Build/Test Tools: Fix incorrect commit time being reported to WordPress Code Vitals Dashboard. Props mukesh27, ayeshrajans. Fixes #62766. git-svn-id: https://develop.svn.wordpress.org/trunk@59570 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-performance.yml | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/.github/workflows/reusable-performance.yml b/.github/workflows/reusable-performance.yml index e5c29aa0b1849..c9dad187499ce 100644 --- a/.github/workflows/reusable-performance.yml +++ b/.github/workflows/reusable-performance.yml @@ -94,7 +94,6 @@ jobs: # - Compare results. # - Add workflow summary. # - Set the base sha. - # - Set commit details. # - Publish performance results. # - Ensure version-controlled files are not modified or deleted. performance: @@ -312,23 +311,12 @@ jobs: const baseRef = await github.rest.git.getRef({ owner: context.repo.owner, repo: context.repo.repo, ref: 'tags/${{ env.BASE_TAG }}' }); return baseRef.data.object.sha; - - name: Set commit details - # Only needed when publishing results. - if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached }} - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 - id: commit-timestamp - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const commit_details = await github.rest.git.getCommit({ owner: context.repo.owner, repo: context.repo.repo, commit_sha: context.sha }); - return parseInt((new Date( commit_details.data.author.date ).getTime() / 1000).toFixed(0)) - - name: Publish performance results # Only publish results on pushes to trunk. if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached }} env: BASE_SHA: ${{ steps.base-sha.outputs.result }} - COMMITTED_AT: ${{ steps.commit-timestamp.outputs.result }} + COMMITTED_AT: $(git show -s $GITHUB_SHA --format="%cI") CODEVITALS_PROJECT_TOKEN: ${{ secrets.CODEVITALS_PROJECT_TOKEN }} HOST_NAME: "www.codevitals.run" run: | From 7bd68355aac022d3fd336b292b650088bcedde08 Mon Sep 17 00:00:00 2001 From: Felix Arntz <flixos90@git.wordpress.org> Date: Thu, 2 Jan 2025 16:39:28 +0000 Subject: [PATCH 151/323] Build/Test Tools: Revert [59570]. The fix did not work properly and is causing performance data for commits to not be sent at all. It is therefore reverted until a proper solution has been implemented. See #62766. git-svn-id: https://develop.svn.wordpress.org/trunk@59571 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-performance.yml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/reusable-performance.yml b/.github/workflows/reusable-performance.yml index c9dad187499ce..e5c29aa0b1849 100644 --- a/.github/workflows/reusable-performance.yml +++ b/.github/workflows/reusable-performance.yml @@ -94,6 +94,7 @@ jobs: # - Compare results. # - Add workflow summary. # - Set the base sha. + # - Set commit details. # - Publish performance results. # - Ensure version-controlled files are not modified or deleted. performance: @@ -311,12 +312,23 @@ jobs: const baseRef = await github.rest.git.getRef({ owner: context.repo.owner, repo: context.repo.repo, ref: 'tags/${{ env.BASE_TAG }}' }); return baseRef.data.object.sha; + - name: Set commit details + # Only needed when publishing results. + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached }} + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + id: commit-timestamp + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const commit_details = await github.rest.git.getCommit({ owner: context.repo.owner, repo: context.repo.repo, commit_sha: context.sha }); + return parseInt((new Date( commit_details.data.author.date ).getTime() / 1000).toFixed(0)) + - name: Publish performance results # Only publish results on pushes to trunk. if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached }} env: BASE_SHA: ${{ steps.base-sha.outputs.result }} - COMMITTED_AT: $(git show -s $GITHUB_SHA --format="%cI") + COMMITTED_AT: ${{ steps.commit-timestamp.outputs.result }} CODEVITALS_PROJECT_TOKEN: ${{ secrets.CODEVITALS_PROJECT_TOKEN }} HOST_NAME: "www.codevitals.run" run: | From 016bbeca9bfe96b3e024441059b76a3ad7d31df9 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Thu, 2 Jan 2025 18:25:59 +0000 Subject: [PATCH 152/323] Coding Standards: Use strict comparison in `_reset_front_page_settings_for_post()`. Follow-up to [6337], [25686]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59572 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index 3c3a422430324..a197180d9e172 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -3859,11 +3859,11 @@ function _reset_front_page_settings_for_post( $post_id ) { * If the page is defined in option page_on_front or post_for_posts, * adjust the corresponding options. */ - if ( get_option( 'page_on_front' ) == $post->ID ) { + if ( (int) get_option( 'page_on_front' ) === $post->ID ) { update_option( 'show_on_front', 'posts' ); update_option( 'page_on_front', 0 ); } - if ( get_option( 'page_for_posts' ) == $post->ID ) { + if ( (int) get_option( 'page_for_posts' ) === $post->ID ) { update_option( 'page_for_posts', 0 ); } } From 8da02a8665521cb79d21241299284f362881ed7d Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Fri, 3 Jan 2025 22:55:42 +0000 Subject: [PATCH 153/323] Coding Standards: Use strict comparison in `wpmu_validate_blog_signup()`. Follow-up to [https://mu.trac.wordpress.org/changeset/8 mu:8], [https://mu.trac.wordpress.org/changeset/543 mu:543], [https://mu.trac.wordpress.org/changeset/550 mu:550], [https://mu.trac.wordpress.org/changeset/1364 mu:1364], [https://mu.trac.wordpress.org/changeset/1958 mu:1958], [12603], [32733]. Props debarghyabanerjee, aristath, poena, afercia, SergeyBiryukov. See #62279, #62283. git-svn-id: https://develop.svn.wordpress.org/trunk@59573 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/ms-functions.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/ms-functions.php b/src/wp-includes/ms-functions.php index e0ae1a0315f17..5bb3cab118bee 100644 --- a/src/wp-includes/ms-functions.php +++ b/src/wp-includes/ms-functions.php @@ -481,10 +481,12 @@ function wpmu_validate_user_signup( $user_name, $user_email ) { } $illegal_names = get_site_option( 'illegal_names' ); + if ( ! is_array( $illegal_names ) ) { $illegal_names = array( 'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator' ); add_site_option( 'illegal_names', $illegal_names ); } + if ( in_array( $user_name, $illegal_names, true ) ) { $errors->add( 'user_name', __( 'Sorry, that username is not allowed.' ) ); } @@ -516,10 +518,12 @@ function wpmu_validate_user_signup( $user_name, $user_email ) { } $limited_email_domains = get_site_option( 'limited_email_domains' ); + if ( is_array( $limited_email_domains ) && ! empty( $limited_email_domains ) ) { $limited_email_domains = array_map( 'strtolower', $limited_email_domains ); - $emaildomain = strtolower( substr( $user_email, 1 + strpos( $user_email, '@' ) ) ); - if ( ! in_array( $emaildomain, $limited_email_domains, true ) ) { + $email_domain = strtolower( substr( $user_email, 1 + strpos( $user_email, '@' ) ) ); + + if ( ! in_array( $email_domain, $limited_email_domains, true ) ) { $errors->add( 'user_email', __( 'Sorry, that email address is not allowed!' ) ); } } @@ -637,7 +641,8 @@ function wpmu_validate_blog_signup( $blogname, $blog_title, $user = '' ) { $errors = new WP_Error(); $illegal_names = get_site_option( 'illegal_names' ); - if ( false == $illegal_names ) { + + if ( ! is_array( $illegal_names ) ) { $illegal_names = array( 'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator' ); add_site_option( 'illegal_names', $illegal_names ); } @@ -721,7 +726,7 @@ function wpmu_validate_blog_signup( $blogname, $blog_title, $user = '' ) { * unless it's the user's own username. */ if ( username_exists( $blogname ) ) { - if ( ! is_object( $user ) || ( is_object( $user ) && ( $user->user_login != $blogname ) ) ) { + if ( ! is_object( $user ) || ( is_object( $user ) && ( $user->user_login !== $blogname ) ) ) { $errors->add( 'blogname', __( 'Sorry, that site is reserved!' ) ); } } From 8f6f8098efd1ff74da806b576a33b4ba152d17b3 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sat, 4 Jan 2025 10:25:13 +0000 Subject: [PATCH 154/323] Coding Standards: Replace loose comparison in `wpmu_welcome_notification()`. Follow-up to [https://mu.trac.wordpress.org/changeset/543 mu:543]. Props debarghyabanerjee, aristath, poena, afercia, SergeyBiryukov. Fixes #62283. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59574 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/ms-functions.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/ms-functions.php b/src/wp-includes/ms-functions.php index 5bb3cab118bee..77603313b2a2f 100644 --- a/src/wp-includes/ms-functions.php +++ b/src/wp-includes/ms-functions.php @@ -726,7 +726,7 @@ function wpmu_validate_blog_signup( $blogname, $blog_title, $user = '' ) { * unless it's the user's own username. */ if ( username_exists( $blogname ) ) { - if ( ! is_object( $user ) || ( is_object( $user ) && ( $user->user_login !== $blogname ) ) ) { + if ( ! is_object( $user ) || ( is_object( $user ) && $user->user_login !== $blogname ) ) { $errors->add( 'blogname', __( 'Sorry, that site is reserved!' ) ); } } @@ -1632,7 +1632,8 @@ function wpmu_welcome_notification( $blog_id, $user_id, $password, $title, $meta $switched_locale = switch_to_user_locale( $user_id ); $welcome_email = get_site_option( 'welcome_email' ); - if ( false == $welcome_email ) { + + if ( ! $welcome_email ) { /* translators: Do not translate USERNAME, SITE_NAME, BLOG_URL, PASSWORD: those are placeholders. */ $welcome_email = __( 'Howdy USERNAME, From bb3f90f97423bacf31717c2095bfc78945a94222 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sun, 5 Jan 2025 22:10:39 +0000 Subject: [PATCH 155/323] Coding Standards: Use strict comparison in `get_pages()`. Follow-up to [4180], [49108]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59575 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index a197180d9e172..4d85ef2fb25d7 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -6354,7 +6354,7 @@ function get_pages( $args = array() ) { $query_args['author__in'] = array(); foreach ( $post_authors as $post_author ) { // Do we have an author id or an author login? - if ( 0 == (int) $post_author ) { + if ( 0 === (int) $post_author ) { $post_author = get_user_by( 'login', $post_author ); if ( empty( $post_author ) ) { continue; From 938d27abf2362bb77f731c4ccd13a52c31a36674 Mon Sep 17 00:00:00 2001 From: Peter Wilson <peterwilsoncc@git.wordpress.org> Date: Sun, 5 Jan 2025 22:12:25 +0000 Subject: [PATCH 156/323] Comments: Noindex pages containing unapproved comments. Adds a `noindex` directive to pages displaying a preview of an unapproved comment, ie pages with both an `approved` and `moderation-hash` parameter. This is to prevent the pages from appearing in search engines which can be the case if they ignore the canonical URL directive. Props peterwilsoncc, flixos90, joostdevalk. Fixes #62760. git-svn-id: https://develop.svn.wordpress.org/trunk@59576 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/default-filters.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/default-filters.php b/src/wp-includes/default-filters.php index 9eff6ecbeb67a..575e8a91758f1 100644 --- a/src/wp-includes/default-filters.php +++ b/src/wp-includes/default-filters.php @@ -366,7 +366,13 @@ add_action( 'wp_enqueue_scripts', 'wp_enqueue_emoji_styles' ); add_action( 'wp_print_styles', 'print_emoji_styles' ); // Retained for backwards-compatibility. Unhooked by wp_enqueue_emoji_styles(). -if ( isset( $_GET['replytocom'] ) ) { +if ( + // Comment reply link. + isset( $_GET['replytocom'] ) + || + // Unapproved comment preview. + ( isset( $_GET['unapproved'] ) && isset( $_GET['moderation-hash'] ) ) +) { add_filter( 'wp_robots', 'wp_robots_no_robots' ); } From d6aa0438536bb5d12ca3c8e9c2fa5a84fb083dc1 Mon Sep 17 00:00:00 2001 From: Pascal Birchler <swissspidy@git.wordpress.org> Date: Mon, 6 Jan 2025 10:29:09 +0000 Subject: [PATCH 157/323] Build/Test Tools: Expand performance tests setup. Run tests against Multisite (possible since [58097]) and on single post pages. Also improve cache flushes/resets between iterations. Props swissspidy, flixos90, desrosj, mukesh27. Fixes #62725. git-svn-id: https://develop.svn.wordpress.org/trunk@59577 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/performance.yml | 4 +- .github/workflows/reusable-performance.yml | 28 +++++-- tests/performance/compare-results.js | 6 +- tests/performance/log-results.js | 14 +++- tests/performance/specs/admin.test.js | 9 ++- tests/performance/specs/home.test.js | 12 +-- tests/performance/specs/single-post.test.js | 79 +++++++++++++++++++ tests/performance/utils.js | 6 ++ .../wp-content/mu-plugins/clear-cache.php | 27 +++++++ 9 files changed, 164 insertions(+), 21 deletions(-) create mode 100644 tests/performance/specs/single-post.test.js create mode 100644 tests/performance/wp-content/mu-plugins/clear-cache.php diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index dba6091a5547a..dbb672a30da39 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -32,7 +32,7 @@ permissions: {} jobs: # Runs the performance test suite. performance: - name: Performance tests ${{ matrix.memcached && '(with memcached)' || '' }} + name: ${{ matrix.multisite && 'Multisite' || 'Single site' }} uses: WordPress/wordpress-develop/.github/workflows/reusable-performance.yml@trunk permissions: contents: read @@ -41,8 +41,10 @@ jobs: fail-fast: false matrix: memcached: [ true, false ] + multisite: [ true, false ] with: memcached: ${{ matrix.memcached }} + multisite: ${{ matrix.multisite }} secrets: CODEVITALS_PROJECT_TOKEN: ${{ secrets.CODEVITALS_PROJECT_TOKEN }} diff --git a/.github/workflows/reusable-performance.yml b/.github/workflows/reusable-performance.yml index e5c29aa0b1849..61c40b80a41db 100644 --- a/.github/workflows/reusable-performance.yml +++ b/.github/workflows/reusable-performance.yml @@ -1,7 +1,7 @@ ## # A reusable workflow that runs the performance test suite. ## -name: Performance Tests +name: Run performance Tests on: workflow_call: @@ -26,6 +26,11 @@ on: required: false type: 'boolean' default: false + multisite: + description: 'Whether to use Multisite.' + required: false + type: 'boolean' + default: false secrets: CODEVITALS_PROJECT_TOKEN: description: 'The authorization token for https://www.codevitals.run/project/wordpress.' @@ -53,6 +58,7 @@ env: LOCAL_PHP_MEMCACHED: ${{ inputs.memcached }} LOCAL_PHP: ${{ inputs.php-version }}${{ 'latest' != inputs.php-version && '-fpm' || '' }} + LOCAL_MULTISITE: ${{ inputs.multisite }} jobs: # Performs the following steps: @@ -65,9 +71,11 @@ jobs: # - Install Playwright browsers. # - Build WordPress. # - Start Docker environment. + # - Install object cache drop-in. # - Log running Docker containers. # - Docker debug information. # - Install WordPress. + # - Enable themes on Multisite. # - Install WordPress Importer plugin. # - Import mock data. # - Deactivate WordPress Importer plugin. @@ -98,7 +106,7 @@ jobs: # - Publish performance results. # - Ensure version-controlled files are not modified or deleted. performance: - name: Run tests + name: ${{ inputs.multisite && 'Multisite' || 'Single site' }} / ${{ inputs.memcached && 'Memcached' || 'Default' }} runs-on: ubuntu-latest permissions: contents: read @@ -166,6 +174,14 @@ jobs: - name: Install WordPress run: npm run env:install + - name: Enable themes on Multisite + if: ${{ inputs.multisite }} + run: | + npm run env:cli -- theme enable twentytwentyone --network --path=/var/www/${{ env.LOCAL_DIR }} + npm run env:cli -- theme enable twentytwentythree --network --path=/var/www/${{ env.LOCAL_DIR }} + npm run env:cli -- theme enable twentytwentyfour --network --path=/var/www/${{ env.LOCAL_DIR }} + npm run env:cli -- theme enable twentytwentyfive --network --path=/var/www/${{ env.LOCAL_DIR }} + - name: Install WordPress Importer plugin run: npm run env:cli -- plugin install wordpress-importer --activate --path=/var/www/${{ env.LOCAL_DIR }} @@ -290,7 +306,7 @@ jobs: uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 if: always() with: - name: performance-artifacts${{ inputs.memcached && '-memcached' || '' }}-${{ github.run_id }} + name: performance-artifacts${{ inputs.multisite && '-multisite' || '' }}${{ inputs.memcached && '-memcached' || '' }}-${{ github.run_id }} path: artifacts if-no-files-found: ignore include-hidden-files: true @@ -303,7 +319,7 @@ jobs: - name: Set the base sha # Only needed when publishing results. - if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached }} + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached && ! inputs.multisite }} uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 id: base-sha with: @@ -314,7 +330,7 @@ jobs: - name: Set commit details # Only needed when publishing results. - if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached }} + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached && ! inputs.multisite }} uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 id: commit-timestamp with: @@ -325,7 +341,7 @@ jobs: - name: Publish performance results # Only publish results on pushes to trunk. - if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached }} + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached && ! inputs.multisite }} env: BASE_SHA: ${{ steps.base-sha.outputs.result }} COMMITTED_AT: ${{ steps.commit-timestamp.outputs.result }} diff --git a/tests/performance/compare-results.js b/tests/performance/compare-results.js index c9d51e1a11117..c47de270f0727 100644 --- a/tests/performance/compare-results.js +++ b/tests/performance/compare-results.js @@ -96,6 +96,8 @@ if ( process.env.GITHUB_SHA ) { ); } +summaryMarkdown += `<details><summary>Results</summary>`; + for ( const { title, results } of afterStats ) { const prevStat = beforeStats.find( ( s ) => s.title === title ); @@ -143,10 +145,12 @@ for ( const { title, results } of afterStats ) { console.log( '(no results)' ); } - summaryMarkdown += `**${ title }**\n\n`; + summaryMarkdown += `<b>${ title }</b>\n\n`; summaryMarkdown += `${ formatAsMarkdownTable( rows ) }\n`; } +summaryMarkdown += `</details>`; + writeFileSync( join( process.env.WP_ARTIFACTS_PATH, '/performance-results.md' ), summaryMarkdown diff --git a/tests/performance/log-results.js b/tests/performance/log-results.js index 581c0d39868b5..3612780bb361f 100644 --- a/tests/performance/log-results.js +++ b/tests/performance/log-results.js @@ -18,12 +18,18 @@ const { median, parseFile, accumulateValues } = require( './utils' ); const testSuiteMap = { 'Admin › Locale: en_US': 'admin', 'Admin › Locale: de_DE': 'admin-l10n', - 'Front End › Theme: twentytwentyone, Locale: en_US': 'home-classic-theme', - 'Front End › Theme: twentytwentyone, Locale: de_DE': + 'Homepage › Theme: twentytwentyone, Locale: en_US': 'home-classic-theme', + 'Homepage › Theme: twentytwentyone, Locale: de_DE': 'home-classic-theme-l10n', - 'Front End › Theme: twentytwentythree, Locale: en_US': 'home-block-theme', - 'Front End › Theme: twentytwentythree, Locale: de_DE': + 'Homepage › Theme: twentytwentythree, Locale: en_US': 'home-block-theme', + 'Homepage › Theme: twentytwentythree, Locale: de_DE': 'home-block-theme-l10n', + 'Homepage › Theme: twentytwentyfour, Locale: en_US': 'home-twentytwentyfour', + 'Homepage › Theme: twentytwentyfour, Locale: de_DE': + 'home-twentytwentyfour-l10n', + 'Homepage › Theme: twentytwentyfive, Locale: en_US': 'home-twentytwentyfive', + 'Homepage › Theme: twentytwentyfive, Locale: de_DE': + 'home-twentytwentyfive-l10n', }; /** diff --git a/tests/performance/specs/admin.test.js b/tests/performance/specs/admin.test.js index 36bdd9c628aa1..3414fdd3dbed9 100644 --- a/tests/performance/specs/admin.test.js +++ b/tests/performance/specs/admin.test.js @@ -6,14 +6,12 @@ import { test } from '@wordpress/e2e-test-utils-playwright'; /** * Internal dependencies */ -import { camelCaseDashes } from '../utils'; +import { camelCaseDashes, locales } from '../utils'; const results = { timeToFirstByte: [], }; -const locales = [ 'en_US', 'de_DE' ]; - test.describe( 'Admin', () => { for ( const locale of locales ) { test.describe( `Locale: ${ locale }`, () => { @@ -47,9 +45,14 @@ test.describe( 'Admin', () => { const iterations = Number( process.env.TEST_RUNS ); for ( let i = 1; i <= iterations; i++ ) { test( `Measure load time metrics (${ i } of ${ iterations })`, async ( { + page, admin, metrics, } ) => { + // Clear caches using the clear-cache.php mu-plugin. Not actually loading the page. + await page.goto( '/?clear_cache' ); + + // This is the actual page to test. await admin.visitAdminPage( '/' ); const serverTiming = await metrics.getServerTiming(); diff --git a/tests/performance/specs/home.test.js b/tests/performance/specs/home.test.js index 004c8f03debd4..cd3de40518fe3 100644 --- a/tests/performance/specs/home.test.js +++ b/tests/performance/specs/home.test.js @@ -6,7 +6,7 @@ import { test } from '@wordpress/e2e-test-utils-playwright'; /** * Internal dependencies */ -import { camelCaseDashes } from '../utils'; +import { camelCaseDashes, themes, locales } from '../utils'; const results = { timeToFirstByte: [], @@ -14,11 +14,7 @@ const results = { lcpMinusTtfb: [], }; -const themes = [ 'twentytwentyone', 'twentytwentythree', 'twentytwentyfour', 'twentytwentyfive' ]; - -const locales = [ 'en_US', 'de_DE' ]; - -test.describe( 'Front End', () => { +test.describe( 'Homepage', () => { test.use( { storageState: {}, // User will be logged out. } ); @@ -54,6 +50,10 @@ test.describe( 'Front End', () => { page, metrics, } ) => { + // Clear caches using the clear-cache.php mu-plugin. Not actually loading the page. + await page.goto( '/?clear_cache' ); + + // This is the actual page to test. await page.goto( '/' ); const serverTiming = await metrics.getServerTiming(); diff --git a/tests/performance/specs/single-post.test.js b/tests/performance/specs/single-post.test.js new file mode 100644 index 0000000000000..dbdf6916ef2fd --- /dev/null +++ b/tests/performance/specs/single-post.test.js @@ -0,0 +1,79 @@ +/** + * WordPress dependencies + */ +import { test } from '@wordpress/e2e-test-utils-playwright'; + +/** + * Internal dependencies + */ +import { camelCaseDashes, themes, locales } from '../utils'; + +const results = { + timeToFirstByte: [], + largestContentfulPaint: [], + lcpMinusTtfb: [], +}; + +test.describe( 'Single Post', () => { + test.use( { + storageState: {}, // User will be logged out. + } ); + + for ( const theme of themes ) { + for ( const locale of locales ) { + test.describe( `Theme: ${ theme }, Locale: ${ locale }`, () => { + test.beforeAll( async ( { requestUtils } ) => { + await requestUtils.activateTheme( theme ); + await requestUtils.updateSiteSettings( { + language: 'en_US' === locale ? '' : locale, + } ); + } ); + + test.afterAll( async ( { requestUtils }, testInfo ) => { + await testInfo.attach( 'results', { + body: JSON.stringify( results, null, 2 ), + contentType: 'application/json', + } ); + + await requestUtils.updateSiteSettings( { + language: '', + } ); + + results.largestContentfulPaint = []; + results.timeToFirstByte = []; + results.lcpMinusTtfb = []; + } ); + + const iterations = Number( process.env.TEST_RUNS ); + for ( let i = 1; i <= iterations; i++ ) { + test( `Measure load time metrics (${ i } of ${ iterations })`, async ( { + page, + metrics, + } ) => { + // Clear caches using the clear-cache.php mu-plugin. Not actually loading the page. + await page.goto( '/?clear_cache' ); + + // This is the actual page to test. + await page.goto( '/2018/11/03/block-image/' ); + + const serverTiming = await metrics.getServerTiming(); + + for ( const [ key, value ] of Object.entries( + serverTiming + ) ) { + results[ camelCaseDashes( key ) ] ??= []; + results[ camelCaseDashes( key ) ].push( value ); + } + + const ttfb = await metrics.getTimeToFirstByte(); + const lcp = await metrics.getLargestContentfulPaint(); + + results.largestContentfulPaint.push( lcp ); + results.timeToFirstByte.push( ttfb ); + results.lcpMinusTtfb.push( lcp - ttfb ); + } ); + } + } ); + } + } +} ); diff --git a/tests/performance/utils.js b/tests/performance/utils.js index 4d023be586048..b7481dfd67605 100644 --- a/tests/performance/utils.js +++ b/tests/performance/utils.js @@ -6,6 +6,10 @@ const { join } = require( 'node:path' ); process.env.WP_ARTIFACTS_PATH ??= join( process.cwd(), 'artifacts' ); +const locales = [ 'en_US', 'de_DE' ]; + +const themes = [ 'twentytwentyone', 'twentytwentythree', 'twentytwentyfour', 'twentytwentyfive' ]; + /** * Parse test files into JSON objects. * @@ -189,4 +193,6 @@ module.exports = { standardDeviation, medianAbsoluteDeviation, accumulateValues, + themes, + locales, }; diff --git a/tests/performance/wp-content/mu-plugins/clear-cache.php b/tests/performance/wp-content/mu-plugins/clear-cache.php new file mode 100644 index 0000000000000..4d6ff4ea2c586 --- /dev/null +++ b/tests/performance/wp-content/mu-plugins/clear-cache.php @@ -0,0 +1,27 @@ +<?php + +add_action( + 'plugins_loaded', + static function () { + if ( isset( $_GET['clear_cache'] ) ) { + if ( function_exists( 'opcache_reset' ) ) { + opcache_reset(); + } + + if ( function_exists( 'apcu_clear_cache' ) ) { + apcu_clear_cache(); + } + + wp_cache_flush(); + + delete_expired_transients( true ); + + clearstatcache( true ); + + status_header( 202 ); + + die; + } + }, + 1 +); From 3a0717625f1f0d630ae0187fc495c3997e583078 Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Mon, 6 Jan 2025 15:21:26 +0000 Subject: [PATCH 158/323] Security: Enhance the `wp_hash()` function to support custom hashing algorithms. The default algorithm remains as md5, but this change allows any algorithm that's supported by `hash_hmac()` to be used instead. Props pushpenderindia, ayeshrajans, debarghyabanerjee, johnbillion Fixes #62005 git-svn-id: https://develop.svn.wordpress.org/trunk@59578 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/pluggable.php | 26 +++++++++++-- tests/phpunit/tests/functions/wpHash.php | 39 ++++++++++++++++++++ tests/phpunit/tests/pluggable/signatures.php | 1 + 3 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 tests/phpunit/tests/functions/wpHash.php diff --git a/src/wp-includes/pluggable.php b/src/wp-includes/pluggable.php index 3dd629fa1990c..d0b2d3602a980 100644 --- a/src/wp-includes/pluggable.php +++ b/src/wp-includes/pluggable.php @@ -2581,18 +2581,38 @@ function wp_salt( $scheme = 'auth' ) { if ( ! function_exists( 'wp_hash' ) ) : /** - * Gets hash of given string. + * Gets the hash of the given string. + * + * The default algorithm is md5 but can be changed to any algorithm supported by + * `hash_hmac()`. Use the `hash_hmac_algos()` function to check the supported + * algorithms. * * @since 2.0.3 + * @since 6.8.0 The `$algo` parameter was added. + * + * @throws InvalidArgumentException if the hashing algorithm is not supported. * * @param string $data Plain text to hash. * @param string $scheme Authentication scheme (auth, secure_auth, logged_in, nonce). + * @param string $algo Hashing algorithm to use. Default: 'md5'. * @return string Hash of $data. */ - function wp_hash( $data, $scheme = 'auth' ) { + function wp_hash( $data, $scheme = 'auth', $algo = 'md5' ) { $salt = wp_salt( $scheme ); - return hash_hmac( 'md5', $data, $salt ); + // Ensure the algorithm is supported by the hash_hmac function. + if ( ! in_array( $algo, hash_hmac_algos(), true ) ) { + throw new InvalidArgumentException( + sprintf( + /** translators: 1: Name of a cryptographic hash algorithm. 2: List of supported algorithms. */ + __( 'Unsupported hashing algorithm: %1$s. Supported algorithms are: %2$s' ), + $algo, + implode( ', ', hash_hmac_algos() ) + ) + ); + } + + return hash_hmac( $algo, $data, $salt ); } endif; diff --git a/tests/phpunit/tests/functions/wpHash.php b/tests/phpunit/tests/functions/wpHash.php new file mode 100644 index 0000000000000..63744b188dace --- /dev/null +++ b/tests/phpunit/tests/functions/wpHash.php @@ -0,0 +1,39 @@ +<?php + +/** + * Tests for the behavior of `wp_hash()` + * + * @group functions + * + * @covers ::wp_hash + */ +class Tests_Functions_wpHash extends WP_UnitTestCase { + + /** + * @dataProvider data_wp_hash_uses_specified_algorithm + * + * @ticket 62005 + */ + public function test_wp_hash_uses_specified_algorithm( string $algo, int $expected_length ) { + $hash = wp_hash( 'data', 'auth', $algo ); + + $this->assertSame( $expected_length, strlen( $hash ) ); + } + + public function data_wp_hash_uses_specified_algorithm() { + return array( + array( 'md5', 32 ), + array( 'sha1', 40 ), + array( 'sha256', 64 ), + ); + } + + /** + * @ticket 62005 + */ + public function test_wp_hash_throws_exception_on_invalid_algorithm() { + $this->expectException( 'InvalidArgumentException' ); + + wp_hash( 'data', 'auth', 'invalid' ); + } +} diff --git a/tests/phpunit/tests/pluggable/signatures.php b/tests/phpunit/tests/pluggable/signatures.php index 81fd079621916..8ac1dfb6966b6 100644 --- a/tests/phpunit/tests/pluggable/signatures.php +++ b/tests/phpunit/tests/pluggable/signatures.php @@ -209,6 +209,7 @@ public function get_pluggable_function_signatures() { 'wp_hash' => array( 'data', 'scheme' => 'auth', + 'algo' => 'md5', ), 'wp_hash_password' => array( 'password' ), 'wp_check_password' => array( From 375af8c6c6fe222fc4dacad6eed16f31a68061d7 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Mon, 6 Jan 2025 15:58:50 +0000 Subject: [PATCH 159/323] Tests: Improve the test for the copyright year in bundled themes' `readme.txt`. This aims to catch entries like `(C) 2024 WordPress.org` in addition to `Copyright 2024 WordPress.org`. Includes converting the test to use a data provider, so that messages could be displayed for each individual theme. Follow-up to [46719], [59569]. See #62280. git-svn-id: https://develop.svn.wordpress.org/trunk@59579 602fd350-edb4-49c9-b593-d223f7449a82 --- tests/phpunit/tests/theme.php | 40 ++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/tests/phpunit/tests/theme.php b/tests/phpunit/tests/theme.php index 248aaa833a02f..c18c4d434f44b 100644 --- a/tests/phpunit/tests/theme.php +++ b/tests/phpunit/tests/theme.php @@ -302,36 +302,38 @@ public function test_default_themes_have_textdomain() { /** * @ticket 48566 + * + * @dataProvider data_year_in_readme */ - public function test_year_in_readme() { + public function test_year_in_readme( $theme ) { // This test is designed to only run on trunk. $this->skipOnAutomatedBranches(); - foreach ( $this->default_themes as $theme ) { - $wp_theme = wp_get_theme( $theme ); - - $path_to_readme_txt = $wp_theme->get_theme_root() . '/' . $wp_theme->get_stylesheet() . '/readme.txt'; - $this->assertFileExists( $path_to_readme_txt ); + $wp_theme = wp_get_theme( $theme ); - $readme = file_get_contents( $path_to_readme_txt ); - $this_year = gmdate( 'Y' ); + $path_to_readme_txt = $wp_theme->get_theme_root() . '/' . $wp_theme->get_stylesheet() . '/readme.txt'; + $this->assertFileExists( $path_to_readme_txt ); - preg_match( '#Copyright (\d+) WordPress.org#', $readme, $matches ); - if ( $matches ) { - $readme_year = trim( $matches[1] ); + $readme = file_get_contents( $path_to_readme_txt ); + $this_year = gmdate( 'Y' ); - $this->assertSame( $this_year, $readme_year, "Bundled themes readme.txt's year needs to be updated to $this_year." ); - } - - preg_match( '#Copyright 20\d\d-(\d+) WordPress.org#', $readme, $matches ); - if ( $matches ) { - $readme_year = trim( $matches[1] ); + preg_match( '#(Copyright|\(C\)) (20\d\d-)?(\d+) WordPress.org#i', $readme, $matches ); + if ( $matches ) { + $readme_year = trim( $matches[3] ); - $this->assertSame( $this_year, $readme_year, "Bundled themes readme.txt's year needs to be updated to $this_year." ); - } + $this->assertSame( $this_year, $readme_year, "$theme readme.txt's year needs to be updated to $this_year." ); } } + public function data_year_in_readme() { + return array_map( + static function ( $theme ) { + return array( $theme ); + }, + $this->default_themes + ); + } + /** * @ticket 20897 * @expectedDeprecated get_theme_data From d49258b6f77d2dbeba9846a71bc474c2ec9a7690 Mon Sep 17 00:00:00 2001 From: Kelly Choyce-Dwan <ryelle@git.wordpress.org> Date: Mon, 6 Jan 2025 16:18:25 +0000 Subject: [PATCH 160/323] Help/About: Allow "See everything new" button to wrap On some screen sizes and languages, the "See everything new" button expands out of the content area. This change allows the button to wrap at all screen sizes, and updates the style of this button for wrapped text. Props franciscabusas22, sabernhardt, yogeshbhutka, sainathpoojary, im3dabasia1, audrasjb. Fixes #62380. git-svn-id: https://develop.svn.wordpress.org/trunk@59580 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/css/about.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/wp-admin/css/about.css b/src/wp-admin/css/about.css index 79f0254ad33b8..70af0337307ab 100644 --- a/src/wp-admin/css/about.css +++ b/src/wp-admin/css/about.css @@ -454,7 +454,12 @@ } .about__section a.button.button-hero { + padding-top: 1.1875rem; + padding-bottom: 1.1875rem; font-size: 1.5rem; + line-height: 1.4; + white-space: normal; + text-wrap: pretty; } .about__container ul { From 4a9a928dbcd1c91d3633c8de51614dd90d8ea0ac Mon Sep 17 00:00:00 2001 From: Felix Arntz <flixos90@git.wordpress.org> Date: Mon, 6 Jan 2025 21:19:51 +0000 Subject: [PATCH 161/323] Build/Test Tools: Fix incorrect commit time being reported to WordPress Code Vitals Dashboard. 2nd attempt of [59570]. Props mukesh27, ayeshrajans, swissspidy, desrosj. Fixes #62766. git-svn-id: https://develop.svn.wordpress.org/trunk@59582 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-performance.yml | 10 ++-------- tests/performance/log-results.js | 4 ++-- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/.github/workflows/reusable-performance.yml b/.github/workflows/reusable-performance.yml index 61c40b80a41db..f75cb6b3e4969 100644 --- a/.github/workflows/reusable-performance.yml +++ b/.github/workflows/reusable-performance.yml @@ -331,20 +331,14 @@ jobs: - name: Set commit details # Only needed when publishing results. if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached && ! inputs.multisite }} - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 - id: commit-timestamp - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const commit_details = await github.rest.git.getCommit({ owner: context.repo.owner, repo: context.repo.repo, commit_sha: context.sha }); - return parseInt((new Date( commit_details.data.author.date ).getTime() / 1000).toFixed(0)) + # Write to an environment variable to have the output available in later steps of the job. + run: echo "COMMITTED_AT=$(git show -s $GITHUB_SHA --format='%cI')" >> $GITHUB_ENV - name: Publish performance results # Only publish results on pushes to trunk. if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached && ! inputs.multisite }} env: BASE_SHA: ${{ steps.base-sha.outputs.result }} - COMMITTED_AT: ${{ steps.commit-timestamp.outputs.result }} CODEVITALS_PROJECT_TOKEN: ${{ secrets.CODEVITALS_PROJECT_TOKEN }} HOST_NAME: "www.codevitals.run" run: | diff --git a/tests/performance/log-results.js b/tests/performance/log-results.js index 3612780bb361f..f8214b68d4eb3 100644 --- a/tests/performance/log-results.js +++ b/tests/performance/log-results.js @@ -11,7 +11,7 @@ * External dependencies. */ const https = require( 'https' ); -const [ token, branch, hash, baseHash, timestamp, host ] = +const [ token, branch, hash, baseHash, date, host ] = process.argv.slice( 2 ); const { median, parseFile, accumulateValues } = require( './utils' ); @@ -87,7 +87,7 @@ const data = new TextEncoder().encode( branch, hash, baseHash, - timestamp: parseInt( timestamp, 10 ), + timestamp: date, metrics: metrics, baseMetrics: baseMetrics, } ) From d0e1e903fbfbd232f3032e74f6846acb0865d93c Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Tue, 7 Jan 2025 15:40:19 +0000 Subject: [PATCH 162/323] Tests: Fix `explode()` error for old DB versions on PHP 8.1+. On MySQL/MariaDB 5.5, the default value for `sql_mode` was a blank string. By itself this is not a problem. However, `$wpdb->get_var()` returns `null` when a variable has an empty value. One test method currently passes the result of `$wpdb->get_var( 'SELECT @@SESSION.sql_mode;' )` to `explode()` in order to reset the database to the pre-test method state. This causes an error when running PHP 8.1+, which deprecated the ability to pass `null` as a parameter of `explode()`. This edge case was undiscovered because these versions are not currently included in the automated testing matrix. See #62280. git-svn-id: https://develop.svn.wordpress.org/trunk@59583 602fd350-edb4-49c9-b593-d223f7449a82 --- tests/phpunit/tests/db.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/phpunit/tests/db.php b/tests/phpunit/tests/db.php index 3e06afcc1bf2c..57f5db65a2f5a 100644 --- a/tests/phpunit/tests/db.php +++ b/tests/phpunit/tests/db.php @@ -296,7 +296,7 @@ public function test_set_sql_mode() { $check_new_modes = $wpdb->get_var( 'SELECT @@SESSION.sql_mode;' ); $this->assertSameSets( $new_modes, explode( ',', $check_new_modes ) ); - $wpdb->set_sql_mode( explode( ',', $current_modes ) ); + $wpdb->set_sql_mode( empty( $current_modes ) ? array() : explode( ',', $current_modes ) ); } /** From 0134aa371e45a9dbe67aa1e8cc8908eb6fcd92e2 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Tue, 7 Jan 2025 15:46:25 +0000 Subject: [PATCH 163/323] Coding Standards: Use strict comparison in `wp_check_for_changed_slugs()`. Follow-up to [4556], [4637], [34685]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59584 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index 4d85ef2fb25d7..6d225470d2b4e 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -7207,12 +7207,14 @@ function wp_mime_type_icon( $mime = 0, $preferred_ext = '.png' ) { */ function wp_check_for_changed_slugs( $post_id, $post, $post_before ) { // Don't bother if it hasn't changed. - if ( $post->post_name == $post_before->post_name ) { + if ( $post->post_name === $post_before->post_name ) { return; } // We're only concerned with published, non-hierarchical objects. - if ( ! ( 'publish' === $post->post_status || ( 'attachment' === get_post_type( $post ) && 'inherit' === $post->post_status ) ) || is_post_type_hierarchical( $post->post_type ) ) { + if ( ! ( 'publish' === $post->post_status || ( 'attachment' === $post->post_type && 'inherit' === $post->post_status ) ) + || is_post_type_hierarchical( $post->post_type ) + ) { return; } From 615b03f51ad6e090af3d6e4fb6dc6cf69b4cf3ce Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Tue, 7 Jan 2025 15:51:30 +0000 Subject: [PATCH 164/323] Build/Test Tools: Test against MySQL 9.1. This is the latest innovation release from MySQL. Props johnbillion, jorbin. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59585 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/install-testing.yml | 6 ++++-- .github/workflows/local-docker-environment.yml | 6 ++++-- .github/workflows/phpunit-tests.yml | 6 +++--- .version-support-mysql.json | 1 + 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/.github/workflows/install-testing.yml b/.github/workflows/install-testing.yml index f40f044586c88..f347958e8b4ae 100644 --- a/.github/workflows/install-testing.yml +++ b/.github/workflows/install-testing.yml @@ -90,11 +90,13 @@ jobs: db-version: '8.4' - php: '7.3' db-version: '8.4' + # Only test the latest innovation release. + - db-version: '9.0' # MySQL 9.0+ will not work on PHP 7.2 & 7.3. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' - db-version: '9.0' + db-version: '9.1' - php: '7.3' - db-version: '9.0' + db-version: '9.1' services: database: diff --git a/.github/workflows/local-docker-environment.yml b/.github/workflows/local-docker-environment.yml index 17d078198c009..09b212e90ead5 100644 --- a/.github/workflows/local-docker-environment.yml +++ b/.github/workflows/local-docker-environment.yml @@ -90,11 +90,13 @@ jobs: exclude: # MySQL containers <= 5.5 do not exist or fail to start properly. - db-version: '5.5' + # Only test the latest innovation release. + - db-version: '9.0' # MySQL 9.0+ will not work on PHP 7.2 & 7.3. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' - db-version: '9.0' + db-version: '9.1' - php: '7.3' - db-version: '9.0' + db-version: '9.1' with: os: ${{ matrix.os }} diff --git a/.github/workflows/phpunit-tests.yml b/.github/workflows/phpunit-tests.yml index 3ea45fcdc331e..89f4c0ab64ff8 100644 --- a/.github/workflows/phpunit-tests.yml +++ b/.github/workflows/phpunit-tests.yml @@ -47,7 +47,7 @@ jobs: os: [ ubuntu-latest ] php: [ '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ] db-type: [ 'mysql' ] - db-version: [ '5.7', '8.0', '8.4', '9.0' ] + db-version: [ '5.7', '8.0', '8.4', '9.1' ] tests-domain: [ 'example.org' ] multisite: [ false, true ] memcached: [ false ] @@ -95,9 +95,9 @@ jobs: exclude: # MySQL 9.0+ will not work on PHP 7.2 & 7.3. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' - db-version: '9.0' + db-version: '9.1' - php: '7.3' - db-version: '9.0' + db-version: '9.1' with: os: ${{ matrix.os }} diff --git a/.version-support-mysql.json b/.version-support-mysql.json index f6cffac449cae..8616ffb294e43 100644 --- a/.version-support-mysql.json +++ b/.version-support-mysql.json @@ -1,5 +1,6 @@ { "6-8": [ + "9.1", "9.0", "8.4", "8.0", From 8c45570f5acaa9c46c77fb0f9749c2b681bafa7a Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Tue, 7 Jan 2025 15:57:22 +0000 Subject: [PATCH 165/323] Build/Test Tools: Test MariaDB innovation releases. MariaDB also follows the innovation release model. This adds testing for these releases to the test matrix and moves innovation versions to a new job in order to more clearly differentiate from LTS ones. The current innovation release for MariaDB is `11.6`. Props johnbillion, jorbin. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59586 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/phpunit-tests.yml | 61 ++++++++++++++++--- .../workflows/reusable-phpunit-tests-v3.yml | 7 ++- 2 files changed, 57 insertions(+), 11 deletions(-) diff --git a/.github/workflows/phpunit-tests.yml b/.github/workflows/phpunit-tests.yml index 89f4c0ab64ff8..81d9520b7021b 100644 --- a/.github/workflows/phpunit-tests.yml +++ b/.github/workflows/phpunit-tests.yml @@ -47,7 +47,7 @@ jobs: os: [ ubuntu-latest ] php: [ '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ] db-type: [ 'mysql' ] - db-version: [ '5.7', '8.0', '8.4', '9.1' ] + db-version: [ '5.7', '8.0', '8.4' ] tests-domain: [ 'example.org' ] multisite: [ false, true ] memcached: [ false ] @@ -91,14 +91,6 @@ jobs: multisite: false memcached: false report: true - - exclude: - # MySQL 9.0+ will not work on PHP 7.2 & 7.3. See https://core.trac.wordpress.org/ticket/61218. - - php: '7.2' - db-version: '9.1' - - php: '7.3' - db-version: '9.1' - with: os: ${{ matrix.os }} php: ${{ matrix.php }} @@ -154,6 +146,55 @@ jobs: phpunit-config: ${{ matrix.multisite && 'tests/phpunit/multisite.xml' || 'phpunit.xml.dist' }} report: ${{ matrix.report || false }} + # + # Creates PHPUnit test jobs to test MariaDB and MySQL innovation releases. + # + # Though innovation releases are deemed "production grade" and never receive LTS status, they include new features + # and updates that will be included in the next LTS version. + # + # Because upstream support for innovation releases gets dropped when a new one is released, only the most recent + # innovation version is tested. + # + test-innovation-releases: + name: PHP ${{ matrix.php }} + uses: WordPress/wordpress-develop/.github/workflows/reusable-phpunit-tests-v3.yml@trunk + permissions: + contents: read + secrets: inherit + if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} + strategy: + fail-fast: false + matrix: + os: [ ubuntu-latest ] + php: [ '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ] + db-type: [ 'mysql', 'mariadb' ] + db-version: [ '9.1', '11.6' ] + multisite: [ false, true ] + memcached: [ false ] + db-innovation: [ true ] + + exclude: + # MySQL 9.0+ will not work on PHP <= 7.3 because mysql_native_password was removed. See https://core.trac.wordpress.org/ticket/61218. + - php: '7.2' + db-version: '9.1' + - php: '7.3' + db-version: '9.1' + # Exclude version combinations that don't exist. + - db-type: 'mariadb' + db-version: '9.1' + - db-type: 'mysql' + db-version: '11.6' + with: + os: ${{ matrix.os }} + php: ${{ matrix.php }} + db-type: ${{ matrix.db-type }} + db-version: ${{ matrix.db-version }} + db-innovation: ${{ matrix.db-innovation }} + multisite: ${{ matrix.multisite }} + memcached: ${{ matrix.memcached }} + phpunit-config: ${{ matrix.multisite && 'tests/phpunit/multisite.xml' || 'phpunit.xml.dist' }} + report: ${{ matrix.report || false }} + # # Runs specific individual test groups. # @@ -183,7 +224,7 @@ jobs: permissions: actions: read contents: read - needs: [ test-with-mysql, test-with-mariadb, specific-test-groups ] + needs: [ test-with-mysql, test-with-mariadb, test-innovation-releases, specific-test-groups ] if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event_name != 'pull_request' && always() }} with: calling_status: ${{ contains( needs.*.result, 'cancelled' ) && 'cancelled' || contains( needs.*.result, 'failure' ) && 'failure' || 'success' }} diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index cac3015af383a..3d26efa7026b2 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -27,6 +27,11 @@ on: required: false type: 'string' default: '8.4' + db-innovation: + description: 'Whether a database software innovation release is being tested.' + required: false + type: 'boolean' + default: false multisite: description: 'Whether to run tests as multisite' required: false @@ -105,7 +110,7 @@ jobs: # - Checks out the WordPress Test reporter repository. # - Submit the test results to the WordPress.org host test results. phpunit-tests: - name: ${{ inputs.phpunit-test-groups && format( '{0} / ', inputs.phpunit-test-groups ) || '' }}PHP ${{ inputs.php }} ${{ ! inputs.phpunit-test-groups && ! inputs.coverage-report && '/ ' || 'with ' }}${{ 'mariadb' == inputs.db-type && 'MariaDB' || 'MySQL' }} ${{ inputs.db-version }}${{ inputs.multisite && ' multisite' || '' }}${{ inputs.memcached && ' with memcached' || '' }}${{ inputs.report && ' (test reporting enabled)' || '' }} ${{ 'example.org' != inputs.tests-domain && inputs.tests-domain || '' }} + name: ${{ inputs.phpunit-test-groups && format( '{0} / ', inputs.phpunit-test-groups ) || '' }}PHP ${{ inputs.php }} ${{ ! inputs.phpunit-test-groups && ! inputs.coverage-report && '/ ' || 'with ' }}${{ 'mariadb' == inputs.db-type && 'MariaDB' || 'MySQL' }} ${{ inputs.db-version }}${{ inputs.multisite && ' multisite' || '' }}${{ inputs.db-innovation && ' (innovation release)' || '' }}${{ inputs.memcached && ' with memcached' || '' }}${{ inputs.report && ' (test reporting enabled)' || '' }} ${{ 'example.org' != inputs.tests-domain && inputs.tests-domain || '' }} runs-on: ${{ inputs.os }} timeout-minutes: ${{ inputs.coverage-report && 120 || 20 }} From 4cd96f7f5cad2f1099f6470e9b5677b0c7943b88 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Tue, 7 Jan 2025 16:13:20 +0000 Subject: [PATCH 166/323] Build/Test Tools: Expand and improve MariaDB test matrix. The latest LTS version of MariaDB is 11.4, which is now included in the test matrix. This changeset also expands the test matrix to include all LTS versions of MariaDB with > 1% of usage on WordPress sites in the wild as reported by the stats page on WordPress.org. Though a few of these are unsupported upstream, they are still supported in WordPress itself. MariaDB 5.5 is also included in the new matrix. Because it was intended as a drop-in replacement to MySQL at the time, this also brings some MySQL 5.5 testing into the matrix. This has not been regularly tested against since specific database versions were included due to the lack of a working Docker container. Props johnbillion, jorbin. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59587 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/phpunit-tests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/phpunit-tests.yml b/.github/workflows/phpunit-tests.yml index 81d9520b7021b..3fe069b709fea 100644 --- a/.github/workflows/phpunit-tests.yml +++ b/.github/workflows/phpunit-tests.yml @@ -118,7 +118,7 @@ jobs: os: [ ubuntu-latest ] php: [ '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ] db-type: [ 'mariadb' ] - db-version: [ '10.4', '10.6', '10.11', '11.2' ] + db-version: [ '5.5', '10.3', '10.4', '10.5', '10.6', '10.11', '11.4' ] multisite: [ false, true ] memcached: [ false ] @@ -127,13 +127,13 @@ jobs: - os: ubuntu-latest php: '8.3' db-type: 'mariadb' - db-version: '11.2' + db-version: '11.4' multisite: false memcached: true - os: ubuntu-latest php: '8.3' db-type: 'mariadb' - db-version: '11.2' + db-version: '11.4' multisite: true memcached: true with: From 2bab211bc76f7070dc986ee4ebce28ee6a7fa05b Mon Sep 17 00:00:00 2001 From: Adam Silverstein <adamsilverstein@git.wordpress.org> Date: Tue, 7 Jan 2025 21:04:35 +0000 Subject: [PATCH 167/323] Media: enable high bit depth resized image output with Imagick. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix an issue where uploaded HDR images were resized and output as SDR and thus significantly degraded from the original. When using Imagick, output images will now match the bit depth of the uploaded image. Add a new filter ‘image_max_bit_depth’ which developers can use to control the maximum bit depth for resized images. Props adamsilverstein, kirasong, gregbenz, apermo. Fixes #62285. git-svn-id: https://develop.svn.wordpress.org/trunk@59588 602fd350-edb4-49c9-b593-d223f7449a82 --- .../class-wp-image-editor-imagick.php | 20 ++++-- tests/phpunit/tests/image/editorImagick.php | 67 +++++++++++++++++++ 2 files changed, 83 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/class-wp-image-editor-imagick.php b/src/wp-includes/class-wp-image-editor-imagick.php index dd8b9ad5191ee..9abb631847544 100644 --- a/src/wp-includes/class-wp-image-editor-imagick.php +++ b/src/wp-includes/class-wp-image-editor-imagick.php @@ -503,11 +503,23 @@ protected function thumbnail_image( $dst_w, $dst_h, $filter_name = 'FILTER_TRIAN } } - // Limit the bit depth of resized images to 8 bits per channel. + // Limit the bit depth of resized images. if ( is_callable( array( $this->image, 'getImageDepth' ) ) && is_callable( array( $this->image, 'setImageDepth' ) ) ) { - if ( 8 < $this->image->getImageDepth() ) { - $this->image->setImageDepth( 8 ); - } + /** + * Filters the maximum bit depth of resized images. + * + * This filter only applies when resizing using the Imagick editor since GD + * does not support getting or setting bit depth. + * + * Use this to adjust the maximum bit depth of resized images. + * + * @since 6.8.0 + * + * @param int $max_depth The maximum bit depth. Default is the input depth. + * @param int $image_depth The bit depth of the original image. + */ + $max_depth = apply_filters( 'image_max_bit_depth', $this->image->getImageDepth(), $this->image->getImageDepth() ); + $this->image->setImageDepth( $max_depth ); } } catch ( Exception $e ) { return new WP_Error( 'image_resize_error', $e->getMessage() ); diff --git a/tests/phpunit/tests/image/editorImagick.php b/tests/phpunit/tests/image/editorImagick.php index 30747f69f1b62..cd424a8856cc5 100644 --- a/tests/phpunit/tests/image/editorImagick.php +++ b/tests/phpunit/tests/image/editorImagick.php @@ -691,4 +691,71 @@ static function ( $value ) { $imagick->destroy(); $this->assertSame( $expected, $output, 'The image color of the generated thumb does not match expected opaque background.' ); // Allow for floating point equivalence. } + + /** + * Test filter `image_max_bit_depth` correctly sets the maximum bit depth of resized images. + * + * @ticket 62285 + */ + public function test_image_max_bit_depth() { + $file = DIR_TESTDATA . '/images/colors_hdr_p3.avif'; + $imagick_image_editor = new WP_Image_Editor_Imagick( $file ); + + // Skip if AVIF not supported. + if ( ! $imagick_image_editor->supports_mime_type( 'image/avif' ) ) { + $this->markTestSkipped( 'The image editor does not support the AVIF mime type.' ); + } + + // Skip if depth methods not available. + if ( ! method_exists( 'Imagick', 'getImageDepth' ) || ! method_exists( 'Imagick', 'setImageDepth' ) ) { + $this->markTestSkipped( 'The image editor does not support get or setImageDepth.' ); + } + + // Verify source image has 10-bit depth. + $imagick = new Imagick( $file ); + $this->assertSame( 10, $imagick->getImageDepth() ); + + // Test ability to save 10-bit image. + $imagick->setImageDepth( 10 ); + $test_file = tempnam( get_temp_dir(), '' ) . 'test10.avif'; + $imagick->writeImage( $test_file ); + $im = new Imagick( $test_file ); + + if ( $im->getImageDepth() !== 10 ) { + $this->markTestSkipped( 'Imagick is unable to save a 10 bit image.' ); + } + $im->destroy(); + unlink( $test_file ); + + // Test default behavior preserves 10-bit depth. + $imagick_image_editor->load(); + $imagick_image_editor->resize( 100, 50 ); + $test_file = tempnam( get_temp_dir(), '' ) . 'test1.avif'; + $imagick_image_editor->save( $test_file ); + $im = new Imagick( $test_file ); + $this->assertSame( 10, $im->getImageDepth() ); + unlink( $test_file ); + $im->destroy(); + + // Test filter can set 8-bit depth + add_filter( 'image_max_bit_depth', array( $this, '__return_eight' ) ); + $imagick_image_editor = new WP_Image_Editor_Imagick( $file ); + $imagick_image_editor->load(); + $imagick_image_editor->resize( 100, 50 ); + $test_file = tempnam( get_temp_dir(), '' ) . 'test2.avif'; + $imagick_image_editor->save( $test_file ); + $im = new Imagick( $test_file ); + $this->assertSame( 8, $im->getImageDepth() ); + unlink( $test_file ); + $im->destroy(); + } + + /** + * Helper function to return 8 for the `image_max_bit_depth` filter. + * + * @return int + */ + public function __return_eight() { + return 8; + } } From 082f6e6f3bb0716969414d47b9fe71251b984ccb Mon Sep 17 00:00:00 2001 From: Adam Silverstein <adamsilverstein@git.wordpress.org> Date: Tue, 7 Jan 2025 22:33:37 +0000 Subject: [PATCH 168/323] Media: improve Imagick handling of colors and alpha channel for PNG image uploads. Fix an issue where index color (8 bit) PNG uploads were output as true color (24 bit) PNGs, significantly increasing their size. When using Imagick, PNG output images will now match the colors of the uploaded image. Also, correct handling of PNG alpha channel information so it is preserved in output images. Props adamsilverstein, pbearne, nosilver4u, peterdavehello, joemcgill, azaozz, codex-m, kirasong, justlevine, jokanane, sallyruchman, wpfed, tgsrvrs, antpb, tb1909. Fixes #36477. git-svn-id: https://develop.svn.wordpress.org/trunk@59589 602fd350-edb4-49c9-b593-d223f7449a82 --- .../class-wp-image-editor-imagick.php | 33 ++++++++++- .../images/png-tests/Palette_icon-or8.png | Bin 0 -> 24841 bytes .../images/png-tests/cloudflare-status.png | Bin 0 -> 24940 bytes .../data/images/png-tests/deskcat8.png | Bin 0 -> 105705 bytes .../png-tests/rabbit-time-paletted-or8.png | Bin 0 -> 200581 bytes tests/phpunit/data/images/png-tests/test8.png | Bin 0 -> 45231 bytes tests/phpunit/tests/image/editorImagick.php | 53 ++++++++++++++++++ 7 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 tests/phpunit/data/images/png-tests/Palette_icon-or8.png create mode 100644 tests/phpunit/data/images/png-tests/cloudflare-status.png create mode 100644 tests/phpunit/data/images/png-tests/deskcat8.png create mode 100644 tests/phpunit/data/images/png-tests/rabbit-time-paletted-or8.png create mode 100644 tests/phpunit/data/images/png-tests/test8.png diff --git a/src/wp-includes/class-wp-image-editor-imagick.php b/src/wp-includes/class-wp-image-editor-imagick.php index 9abb631847544..edce8d2b7dcd9 100644 --- a/src/wp-includes/class-wp-image-editor-imagick.php +++ b/src/wp-includes/class-wp-image-editor-imagick.php @@ -484,7 +484,38 @@ protected function thumbnail_image( $dst_w, $dst_h, $filter_name = 'FILTER_TRIAN $this->image->setOption( 'png:compression-filter', '5' ); $this->image->setOption( 'png:compression-level', '9' ); $this->image->setOption( 'png:compression-strategy', '1' ); - $this->image->setOption( 'png:exclude-chunk', 'all' ); + // Check to see if a PNG is indexed, and find the pixel depth. + if ( is_callable( array( $this->image, 'getImageDepth' ) ) ) { + $indexed_pixel_depth = $this->image->getImageDepth(); + + // Indexed PNG files get some additional handling. + if ( 0 < $indexed_pixel_depth && 8 >= $indexed_pixel_depth ) { + // Check for an alpha channel. + if ( + is_callable( array( $this->image, 'getImageAlphaChannel' ) ) + && $this->image->getImageAlphaChannel() + ) { + $this->image->setOption( 'png:include-chunk', 'tRNS' ); + } else { + $this->image->setOption( 'png:exclude-chunk', 'all' ); + } + + // Reduce colors in the images to maximum needed, using the global colorspace. + $max_colors = pow( 2, $indexed_pixel_depth ); + if ( is_callable( array( $this->image, 'getImageColors' ) ) ) { + $current_colors = $this->image->getImageColors(); + $max_colors = min( $max_colors, $current_colors ); + } + $this->image->quantizeImage( $max_colors, $this->image->getColorspace(), 0, false, false ); + + /** + * If the colorspace is 'gray', use the png8 format to ensure it stays indexed. + */ + if ( Imagick::COLORSPACE_GRAY === $this->image->getImageColorspace() ) { + $this->image->setOption( 'png:format', 'png8' ); + } + } + } } /* diff --git a/tests/phpunit/data/images/png-tests/Palette_icon-or8.png b/tests/phpunit/data/images/png-tests/Palette_icon-or8.png new file mode 100644 index 0000000000000000000000000000000000000000..ead89766a3246f5185c07757b2e23f541ee72897 GIT binary patch literal 24841 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 literal 0 HcmV?d00001 diff --git a/tests/phpunit/data/images/png-tests/cloudflare-status.png b/tests/phpunit/data/images/png-tests/cloudflare-status.png new file mode 100644 index 0000000000000000000000000000000000000000..8517ff0b59fb97559a3a5aefb13fc6a53b19d1d3 GIT binary patch literal 24940 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 literal 0 HcmV?d00001 diff --git a/tests/phpunit/data/images/png-tests/deskcat8.png b/tests/phpunit/data/images/png-tests/deskcat8.png new file mode 100644 index 0000000000000000000000000000000000000000..89e62cd9e2b2c3d6a0113ea9af77c4b2724811a6 GIT binary patch literal 105705 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 literal 0 HcmV?d00001 diff --git a/tests/phpunit/data/images/png-tests/rabbit-time-paletted-or8.png b/tests/phpunit/data/images/png-tests/rabbit-time-paletted-or8.png new file mode 100644 index 0000000000000000000000000000000000000000..cff28ed3b2b3aaf81679599aa02160cdedd01608 GIT binary patch literal 200581 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 literal 0 HcmV?d00001 diff --git a/tests/phpunit/data/images/png-tests/test8.png b/tests/phpunit/data/images/png-tests/test8.png new file mode 100644 index 0000000000000000000000000000000000000000..49a513647147f0ffeff943c37810fa71719971ec GIT binary patch literal 45231 zcmaI6bwHER+doW72?!Dj(t^_6Azf0^h%g$-(LF#Uqy&`i?ye!o04eDh9n!)iMhpg{ z-tqlC&+~i#c%OIwY&-Wk*E#nUpL12Tj+P2BAq^o01_rU3s-i9i1}+E#1Dg*Y8$I&& zm0$n{2BCt3f`X2kf&!zP2hh&J*%kxCZz)I5*Z4b<N@fjdOKK>;aNLmQ{0W1Zr5gYD z6O+Ox-!Lr0pODM;M|>ePq@X0rRyF7gn<Z4u`Ldb+y3JlL=F9t7gAZay3@c?VpaA&c z;r0CW&)w|Zn{odM(oiyTwxqv>ju_&)5mFKh3<=t*eM6n0Sd^;kIE+vJj{LI6?Z?14 z#`gCM_Nsq#gINc}z`}5w<#|ayxN-lvU5CvGgE0wXotb=>2s2R^<2R4~Zwidx&oJus znrsL$k})ux{e$G0F)E2M4iIWGxEKo+-&d$H77AZf;A6yNVr0Bld5I<4fnj0rNtX+& z`xi!jwJb9aPIoP4s7b4U3RY+*E{4xn<3v(f3yjbVd9G0mMlmc51^TCB*o+$3`Fzt| z>lFaEh&EMBjP8+?v9!0-f)s5jlQh1k$LpI+o4=eJ<SnV$pV$#>GiRq|u{>4X#nu>q zjDbOOHPv$`_9k)n@Ak%DyIp5EqQCIY=@`f?!*sHC_cIO)2jhv>1bhjwvonY7Hi%j8 z-Q`qaim_yf@p0|SOmLYX|2^Skz*Vfj*o`cGZh_8kDY_SgL_~+IRt24WTd^|tf*Zi~ z*x(EF)4Sz>V+{99*^HX*qR+SPmaaavx?gukaOC-2k-IE+gApOOU)iTNg&IC^QO2AY zN4M!PYYzJV&`nZg8cNwDhlL27Fr?lReD@{BsE*X`)@sFT8FB6oKElL`B{81%!H^9; z<Bp>tO2T+zFC^fP#K8F8b(J8?iHR|mR=kCQ@pJFlhw@}<jRAZN48{CU9QAT|k9#Pp zyGgQp=zexnV_7~@lzsfNTk47YqwUZagayx1<(}(zODy2D)ML}+lVxr^Y3|_{Bi>yn z|L|$wjrx(rv)o_Lent}D$o<BDYRM$=h0N;f0`oXNb;eg5W=mC}Z=uDEurCzvnEQWw z6k}D$J0_W_vYc{zP>9EWkVPdf|7H}3xrzCy!k_%9@g4RImbdJWat4~1fqc&?FCkL1 z(9}YwDVk<_>Co1~vZ=Rw-d-4>n6K8MQ~V@$af_B8;-Zu+qK#?T2C1xfjD-yogstg} zMSUn~yK^n!_%E?yL!Tbtn}<L7<s6onsA8;PtWeH+z|u_Kj&DTpIh_C3E9URz+Rdy1 z<X3%uRuT<~#>&-fM@;lgxvb`|NS*?|tG*-|`nIh_$i$i`phl$Tq`IuiU949uGyTLN zTZ3&s(Pik*HhyDhHDg*5IFU3_``h(U?>3l1qW{aL20`IV-Qr|&bz$2#J2)kI0`eL8 zmG8zXa%b=>zewc0S98ht(c#sLs(32ooyj_uMWrxO%w04)ndxBffc(e{^J*tp{Y<Zv zHkmf<w1)@Vg?&c&J|>PN{yeB^_4>Kf^T6k2&%n=lGc-zZp=lYv_4(!nXfy27Nz;J_ z#vB(ML6k|u<S7y<hAF`*yOsI|o(6Ab{VR#|s|-l1%nd=M$_7n3TNMN|R8_MTbOs$2 zBDLeXzPbrI6Yl^;5WsC1%9^+_GD0~&Qng6m8a(hko{4He!1lyge$K-Xd!NfGUDL|6 z@#;Xs2ltxRhc{3|Pr<X&uG%iiF6XcN7$(U;!}_uKVz&A?(>U>XAU8Jm8}5cV#~Qnu z;2P1TfF;P1)uG2B)#3gU+}kZjHis+cT*5^H=}pis(*CYJqJ7zW;-3uEdfy*La6Wua z0$ZI@Id?%6om2mV&%vh{MEQj9MG~Jo^NU#@k0x60Ii)+aO&y1Cl#`8oY)|U@STv<p z^s0^RD9V0I*pFJqt{V8ls#@re?TV9>rImxga&cdA|2BkuEZHg3u6?Q*>NPt0n`@<d zp?c`xtN3iTQ?4as@#peQd_;*-cE5V8NbF$hQfkl$ZmMP~vO3*R#?asJ+;F~HZSKQ9 z*S^b~k+Tl1QP$%uiL8;<@|vugKA$X?HHuA&1omn6b3NB3{)3wX!h_6%M~C7UmKUrS zE*BGYqc6zm<|Mr&gFL*vM}3^#e(o1<2=!L<RrJD)>}l-_Jaf*3sY~A`j*zGMq*3d+ zl*N>}<^_zT?9d#wPq#qNi?TYhR%#YqW>!a~`$1LLnmk#wLuS3wa5=;=(s<K-bStMU ztL)cV;x4bbkGYBYbtk=cQ#M=f9G}bY<v!E(&XGV12^ncy)Hn=VW<UljFCZ@pQVL;S zlZLPa&jn`$<K5(5OQJ?@6E3?p{7<P)v~VpjdoXt}J3rBUYQlEHX28k7DZvxQjmPbH z#QRu=QvNXku?d66cVIX5DeaZD;EFw0<`m^Heh%e(S`^<Xn+E+H+1JPk{Iw^+z|t!X z*k~*Mmvt5AFKrAC&oij6Kosm80+l@f-ZkraxqBhG=Bl?%uI)R&o+MPn{g7OCZ1wQ5 zuXc3Sb+$gpY71?vZ2ROFb*XfcM(*|WCBb3zcHcsubo7=d)~<7=VD@&VeyW#s?aoT! z59+_L@sV6#DHCCn#2~SVbn>*uH#?sh<#l+UY44P|YSKMD4bO_uR)Q497rtu%x2a2g z`<r8!av`=V2~t3PjMP^49uOqZ*5&k1dj9PP%bBL3;@qF=iADECZt>*o<m@6{Vu#db z&UrrYYp}K*C+BzKZU4V6!?fR{hLPJWSDt6fl+F<vQ$@|XwK^nJ8ocG4ex}b%{n}JJ zRo~ADuG!uFyJ8^<qYCOwtk-F)Z(3;cGdWpj?o#TYVu{tG_T}L>(`~o$b2y#`jeHzw zOug0FG}bjZb@X33{i^$Ux}-#bGt5XRr6PG~#I+Xj{)aWCWr~df+%av|)G&mDIt5Ve zR$X3uS+Csochg7<FdKC4@3OS?M;$zTxUafjyzg3#H0i2S?{t)#os2vtuAx1N-=PJ# zsQ>XQ2yi_AI@UZkJccc7DST);+FHGQS|Cz%5s(vNHez^NQw4@BvMtSZt@;L@k$k43 zl>7rvKKR+f>1X8BsRTNAojwX%O`x%&ZSVRUyxOMXtKFZQ5Lgn3ccBE|ck}`}uheyQ zH4?b!ip0~aO1SN0g#wqd4l{jQ+}?AL{F2-0d9_v=6u70cS1{hY(mS@65duEP-&ghL zoR;YFuI4Us$(JtZgzv=_<<ObasX)N@!EpX9Ywtnf1f$&ioY&GPSKDFVx5{kFa&xra zNY7-f_#-uLGMvobnRVJLOys_y_Bzr41CT>!e|8hhj(@r#n2}b?tl+mb(zVhm!EU!3 zs&%HoeOu(np^;Rr7eaGiataO&K{<BMdd^?Y^O)uNcftn_Xu+;*t1sGE+s`k3E)J=E z36C^Z%mNbp>TV!QxBu`^r2j&i?;32oUDhuxx-BMpO-SJ+1W~zn$@kExjcJupm01>L zmiUAm1_oMUn$A<3@$VaDjb%?KhJy|7{r5eqcGqq<uis7>-z*#xUBymx)%sVQdBCeG z>LdnP1{r>i`%9mc-qegQgWzrO_O-!IhK$!YvUfUXQz+}fvPo^E%x=)#4KFhM>^fAO zl??4wKKD{G_R<5|dHGs;*kZ`p0Ih5p)m$v?ZFOxeZT#JbY^Bf+D4T=6v6r!?hJ-cH zg~#$?4v(LU8+tVchSVEBH%n_LTQ5c{TYCprX=Zpw7c--SjWn~7uqL0Tn}Y2}2h{)% zTfG1+ed_=xYjGRqH!_S;eiCQ`F1B8ljD9Z8uAUNp(#-#%D}ny~FwD!$_@60WPSVW( z=TOF)I*bZH4_iiY9zJesK0ZE1QE?uAQGROyQ9Da3E=B=90Rdh<F<yQVZUF%aL176Y ze#Za$Frzp0u(6ZSRaE}3?a=?EnLm1Yxk>Qy`uh6v_zLm>J?we;#l^*W`2=_c1h~;N zxIO({y)6B>T|HU;n}VXPr?rQJo0kL7mGOb1r4`WIOPU#d*#GkuE^hxr*46XBIECgJ zub-tGFFz08!(09LL`}{A|EVr6|1;auOV{@Qp7;Ngu&2Jin=P-dttZgi!x}9+JC=v7 z+$0n{Y%RTj9{NC_^M5l^=OfSy==l-o#wZ}f!^imA$idYH=<CV;p9Pwl5^AoVUY4%b zwrYyf%xDrk4h}XF;tHYya*ATY%1VO5{QOFa;tF!|N(!P%0%Brf%Hm4G|GicbXzlG{ z>+1F2Yi<7TT9N;C?SneFxS@AewDoZCv9(e50J<>#=ba@S{`a#8{;%}@Ypu=yeiots zbuBOYFuV_v{eMaNzlYH3^YHV3R2Ti{f0W<W6|M0eXw@!LV)}zN3tAlweWm;R`-6jn z+uPgo^K&>Hespwnc6NqBq0r+Z0m1C(X#`%nT6*Ze|M_6(Y5S35U=${+Daz^lEgj@U zg;nR1$g1J5--n#2>**ZWb`#gFxLAL3!)H?R>SsgUdsS`?9C~WHQM*;Wr-*o>j_FGZ zo)GRw><q+Uh`M$q`VE1)<6$H5v~Q(EQ<Yp-?v$*1u|-RHMP1*J`H4umS))9*2CydL zBThUN*pno`F9T`l5`9Z~!P=Er<Z*vNbYSq}+e=#i-GQ3M_-7nUVj7=KOE$+5I~SHH zRB0UFi|U^Ejgk0eTU23wuMjJDINOo6>tlfHiWZbQLd-!YvGV?9RnN*Z$VyvIVV&FI zPx@u2o?mW2&uh6}xyUQkbkhz*XZbIV9z2hgU_5|Gn7dOlWOB8z^L-kA!H=~cowK3B z0N1g7$WaJV$cad#I@&F;Xo#_U<>|^&A)K*k35p!|6KO295K(js{M?P+`EXiv4+7q= zVq9PeTi%i%XG&kmEUCk}?zhgKiL-Fk9v0(-tk4t#g~$;Sl?S;>#pDNMJ%_#m<MF0B z-=gQ_Cp+`=1;T#tgMQpf4t;2d>#;yakY~WxUN<s@(L&Q`-<IN5#|j>)JHqtJo}XGd z(}}tk#WlTfcZ!3^53UpLrmyc^yQYVC@!GrW4xstuj*8*R#$w8){2m2Nf=m=mWrT@q zMK9w%w})*Qii2v*EQP@DN!6Z2Q+89-H1KB3G(QQujci-(?AjWrAsLz>{{}DrOy3cp z6O#fB#SD41Fn&2oLbj3)S&@02@gsoX1n(WJg|Pmn!2(-S@j;%~tu~e8|2kh5ubtzG zIhlO6p!NB({%{hrA$|HEIP9QLm1NF6|3!i$1G7ExA4Dg`A`tkvHlqivD~C?s*bgtv zUm_?QWqRhEqyDp2dWeE0sN);dh&3!ejO->cD5!fX0X9;jIfRq+_p;_4a*RHuGYptU z`XALQ0v0|Zs5Gm`%?g7%>w2A@J#d!@F-tm$#02B^e0nY_%qoHU8RxlWSYh)Qk%N+& zG0hQ64-@Cx;sBW-cLoma5heP_oR5_$z3~eaK^YK+ME48A-8l}>cRf+z5+KpC?pUeC z!(KJec@6JXyVertC^4`{#y#WKN}I4O0JCn33a(eTNaAia)i_w#4%1SgcX!RphhMk5 z9&b|qW9u~F3rpC8v=+U*N+E)9pjWlXt^pSOSwet9^ll$lf>CT4Dft$GR%ipcFhh+K zd{8|LMt$SLszL~_&bVY|j&KiJj~+fn+*bUxX2YMGpT}xd$bL%dSTXPCht{6FsW4su z+4G)P{k_fa;K?c%OE>F0<)M(u!XF}X_3hQTZ++Ax33&8CV17`YCh<`iK#eWlols|4 zZuT%0e@y*Y%}s6$|F3Y0_nMveTCE{U#wvRK=E?4?a!Fk6WK#INp6eJCY?Y?%E*Q4R zu=%UhOxG6Y5xuIbrWS7oU%5w$&X>T|=}W#N7B)R|<sZUz*FN0NzwPlMsn};-3<IFg zkZf3nX%(VBb<b3}zTL~!=??fYdp&J^;4lh7IX2}hN0ci1;cNeAKp3rPDV&}Aa(MQ5 zErkn()h0Ih92^OId&ZmP=n=F2R{gl^H0tt~Q{xCWdYF@@3`o{9PqA>XE0OU4JWwQ= zLLY0M&?Vm86Ad&l1gitCo}=1Dh;>Aa%sD<_-&gqwO;SM9OpBl+Ht2}vq@7$eau6h@ zMuRrCUH|e3$l8*fHi7f;@QZuqu*K5{IBSPH;X@j`_ary>(;*swQeLQNH*6Wf&1`Je zMRh}T^3lrKKT{CYB@4Jb)zKge>UDSlO@oafc6`3?Y@8|Z8-(%xJjVMlEh7i$g=WK+ z_Yf$1L?>;J3ujMWK5yE<kD0dXVE)eH8!$psXnu-m^XDvXrV=0eK>LscZQd5;uSt;O ziAby5*N0ws=~Q}%pfE@rsp~8hT+O_f4Y_YjI6C|Cag1T}DPo5PwDK?4JeKkkF%<k| z{Y*vt^s9!G#u_%uAT--F3(7fU)m;+Y?=t8fpB|QhhRNGxNH;<=t9^{bvJ#9V2>RiE zU2~Kbq_$#P3+t$)lAEPDrtW5a-nH^R$DD<(dY%%w(8#pu4A+la({_7%d-iJvjScrW zJy_e(Z}~tBu8enPnli2o`S4J{9K!|6!i!rmD6-#jbJE(iMuYeClGs)EpdA7rvO^h4 zX>rx9{L3?6_@vc3I|#e(!jjgW)fPcZtwm%G99((*btjbaSSMTd*ltJ62IXOm5&-QI zQ>^M@U*@qGD|}9VxJ|_Gp|Fx<LFv~Z?<Xhs#KjA{)T0Pc)5#(~6r2O2EI!Y~6g`4q z-kJ3c_>9G=vqv$^f_mj1dD?1k;p8yrxvH{X0zXR-Xs2>d8pXg#@p~g+*Q9%r23Jqw zuI8`8G|v&NC)$s~vG*2FkKds<&<1VcqWAt*aFKT%tUG-B-Rhtk7cF{4fEvbJduaZn zDRc3C#;Qm6oEvHWQjefuDx9<E7f_^NdmW<ToUxDOn(Wsb`Fi<MU<B{zB4auvuTjcx z%<4`3eXNck$mvfSmwL73TYj*}-rMN-r{lqQ-%Z}7L%5BZEeurbq%%y3+Uq)}Oul4l z2iU(yRSv_d?gFc6U2L|KDu{@HQ=H4ad>~*xu+%w7y`wS*(w#K$nMO)6z{-Shwr5m* zg+9%^6zEYj5-4=bjq{3)vJ`l(`RW_^=y`!rFAW++LgdzHDU-Ar#r*MFrG&yQYE(EE zBGa_=zX<!%L6K32PNO@ShW@HNNMx1lC@r@t-7krlp0=fsLz5`e7W<}E-x)0W1uD@a zx-|@t_{I9;nmyAfx8D=15+K;8e*C3YSs__KKjb29r|Ak`Vh)s5R!8@1+4f1k*^L!8 zf-+O^!>Z7dvQVs*c_{jkK`=uDb8E~R+g?>V1e|c)d<r-}Z%>CDLXD)oo0LytFEBcN zP*_l;CHtfvl_1(QeVa|NPNH1r*n&&ERjg30%M=)s&ke0q-V+&!MdcQzOJ=|VCrXu8 z4!!5Zf-@lT6WLQ9`OSRtPjWPrN%P}#Kfll=X*wf-BK?X)_m*2!0gj&_eF(GnQucpM zWu+$65%($NL?!mnK=+kLP-OS7+!a_u+gm7OaMmP<73wSFDkqr3+2g<Z+A<lBebr7` zb#`O^Q6%xy;WRQwQ9xtOzMV1yLi8`3YI&(%@U7VKAJ+lUlo(oF6Ci$PN6MwX0pkI) z^ua@vH|5!o4^uvB`LmGb@8VG#WJ4ihMWj%q(y9^TN{oQ&Q8V7Y;>FW^SpMVIG6jB6 zm)crmOu#QjF11b9%Zf6tUX8W+J)$`VJKo1WL%KrJ>C%ZwYJ^YqRcu<sZ$#t)<4I!6 zP1#AJ;qyU5LPo0}Qy^YAkD?-t;BBtPc7vX4w+`m%km_p)pWWxU++@+r*S&$1v*vg* zQsmu7j$<bDxrMyW0C4l*B5lqn!gdvTQmQ=CYwO=(mn;?$RC=7Y7x?>Ec(eCv<0pdn zKkTD5Q%0?_fZPV_@0*QB9d_((j(j?dC5m0XeM*mMy}eWyk4;%Y3ASU4>WKQbCSA#s z5ri#DW@*~E6|YazTsKN>H{=MD%k~v=8u~XlO@)mO44C!>C_j0@%Q4>VYafk^Mr5!H z>T4l?|FOeaLNW%Smj=+G*|1pz)BQM`&w5)hRyL;{UTg5~sIbm_Et?;d0lANa3~3%U z5u193E50<n|03&>vL=hNoD*ibQ&FpOLKxryS;u>P(|m0M5v*wX$QP0DQ#O{8I9;8w zDMwZLy8GxF6Rt!{2HExX8mi}SO}DztmVdVFd_&{D^ol-H9!^k%KK{Mt0-->7$7-C# zyt}a#GR1>TDGRyu?P9L+jqs-X0ME7Xl<zz0)@LI5lzE9Qb=OBJ%AN>AH!4W&F!4S_ zV=a%wL>NJr$-bLx!F%Wf>+r>9B!wE~l)+O|eh7EeIVvD+M-;RGCKYWd{G;v1zOcZ@ zG^HJ?8I4=d1<)@EpQ3i87Ul9V_Wa#<Ut0J6ruz>__vDAoA=I)#k^%~rMpgRs5qrr! z|9euM1DOa45TELGjppNIutP&FAivH*cV(}?ntY}9#1qNWzv9t>-4_O*G-}!@P(sBh z_j5Z_2rox;6<yQQNVRJ{zhy;{?}}NY?wt39h1HH_MOD@mGLwE(IxZjVGc-yGkvWWV zv(EYMNsg8iL<;L&W+5m=HS8_WTZPOz*Fx*2MBjz|{%Ov8^&`y^B_q4GqyG_o*}|c# zn1E8C=K%`dUN?mY_cpWH;6%)7PNtErP9Nom$OBx_(9J;X(?Ji8d0WYcW*hp32Hz_H zy!DYK`++n!k3rF}WkbPkgiHA>uoI%X)-iqX;$w5S)mI@ql#C`|?BM~t(>)2Yx!0Nd z7JJd$$Ga4WRsl32pfI8&OFsUd1++W~67PAr52<NI2}d~zgh$DIB|>%#%Jd>Y@)APY zo5hlkp~yo!PJuiO93SrDQYzk%4;11Q)K#2AZ_**!s!<zPd0u$?5IB2nWNjOrsl|Mq z_)m4fN<OfR_qPx<&HLfhNsx0VlDcW?VTLcRAIY7|S)gDxm_-M??=+u=5*(tshEmz% z009YvNyxcVMlRh?-#y+%qHRTc%@7)M(-f(()`=iCk$#Dvg^St_$D2dzz=SD1+G$xU zgLNR2Pv}voP}}KF0lz;Nj2Y<BU0Bt_*ZaLdp@o|4btAu>*(7AMacrxApxje``pcPk zZqlx;-K)9!RilGoH&67eYEDV$=Q?Rzy#DvOGrgRX56q<^<pP;<Z!Uf4psJXwpXd!n z{d$MeeOGl+_~N@HgFaJM3Gel_$N;vJzXb|1v%RA&st)MxBubFV-Yf9iN#y<Yp$KSt zRuEsAIhw9NtD~_Nxp#doMT(~ouL=GbkdJZJ8|6B~0iuM0l~5uaE@Q$!l>rBkJj+uH z1M9uiusYJ;r$*CNf}rIhUVad50q_$ApctM+#Dxcd2J^1fB~w|AC^%`BRiaVb5@n9` zFYhudt83edyyj(*kq69yOr0`9`9Tb&@D`WhkaCBElfd7O7PXDv(Y9=hj&Q;iR~wl2 zmu282ok6_<eV@?7HN|9TAJQA)ttr3uad355v=}S6!TIKj5F~7$?i>%vL<cL%s3S<0 zxeiW^l>I9pWBv9-X_o@vtB`Bu&X4;H2&w1|9^9A!gdIFs#<V&Tp!TcZH;DeF{i1_o z_k+L&U{!{>EV=7R!mPXtU(y)b8m=tF22D(bo@lIznhx2=VSJGZ--)vMt@N1FHohmO zv7_hT=LN(+iEvul69?2kw#EZDrK_pqM7F8#=oQ|8NokGk-9PVUJitt*nJ1m-vZIuw z&(pkuI>%q9XcurV%h6I}&1lcbfd5SHNJiqY<^4}um!7B561G1J`LC_z)(U`w59~1I zlUk6jF93FJcL>;I{JfrtYYt}#cX5`%fP!mg1-|oIpghpgsSms9g=J=&;P0zo1?qoB zzYSrr=ce=;DpE?17NLv2XfMxY%J=r`P(h=iM_s@&7l_qR8*p*Kt#0qj+(jVjY5?`s zD^{xTq7_jG6rx}wK2fY258>uBkf_blm)YKlxjmxuWzgagpN|rcxdtG$^Y7kUT3;dR zud`mJXL2HP0Gr2rX#HQy=XL(`?h9pFvjJ84z+Tn+da3#g+74z(ul;a~EVOfK-42g2 zoVxb|$=aAAl+3!0I8Bgr^FC-ztuE&W!Ce9dGas?uE#<kqtR5Wj0_b%eE%Sq{1+Q{7 z@MV&0P$J5J1}7EE(i_T)?hKB=w5sJ$w!IPV;bK@i#M%F24y41XwWkcmgmJ9q>lQ^d zmwv?g4=h#xR}v9E_Y|dmlx)9?hxV<&Ppy|T{?>DQE7Ft#6%Yn|Nm@rwOX1Y8*!&c+ zB;(ea=Tl)vBQ6VZ4yEv}e0UY1N@qLpH<|O(yMLVwXpRSdfqZ8{<5ef3pA+X+0L0)8 zb#PK<gn|o1_@($joci(=;?@ze)g5oqUccjmzXCQy={6maZMH-wh&1&y!GERVxoS^Q zXFyt}z_*0JO$E&T>T8d{IEd!R`&iB3p}zX^>)<kFb!%Q`v8BQsWsNn$Jx)9q>XI9b zFeSAsT!sV2%)qn(Dw$GX6Bn9$KmM>r>E(G~x4yH%Rh#}ojAi_+RmyEE<?bml+rn)r z#n88x?ALRZ!Z#up%@0U>MjS00z2(vobuY&p@4=gR$WTE)%EWy#sSN*)u<bx!@hPPj zOmiP=n*Y%vbRNxylwpJxE6$Uguf6$Q+%Q8BfTZ!3cQbpEg(Hvkqot*LLW|%5|HgjS zVonm$?{|k}_Jt^YStmmka++gqc@RiqcJ$)R%p_YpkZ!f3vb%YT$5CNhu;+`rCMt~| z1aR%wAoHOxtS?LcMH5b2#QOlGl)}d2uP^&X!szWA@5+1-NB~VSx8~zpfvh7NazbP; z)^PVfyYTXD_c3%%3?aR^-B@#y6wpFGP(>Ksq#$w*)LzXsvpRDfW6xT;kaH-SV~oRy zAs^vK$9hoYw@uSxxWd<LwPEf8d*m%yP*?WW=zdMdf{+lwH~b46Z_(6Uxrckb<>%L4 z*CdGFt?FZ!kD04=y3SCj5C0k8R=X=D7w=G^#%0O3)7M`faOx3cl6%tkd4;G)_ZU1# zL=eR3nCz!!9AzQi>*ti@UwthAswx0p4*tBflE9lPW)p`Z3#5^n6g=faXcN^~J3Brc zoiNwXbS8H8FYi9BAAE_K3p;t`(ih2sj&V&#M%tdg#E84vh$Vx9f0VNIY%N6O{~p#m zs$WGvg^n!1u&;@}y!nHUVT6H6q3@7NdcK(=4{{NnqP|@;;$Eb@Q#d}^Exr9nMgLku zhc*1+KFZwNKL<#Zcn9FU^DJxi{G3NSV;;EI0X5e?T~sT7-1DF=+`KH0P`L#kqypSE zbHG;{(g>GV?8nHmPIdebDI{pO6g77$;Fb${9sv6Mea_lH8q(O=EVX&Bk+$n$mm9<^ z<86(aE6i`h20umgM`&mN%M(N>h50zq#)b%6m$U6-@1ifOxv65X)ZP}Nq@R%DRM91d zB^57}SAX^<1X@a^Erj_W2LZ?uC$0f_e^#@0nwz-)<`b?#n#}g&6L={|8q?hwO~kMW zzYi>dc>hvF#Mfw#^A(sJ(MgyUwmUXKAFjP>9OL*7=cko_9HjYtaFY<!!ff{L7>x+2 zrBwyI%V<V<zgtIRo&w79+_B!$fBoR!m@u<aJqKke^T=mQwDaUt2q&AhQIVk}j`CWg z)g)Tb?+U@`bhl{uWJLAgjk*{jQ{2{n)rlU|{?)ZX<yr$->Q<meg8z{LQuY(pZ8J&0 z&}pa{k$(V$MbQJ^ZKMe3NApiaeNFOtr?0vo$n+EMJ_H@-U+b_cC;jw?WI!Doe!kG^ zL4Y(ve`PON{;1rWLFY*jHTg>O{1l8|HQVqsNl!iWaiPeuRzco3ru1$6AZY0$)bKL4 zoHomGfE)Trf2lQ<V8L=e@7IE3G$Y|~*z&C6+P?pbbO?MLFKfepq5gGcHiYg$&7On2 zg-MktKYW4(u4}R>1Gu6_>W@a^VWy?<6p150py8R*fnq5<i?}>dwk&<8HZ^ll{=ra$ zg`}sEVMm<JZJu=@W5?YMuJCEF7>oL;&f86rhp6GJ-O(fn^lq6J7D$lq^78&R=E+b5 z0aN)>bT66%!SN7L`lSs6dJP%_{B8K8FO!DKj0ON5TB-xi3eutxDVtblT9j-7agcvp zo&aI05Syhf0e#ID#Eu?1Idxrf6XmX)*yfWYu@}o2l47>W0QI$;&Fml5S6KV%z2@^t z2@sGGxaYJCTE4b6`le1$;40>1jrw!V7KzSf?T(S4{&70RtUUG%2#2)N59Y9$4e2&p zr{wT>jx1&*a+K7)5Ppb#kVr&C<^j9YGyOk3SO5t3+a$o@-$gIOR2LI&P!ep}?mIf^ z!FfuQ{v6mtX7t`$eMzCkfs1lQ-ntY{GV5D<7qdz?jLufI^t^&OX}zbXCvZ9LCzs`_ z`f<mbJlCBX<qKQZY*}leE|7qs@4g4yMS9^{TK63)6D^1^zi~euLYTp`>uKoSfISkh z*ax#PLrBB=xhS8#;go|!V3xvpDF&ua6OX>{wN)F)uBCz*@7rMs)5zaWa&rs=m<ua@ z<W!~2)9+oSL|>O2#ROZTYCkq8kgO4aHrlFhKm0{sSKj8g_Nc$|L|$f3$A*k_`yz%& z0|y*J(!jJ(-yL@*)o4Ct3aVl0u^DT$M=SuMEd@rZG#cV1zus{O9pWZgg5_<_ztqk@ zQp@c}tOk9kSPv>g`*5^Su;SY1n4x0o?M?`3{io}U^R3)fVJPx)s}zxA?>|7ZhR!P@ zYT_U&q)+=BW0%;m`D$J5rGp$!fL?)g_eq2Oip;GdI{yJna!}5TN`*WwypQX|clJ#; zT$TB1J(Z55h)$&YEd8g2Zr<yM8p!yXvLA}RF(|cBvOF+5!~sgqAJLFl;~jK1A*pT2 zrcaBGsnJS5v7E^HHt?obhDKA;Gf!U*$uIg6l99=?jp9sywAE!AV*WfNi~uBw&P$iV zlfZIvhL+Oj?-?6?j2?%7m;%`=+Y*=dSXLn1-OCnY#X%i*T%-?@p#v64Y;E#X>C)R% z4zVWJAH0H`T#%N+xuv_#J}C_?Sfg|O>5wQ!*<8mr<9r!(bMYmBN0I`HC>{rU_2#(~ z;*n18)zuA%q^3t?ikI|*c@8drbZQXBX?-#Zuk;Dc*lXWr=dy~%;mUkjZ;~5bJC0=# zkhb1Y2bK&vjY-)~e26ahKjN$AdXWdCo<aSciqd9BCmb~W9p7G2rf3DVl>gj(eRWsm zBKSsM-21^99?sNnk)BM(X%n8vfFPw7zQNFaWK|zm<5h4Q8!8@5buOY^PbBJ@35VJR zF&RV4z9m_Y5XXeZTGWoIhB}eU6dLc)2`*Dt$!J#^+6+fnmQT_9v|#&y?j0ub|Hv-2 z<uoTG-^*05!W`wpANek8S{ZxSy`4z%6{dG8l@<EPKMo!0v-%2a3dnLQFJaC<%BRmv zkk2BnK6HnLw01qx`nvib&dpz3*7;nJ1bSICx;i;Ko{LGMs35!NLD{l<4u7QnBP{u% zj%NNwV#XT=geFpRkrxFgMc2${38(bOI)Rh(;?~RcM6ArA*1=Qqb5V}y?jke`)J2fk zk7E33$dak9v-sUiKY=^Vxbaw&-Xc=+5_8>03a(ppe?2P}BaK9R$<`=|@^9pNq=j-$ zxa^XOFvvCCOOjVX@HKT|7UjG}{&-LM!C_r|k&|q+>xfp!WV4)5qZyRELk$bTBasw< zl9}Z46<j0mpj4g$w`%%79KQQl`Q^hFs~$HfY7onI`;WE-=cS8w%tw|Hk9*~5*R($J zASZT5u5Wx#9w4bd%9ptJPKUPA5E=i<)rvGg+EYmZ&xBhoN%*C+&tY4f9=N^;YYtuZ z0-%&rsK4p&rA+(2_HT|YpIrIixckl$*yBjq=k%i+T?AY1Dygfx7096Req>f423^ct zdLC;>0gz&|bm|vIr|1tEphhV+4FlAt>^K)`96rOmtwL0qQafV~DozD;52CB`LvX-i zsX7?9qx#EFccCauJedbc0M8LE9BFrm(I*BY(bDO{NCvCMolj^?2p;Lxsl+;0=`UY; zr6<oo?Xfud_Tk3VSUZP3E+Vk9SIGCNB#N$#*se_c{3bB#Z@CS+9ue{u0R47EOYeW5 z=U6~N__ehS5Ay1p_qx}bz;`ipc#nSm@he2-=8W6#(|a|9j=LF?2Xk%Iq4>BidxiIi zf`Ae_5kL!_7jgUw!4uS25+I6SH`3=^Nj_vitbmLtr2?j2Ex2!`C<pH5+ja1Y&Vk@1 zyw#WUfM&^b7VIrHX(6kCa_E9g1e~wFC($XCt?PGIm}@!cAf)@j9R=wiaRbVWclsRL z+-pgKwS>u!*f>D1GrH$rCiR}Vs3mpbuvA7&KCSDKs6Ku0T<-EW1Q97bHM6(5mU@@2 zE0|Nc*Y!IaOM<MS6g&#;#u_b{g*un)oOmkVwF&hGogS`SZ;h)Fgi=LH#Gh65-Q?XY zo)Vuyq8M0UE36tC*gyZ=Ptz*=**CHLi8~$L5Xu=D-|0fF2Uvn44u9vht<X|c>vhIl zq*D|})OANjZGwqy0tE8I1sN?a?Mkt%56(=Y{$t62A~<&ZsWgYn=s(%8xv0%Sgl1l4 zng=B-Na$L3CfM_=&-JENb?pxKO}1+|?0T8Kj`!1ghG6Z`Nxrs4t1uoqS>s5XD)j{0 zkR`Bx{am(qbnh0UiJ)LZ0Wr3cou;7kGQFU-+UmU^$XClhj1ZOucU!f2m*474sj-G` z8hrg%!m=(-qOPi$P??|z@9D|UfWN+b`_(4OZ?i1_q-GhY@h^E)$Qi%BAf`jBncN4S z4`d8S#4n7iEqZt5qF+&mhZJ0w>gLi{rHn$PKYQ1cmh=GIE<9Q$)4opnvTx(P!v#wa zj|jtysc6SAd{!>L<~Uw1!t=<7%JMSb505!4yk{*0V?&WVl-SZ9X*UF{i-#8!U5-k{ zG&7(Lo!X=Vr|s19Pp$dYpIUZK{rEsc4Ai7owE6dWy0p>^Xlu`;i(wE^4;;&y+{wS> zIg)redQz2UTd9dM*8x8nTI59Cn*@q?&%to<8)`W3tvdvuz86<IJV&l&O|CPxLk$+I z2n;z60yG)*Otsj5F4<Qj&qzfP?VMlU34+GRP?>lldS8cd)GJ<8nKn6_8Q7ujR8Xjw z#uH1{A8D~W$M;nto1ML1I|@j8^}3saD{6-{VyXw##itr8!y$tQkT+zn7O~%(YA#fx zbh=Bgu$C)*FYotEd26fyrqBQ3YSs*q4Ui{lJ{xu9DoyK|XYbZ0WaBCC;?U+~r<(J! zLgh|N%hC>7THk9wtC6iGjeW1w=uADxeQllwtJ*KCOA!w2YZ{)F1yp!fDV!{qdX5>T zC@c=gh27j3L{!cgK+fOgMP*W{CeDTbd^E2F1HAjbT=9pMW^Rjm&$O%di#gIvG`|05 z<5IH(Mb{ib2a}bKY3QcwMQATD_owm<YOd4_b(Fz=mz_{;=8y0x>PNn9^tDMNsF3no zTA7O(FezBd2ZA${#Ilz~$$Z|e3PwUNpP4-#oW#COb+bYVw?JBC)Bp`d11cRc8OFh5 zEMu=jce!XwZBbPGoIDZ)j8Y6kTk5ay8yd(+hI#ow+HVr~26&{3k#cqBJEeeg;Z>wq zH2o}n;Ew*cWWN+|#TkHOy3p=s*%Jh=m8rr-tqSE@5$~T*S}hd*{?PAlfdR&|B4M$T zEfy~-)#DyX^VAm3k^AXPzq;g(q7`yMa(n$wU)``Ms#K&%;+aNngJ7z7G^;{EBe}6y z+AjG)^;&F-i0q2r)6`%M(v5}qo1TxW_~^d!LhWCL&|jq|mQr06X^_7%C|8k+uO23E zo^s8=>8~S4E<U&qKKn7UO#8!&Q5^<hr!3U0)ly|&9>;6Xzs~GEJ2>>z^$LFOxV6AN zhrWc(gUW;7NpHNcgEB_DrWhLhY*9CiEQ1A}+1(DTvXUs~A{4pHWO2U}zR*eD&oU!I z{bs88ha~)Wj;9pzaT%U4zg7Dong0sU21OstmQfCQrO)>{W7)*AOt;@ufevAoa<5=9 z2PWJW4g0GoIO|RN!ll>r>C1BVC$Or{25V`CWUx6i6sb=ub>3$(osQ^qzWIU5JR<TD zyj_k4$ztl`{SEyZvaD*dMAx`5U_EDI-xF;@flCeSV%JtMPp6vu>Byi~(UkDYyYxoh zh#hqD5@Z&+m7Y5q0HrDK=cXcIA1R@G2~tP8^a~s31ZmyoSKxjyP*G=P`0&ZIfi)}> z7HCMa`N%Mjbnifgy+%Tav%!P_gnXl;1>ly*E<2^m(E*KXHb4S#`~(Z&BwMH9?SP^D zxksRhJxK6OB3n#ZTWla-jZslbp>!IO0Q`7l;ObRlt0(A=IgvHUFs~3U)9<nDB8Qnc zF>=@IN336kD6!6^AuQ+NZLf_#hJhkh`O@U?6V&=N3gcBr2%`Pmndn-*iycUpI{#Xx zLtaryy~sQGxz3S<@wSo!MuZM00^CV6JBhXHwG1jA{TQ^BV?#yc@M}@d*_t8F4MfZ8 z{5lrNnS8N+5?>3uOb{GI7CM^44yl|K4fnH05+uOC^icdOuTptvltrIlzNZ6O=M_MT zMZO%Y*9?PYoRDT2;{k-)lyl6Mw`TK#Urjg^9=}W!ymmR-!A4R?XHBR51wyKR+`NIi z(OiTNv?L`&k&F@uj?H5>y`U#&yD=zxd?n^x7YgFcOc|vT(41EWNJBqqbEH<BN}A$U zsXp<WJH=3nU|A~?@5(YZ!wr;sxfil%t%jxSsC(a}>BPk?meXVX4gadE?%%rfkCY$r z<7Rp;zHFS_x-C6#vDKfWxJ9+R-l9&_Xcf2b|Bm3#j#ii|Nwlj8NqL_1rw&30c}H1N zqx@z3$YK|3pxcR;Wh(Q6j{zIs25y@GS~J;>uaa<DVj=M_7>@SsOT0KzpmCxSc*hF_ zWz%oE{hhROKJoO+)Twmyx1h|(P5Gjigo=Q~`)K$be@@}8;}Xsv+XJ`an>8~7ZnwAe zip9b<Y9z-xEH>fG&c<*)#&|KFSh_}ajs&Y;o3(m24O*xhns8B@;evnHKj|@zVD#8^ zkVSNc!I(N>QglT8Y4#A4F~$eSxoB}&Qu<xy1FGwauscTi#}TJ}g6B5MYg-OJErPV? z!KgwK-dAxR^MA-(a2Z)|bq{aIK?<9h4cpw+fBp64&iblKSuS;sW*XztGqbJqdwzR1 zI;e6ynfx_+X<Njy3_<rPfx~Vq*9ff`n^^>4J+0IGB+oAY>Gr1Yy`(6_-!j6!`DLX0 zXIidt&Gnn^z%tzo`9A+zQEj?{;ZLy@xvWKvJ5=fGkSGZB`=cc-_8hJ<FU*2NeM$ex zrL*>p9<8A&-Ky`m5<xK#j?;Hs1XV~qmB7m<oINpny6_2>!EYtZC3*P$s{Pr4WCa@& z-wBz)Pk?H~3~Bgu`;<=}b>4Y+%Dt+*uM3O!dy@b8RLs+&wxh-dfgtNjbaIybvo^<! z@ORf5QOVs<?H=T?n^ywNu9jWbX3#H{0=vpc_?48@+iJhxb&vfEn-hD?BCpw(fgGX9 ziC7KpiL7}2<k@2Ftt!sbNaQP@v+nl-#rl{D9)$ZulIIyaJ$RpsGcrr^=AT6QY^199 zfp65D)R8H%j-{g;L>+kZcLnohqtXQFicgs+#-@>TkVB&nmcylZt3sevJP<~b7fr^P z`VkXL&L^QjlUW6FRbtuv(Lanj1G-XX1&`d*2ALKFlbQP1Wm2F0%0-Qdc!`I&rS_Oj z4QP3zvi1Y>iEAb*jIF<p(EU|i*vXhnJ|dDNRK9eX3I6u=71{jRni@lAz{)p3Q<t|H zBBG;?ZCLL~W@%kocSN(q+#4f>`?sXut&;68XLUYJR#2{oWq1g6@DWwX(11@!#Fv;J znI;|@3Qqf?%5i`5>Zm(U8&#V;(_6yK$qho%pDOC9vmhcg!|19T7E0!V+*fx8%>OA; z$c~YO7)((gnKjL6ka9z*k!H7%gr-xLE^S3#@7xuKsp9a;meb26NZSPnZ4<KHUSK>I z6wcx){^mVf=ECM&$B3>@$H&nn+k{u!^9hH22Dq~s;^ED2kS7uQh(rm#r3H&{msi(n ztXhhH41-h&$D4^7<E0j{u|7*SR}dZjE65`u?AvvD+}qtK0;LC45dP>@D&9hAeHbn| zw(CeyVoE)PNFQ|i;^7#@>*GPO)7X!qiB(ChN9U40wnXyGgIj*DzG-A4Sc6i!yY@P% zPeuN7LQ)JKUcI&;{p0&Qv9Cf89o{F<KcePcqzBEm(Ebz%8n6DKuZ_Xq*qWs@?P5$H zE&};ed4iaw+Tq7%`RhTP=Cc;+`RmyH`4rw*hR#Zq3W_AN`AhB;bMD0cC@!$T-)Z=u z4y&nx8|8Wk!_=ZTOt|c9lgiF+M!U9jO2bqtQkTsEQ;11=kajUZGdV@-rhKh?(V8Nr z<I)JH*^7GDlZ=~&2>3cGlo3fiuzWDc5)eouc9$_Z#Q6%<!s;1)$qWtX6qX!%N*^Sh z9lr{SHj`4|8-|_z==p`%j|o3c`yB8G2P7J9kaIynjtn;qLzfF8ioR{IM-m;llHUu1 zp2q8jV~fnjk6YIo^#Dm#5=JwCcK4F1W#5|Se|_?05vF=hdarJ>eoPK3;ooTE)sWv6 zv2P}Ieso>OGd6WY!BnwW74-pE|KP95W%QR;2O_5ZLi@NTXWwF6TSWifyVdL+Opy@K zlBVF&i|u}FK7UbzbcmYZa!!aFX0g_YBfu107Z!|Uh+PlDOY)@Pu=ML~J6hC83QK=u z?z7v?mmYdXrPfEu^_VH}&nJ`eG_6M7AJ@TOAYMZ%kcRR%r9e!>mt=kXheo`e7Q}V& zq)^d=>=IwCXJ)}4xW(>gWsS+F(>M?V+Q(YBJyw}@&%{E4Pl{jOQJD{>QWeakM=1*_ ztr-YlnR!mnAlH$c{iT(~aMWom&g<C*F^=*KNL21_@{VPn&611S0y*Uv<w>yo1lQx+ zzho=U^4E2b&*U~gn;n}r!6@V5k_ZE8`?w!bd3YPdv#(m~2o&}ez87D~2z)3kcDy56 z_5DU;wI&$-5i`+s+}S|gr&P)zS88!VIBMYM(;>e>nIc=wfcNsMe+K@X)OS@{Ge{|j zBpO+t&CVU(mz|oDfkcb-m&E3_)NuZlzztT7N~M`b<`wsB_+%GgxO(6Xc1FV+*95KI zG^(BBm2aib<jO>V1|JptRL^oKVdV<rRBO~e9Q?j|_Y{2@5HL7iL3Ce}H-V$eL#`6t zE@zzPx=Vn;*53O5%h+3+@<o?Z$&4%3SK22+!R`Qqul_XtI&9s3++ok=nh)M0N(f;@ zv1DD%OG;_h^}t4kmUl1flu)ix>U>wf3Su;y8E*jjb<)?OoG}F|tdEcaNV<sirFW@j zk4@~Yj>?~d&X%b-DBpKkw%Hm^{*ZnbG#beG>J?G;&)|wmE!0Ne_)}Nakn<ndO(Du_ zIt|;#qhr&#FhF*@LkVNHK|%$wJPOZ2Z;4QstqWz$#3F`n8j8nKJ@8Y#vSAo))2YXK zBa}<y>epnbK3oUOn!iSF`A^^Df+E~0X?))Z-&v!6r5LT&jlM6*46RkL%Yksbz$oNg z6y2xm`#4Qs!=e)xV7|#t5T@eQD$;oH+kgiEkdrZIDfdSkvFnTA_;+{{7<b$tnEUKo zt3rCGfO1m4&)BJMr3t<xHzI`y98uY#cumn-?`JjYc3<`&PU80}K5;R8&EgR{CUkfm zEOxK2;NF16w%3~^m9afHOcp%KtyH_eoqtsK?JGL(wf=G1D#o9Peue7Jxnsyjei=e^ zcDhtOSB>&@KMsM#CZIbT5TBO*bS)o$v_7~QG>*!~_xi1`Okk+Co3ig7eR*8tA6zrV zfoG=8*|L$2?zzZ@yjsEnc{}yiD*>eVJ!xQ{>8x!N2#b~n2D86a&d1*7>f^5mJ7z!< zxIXF|X6Cn8E))VcB2*9PE#1kcFKrl(9sG9$zsHSb-2CIXC!2}AXBTU1u}s{BIeEes zR(>n|F+I+pcdk@Cd@(J*<T1~yJ0AaUe4Qm^7H`wn>X*yJ1wnS27&?8~;rrgwsh834 zZ#Z{@sb9ZZiU8fc*m6C!j3|zS+-O*-nX->*)}P#fb_p_*i*X(4%_v0wS6@h1rq%F! z`q3&=ic;XyRrU$)U38&s-}>1NMjTaTl--SKiLzZ9H4E3|f`8_-Dv@6K=ZsUGN&t&V z!^kyrjz2A=Ae*{VZ`AY%GB63Eel#gEHUFa3cGjlM%mCkVWDUQjtYwxYo`P(u194sw z{C+y<-x5F?kIP6QlT<RRRcf6@m!<11z<S#!3MCb5#kYUdQzg*JV@*_>B=}MGzJ|W$ zvHV;1zzYssbi3-D+SB;-k$<|AkQU3!M+a48HWYseDheXRk1<h46guw7ahoq>=)u>H zKVi!E-+l95?_;A|M(9hV7VAom%#X#cNf9aRAkB`#1!n_3pOlUe$rEm32pcLjuyxO= z#gx;uur4E6b_Vi%85MFUF7G@{)ubJgcr(zlO=?}VFeyQ>PTb4*6%I6eK8>!TptFzq zd&h4kjn2btcNCdTRd`#0tos$=kOGX}U#UK9bEp-+PTuQ_uU~GfzeD_A2FkC=17`cB zUY!LlONPoQ0&WUgPO(6r^ydxi6OEa1)j6?lGyl|0cWUI@uraJo@`He7Gn<I48!YF@ z<5lvi5Vf@^Zc^Rz_pNm`hWT|GT%?7;R}fjiyAqep`dm9|hepokGJz%^{~xv}$OV^p zupGWb;>7g`f*6u&#Z9F($&b=?0oA8LUOTl&eVEaB*>0wH4|sG64#=lM4SS<v9z*8( zR06M@WaQUcXyi@lJ5=_n9QQxxAPzUKHBm?TX9+l_Re5fkv`4gKlk=Obf8V|sAF?R> zodJBTaH3i<AKjelapFAHe$5lRzwmine&uRAR^4b0PcpY`+$*um^zkvPfkOFHJ!0S| zbm7bul}UWalRy7rI`|xjgo3Ax7^pttl3@<hvay+Z7FOnC?!xvv>O@8qya$Gs89vU$ z+~guy(G`Vj#fe(!ICX0)>2PF<R54ZR+X67|?TT{~>(0sVzQmS>g2kt)OE(}Ocr-s+ za5@W{@-R2SC?dRw`w!?@+2w$iZw8^Nj8NYjzq2vTWdf9XLBC9VpYi<8d*LQJ(#XL3 z<F#qzhecRCX+dt=7`);T-JAUlSl(4Q73Dr$_bdLT#Dcna)1mAq&t-|<3Qs;pIp0^8 zZTnZ0dwT5`@aA|&no~Z*q20kE08xXB{N@cKf9<40M2UX${|Xg(Zw+3j6ffZwdGi=d zJ6pL--|bIUBZxJu|I++bzdc<FdGgUlRr@o^N=r}w8DCZIIBI8!%NmZ=w69X}I7Yuo zW3h3*yU&l2_8uZ?T;<v=&^030n0ZPR4|{WQvf&1I%9v^Ub{HEFn<V07;4(;KZA~iP zTbB1n4snxkgLlO+<$Btl={Xg~1SiZp^U7Ou)BE(di%V3(^uTt6r9x34_cIYeLUW3( zXI<>p)S`6fhNPez*v6#Lx5<>7QExfwupIT7L73^e<;&JKo92R~Sg3Z9Q6xt1g`fui zEN7Rx>zCEp+irBT1vp^O=_^a*6Qbcdl5EX^mHXMQ65w)!9J(10>MK``F}+|P_{fNh z&ju<zl;tOQ;yUFL_~uJ{uHp;&*u{n{>FucK^)E+x(_m^%;=BGGeoSCJ*<kys)><N} za;E7ccgU6bOrpsi-cN6(Z-I|lG}c(8{}FCk6~vNuk!c9a+yY=uNX$Y&;_rW~u6T?N z-zeqB?P9w1j9VkV0yA`XX9B%I$v;;vOZe95Dx<I$i}BpXKx&&2AO-2u(g{4Q7!AD0 zXxVM%g2$CVewW+u1b2o9G$FjPv#okkrlq-Vm~-K5Y?hUv{hGXd-t*=bMguyXm=8?v z2%mh}(s#f7RP*_H2H&$N{um>wP2?||t(rKsLgpr8439UbU4|RH2c^bwr6U^>>w!e= z+LJ~(d00IFDKE{xDMAVBdrGQWR7w+vd)^^YIfkW9-pl;J!bX*hNn~4!x$%L9KEQpe zbeG9dN^Xs(VdRpl3-ao*`Ws@cFRpK5$9{SibgZL0hwfPg-@ND#{M+We&{iJGBqYmO z;H|N!*t*?xufDquL1>*%QuDlKWWHB%cD7*peA0*S7aOXx^h0B9nQCvSHm&_LPq(>* zymH2K5a*x&2eUv-zxAA^?^<1B(%OB>7E%~k;{G?3lUH4mvoDKwUQAjjBFG(uaqL$0 zOZrY}m(mygyEyRnzi=-Nddx|H;-Lvrlcfvs@QYyH0aN@I3mjxt9P7a(Qx!_wvIm9Q zb*U!li)w0mkjF<%#Jy6oEebp8dg;4Iubuym&-4ZnEL+#mqdkU7M%H+-VKD><z;^%V zw&?CQv4omaC8dM82o{K+F5Gt06Q0j>Vpg{=z8l!WPN6oHvqH#T_Z_P<fyrOvBlJC8 zmUVC{O3dl&n4d|k&W#v%=)U-klBLzvwn!gHA69<*5eJb8O*cI_s1d$r=<6+$7=H&> z*|(G-*wy7!YZLUeZRA)VSx`#XS2TT`VaJ4BnhMW8y>zRu=r;fgv(xvPl9x_zDXGVZ zU5zfhR7JaDdFDl2mS8y>UlMyXA{xXYj@DiB;kLv~-)Bq@X&DQ7bkIah))?)YIJ_g) z=$#_NhIj`Y#Z0_yCUmDyXk6?koa%?|$|)|ZP96tRmAx0vQV{ho_4!*H;0-ffsAQY8 zxmrd-$D>TTt0&0`Gt>8phsg#>99%Q|KlK~z;gA6b#i+U(7b;iNwop*EJc#_O74S4p z-;hz?o{Y`?df}<f&0X*Xoti<60(!R^kh;YoWynIkk<8a5(m14k5Z)|t{k6T@;3ujJ z)t6y1-PWjMna}#Isd5W6;ykjvI{F^86^IizaG^-{0ICO8Q}jKULeP6Vh_+@VsT|1~ zNXqA?)*Ul_l-Q+|W*YO&+;Eg@Pdx7#pAQw4uZq6T56YyEWc<M4PTA1W_sB)Tb-^FC z!Z&qq`!s#~?uh5sLaCr8o1#~*#HCOPaG`Q|XllOSl~nb#L<zcY3U*Xuk&tIBHwxq} z^Zb_4Nx3@Ta7jJ=;qbLR4gE|p%x}_ne(vT=Jno#=_W0V{9c)E23`Z;?+nv_6nSOYr zhU^yhFw!f(;9T$1KfwU5rM&^{?YW!jONXJL<O7Av9zr@2D6MxhIb<@=6y+m(c)Uhm zN_AfQv{H86%&%m|V~D`jLU5d0_4HM<R6An-#CFa`-Uk3i+D4tOzGULh(>LkZZow=% zvh^~##61~QPSO{Z()xD#!mA23B7joH^hj241g|Kiv^j62TnZA0i}I74-g;jf?W+i> zMf7$iRebID->Aj*UHUF5zj9YNf-?S8)-hbmp!&+hhS9L<du^ob5p=N!ZnOvANME9Z zHbUpCjQ4MEpaydWTDXF3M07fpkh*JdtR`#r3<+KojNqlz>)H4rTW`(ug_-gz1Af<~ zM~-VRxnb9nJyUIl2k|O>Z5Emhp2;2Brp3Tpx^E@Z<1_RA&KFU^0I_&c66pb5#RJUr zoh!d-rnBI!yACT`?s&*(rIPm=m{Zj(lH#~0={axt|H_Bk*2s?>72P2VFqv^-ya=dY zl_4pLtuwEOp$FOYP(6L28*R0I%*F^uSkWUPN`p^i6;$7GGg`;gmY~fcH{awX@yv`P zYUi*6csjN;Kq34v*LY!hq8c9G+UZ*eu!sX}#~K&dn`U+Gl8lXYz!wQ%ay)Uo%+|Rm zdD+lWbA@W=S7P06+p<k?oC~#*D+V>KxC85_FU%gx>%(0+C^wEgCh#3T{>%A{_7qx8 zyf>|{kk+Rv9EvlcT<|J=FD`NQ=|(l=EUv3VmX6!3uxo8J<-L~-E_?enK;MG$EB#p< z1k_3!5=2yVbrD&(ocKX7xPz|s8xq>*`F8*BeTYEfB@&$K&3{H;&~&Ktv`Iz9{bNVT z=Xm(fUaA*I!>LM4+~(*D^K~;8Pe?ty4Ist**x4jA!=Q^-v?-KG(&a6T4)orMUTLtN z^zx?g(R1{LkY7`69=z;a7^IE=#xis9r}Mq^uo3~h*bwQSt=gwRblJN)=fpMfQMLQy zELo3WGL-BwVjI0(#gR@--}OflT^YYq|L*K~RdjhQx_XYk*7*vh^}ux4RjSu+mHk&a zE%$<B=B@M%A5>ztdfBanQn~%6-yX&uH84$(Yg4lOEr$(Twjs;IHYF17XY`GCwiV4| zwqxrAL(;f3#dgQ6gan_Rc&Nt_L4vO6h4l`fZIC}k-`zq9Vnv{QpDrx6a+s4++_Nk* zeP0xiLS{1*`44HV%`omECuwen)Zq70w{O(L6{X{@V=s6WS4#Pym|cGpk*-fT6NAy> z?%|YKa~xUqnDNtiLg$O!@95i$f-egwbieKi?<X^y$CI~L`WH+h;%pzdHDvfpIaA|5 zM&I3iyi8v-!i+0+K`oA0mO?UnTcd9X%9<GXMes#iIyqG~$4*Mys4w55{#xexU{3d6 ztMppncJjSMfoIBU=I4%C?2+r;Y1y|fEhH1ewa0|XI{5>*e|fk>-)yIAM9f2gv8rx2 z`s@w&5l){M4!Y7=Xeg{8NG?e!{a^a#SsW%(E;JVYD914g!3Kv0=^KzCX3~)SGX=H} zeoO~kj5IkT1?bHSJ#%~Rx>!#l%i3E~l)j|<qI-2c><#RaG$d<LF2SJ!os^LDx6wW` zT(8jkO}t5!X1i}!_F^hr@jm*}ZPFao+dYXNL~>_ekin(zhWe`kK5BW`7^;4+0qL%D zqUESN^3s1aytobe(%iYw)eEBOz(N>$NPWLWlGgXAr=fI(WvpG-YPZsAzOus~@1V|} zx<&eGbMSMeXD~+8Ooq&=O@ry$=77Kulmo$v?fcUjjoj<P3@^sngEb%9m*qoSz``Va zoj{z7C1TyTo`z-K=$O!1jCno=8$T2ii@Nmeu=k$m)ZID_RRw`w&M!48A=2loF|qni z#j=Rc_n%GXNTW50=l`W<N*N~U{`Cr#b=>^mIw)$Mh%=&~9dDoQ&gR`o3U8SlKSNbT znxt!=X?N)7p<F4VUMqd`pA;4R;Rs)J^;g1THM6~DPeZ)h58Qv`>|EzTe%As~_YR?; z(7BLZm~Im%s-H-M-4<R^G&ZQqVSe6>Tj(n2OiU~(MtjX<l9U!5*_BIO2$da$!@XMT z_w9V#xV1yy5`GbB*lI7BnMCSmxMYHA%`#QAJgi!@!JmE%q~34%U81jk6p?hmBEd!j zZcN`FFsBQKhe7LG{ER<}YxK?c_QWcEp9?br?@WR>YOhBu4@_TfOy3uvLx(>Rzi_HA z{a^ax-Nn}AfIaM7_?x>&!4z>0=+Abb6@;S!h<tX>?SImDbm%@eVT@dzKCR6wb?Jdy zu&G{nMzOOJ(a{5WrZ2aDs{4l7i2J92bs`e!r&o~G+PspV2f=x3f-s$VBzZT}m)n1~ zJh&7nd#B1g?7ZnWZ~TE@?3zV?XY@WFWNWQztrFdLSqpZFl9;~S{`r)agX#;LL8I3H z!3WchQR!>P{7m0Z(N_vB7S&f9Hp%C7+;~bKYB7lxZbdJ~G%F!#f!Wqvn7*IF@A6;^ z1?)-umbw%g_ry1*wBG}w&lb7hz>t(2Dh0ePygBeteWvxwt*AGa?;qy+;+;l|Q+h#A zF(j3p6j2?1DCWe44V#_NJXCEN7dG}jQ1!Eyn_D@OJod&YV#Sf^`zs}8iM~1&WQZEi zEYMAjWrft{X0@@Qx^-G^DJKZ4pM^4H9u?HptE&o2=E|)}CQF+*&JxD-t#0?GD9kUt zl-Y}*Bc*~wt1ZvY_UL=Ba)-A5r~4w<>1@J4&@lm{-y5WgSV+z&f;HYHYwXuJ112Q% zxvzpJU{C*i0G~~6`RqncEULsG5>IZQ-p)!%YmN_OQ-zO-CwFWITN^5K<-@LwgH1x; zQ*2n7^5YTh)vpzG*#1sMcssm6CQEm9sp_sqmoz}%j~z>J`!s!f4GTy?St^xF_;5sG zZ=)}1vDMTaMuQU%>}}!}lseg;!x}DJ|H=h}gD}!0Yd}bajJMO*v?iJ-=({|eV9T?z z?#uM8O`JhNuK>%!9`5jqoDgpUWy*BjGIPM}bH`Pi6NTM`aj72kFwVkjudsLv06p$C zatb5Hqz=}77J6OU*cz20E%J4zRDPSjTYbfbU#4%30Je2vWcX4Cz0+hW+5<3)W!3L; z9VKnVof%(bX#t|qINt9WdKDP@o+4XTJtU)7hN#=?ory0?<)`VpEq#n%rti;e3`4Nz z5(&jvwCfZjjtKW7Gl9f0{ua}#d-R5H3q7WrJiqw}eQ9x$388KkP;N}$`}A8Uy9y2q z-~pT+xc17QA`wX`okEVg5@<=#=iG`4^zE`rcBL7uXT?c3o~{bN*^kh7@HoRW!dJcW zD^;om8SV085SPnqoW3JP^m8E*`(^v`EP%PCI2H#LR~|Ti+^trnOZCgb!D?wBIxuxe zW&89Ujw9tMiDKIW)Ay@Q?|t=v%VR|YXUA;i(&XYE4Sa2M2aR}_PSU^V(tTz+vA4e4 ze{Rxt;A8Y1UI)&NWZm?I1qUBvfCKj0r7tAAbn&3@?1%4ytHWl4Jy(C2zIgN#`}-Vn z6_4q=kG{JH5?T3W`o7(yj<C}YE}=WKl?(A~@#FpYJuwyW#N!+YbGX|=TpxY!!C!8W z7vjLlu<E!megEyNKYj`&_9u^jW95@eSezR!tZVSCCoJj_`r30*@K0}JsuA;t#=eQA z!WcKv*POj3E5D4OfBfn%XdmCO0(M<TS1+J1(-#p)N()q+ttEJDP~4Gd|6ja$g!5q> z&IcCOBgXIlKoI@kSN}2cgy?E{l;5`N^zG0%UDo-5gFPvg9h`B28tHrU0GF?5mH^E3 z{T~Q||NH7|^X7%aTP><t2rjkDTH-U7htp3Zx+mzXmw6A2-~Wmr^?zUe*Tma*^7j3C zcpH6b@tfTWIH~(GS|%eWSCdK_rtd#Rkomu_{&V2fL*Fa<>t);3qq^_bCMMb^M1bUt z^i5pLHwtv<f=PlQ^$!pv{_m^*UfmQmJ<QMAd5^Q)ivh-?Qjp=QN|ykP$v^$ZpD4zf z+*(~C@!?xP#GM%*fZ_Xup1|~NfWGgE{+_9>nZApIf-=8^{UaTUtuFc3(o|i4Y(9^v zHsoerNo2bN)Av8ncXOxwqU`Uu6}>+~;Bp=H&1!5&w!;93%%~ftI^y+w7(3{@Qzxw| z(p8Gx!<_#C!<Q`&Uww7hoC$BHwB77~yf{M8NuN6oI%CyBAS7iA4cYAQekJnB<u<ZZ zK_nmrsWG|-^Br6DJ@nP0z4~srpT0Z1(^zd}`hMWm#nnG}+4dl=UEWvW=m86Z4a1cQ z(tCWqp-anZj$NbfdcgUciUpDhYIm0H5GnB+`Qyg)t%<%y=$anq)Cf%z2_Ga^h!yL# zWw5m|Q0er7Hj$MGIbNm48;_~h=-c!x+hILI82<Jt7kt)znZC8t_ifc<TNghAU&>-R z7Una>s`3+UmzFi*<O5_4n@Di8REqC_<J2q@|IP>W->o1_--_r<`{|3jFG==2Y}Bpn z1U|KCrw61`tSN@ypJl}Go$tk1_pNP2B!R7GayNb7x4LaE2Z!GgMVs{z>dEhWQ>gJ7 z`Z8>1?Q8M4qcrHY9vtP>`cW0qcjJlVt^HTCRLY;z*G>ocC4IRuegCcH;TJmNhKt+c zDa>JSFI)dbDSdixTX;-csQxz7ud~72ve>w5z<8w)JQliZI7C!^Z|LxyGD*K&E3Sfb z`Z9hmG+L8DrZ3a?$wyMlA3I22_y6XKDuJ`_#eIF|lARy+EVIR;VO)<Qdpjf2+?A<S zLvFs<wO5j}S!S5N+zRwn|IH7jO8TxLXYmmHjP85MB8(;FL*3VBN-e7TASG<dvVA(? zqa3_g54~#K?sd>;ho5T@q`>}C4(}!}>%KI9GNv!Lf-t~;GxKkxoBGi+nW>BJj%R{R zk|rCQJFEj(0_KgnudP|MMBhEKY#-1RADCQh$&hfJXhY|a2Vcp~BAMymOkZx>5-a~( zdUaJHeNB%X80sqQEktg8_}8om{S~E|>SI^7(+i>kcZrbGIE#iBOG8?;%xDOok?UC9 zyUo+9TLd4LO?suMb%DOX(BU?hi~lATtD8#kBbNY~GF9wd5n#y`QVyDAQ_hl3<20t! zGpa;iX@4|?f5`dT6o{Mfyi~1ym;o;Bh0l*huC$u$;-a{t%?Ip-+zkg!BA~QZw%Hs? zK(<MIM2xxZqVIn@c0*B}>bt%?eEPf`rPle-C{t1lOkr*-QY8v16>|rP(@l11xc0#s zt5l#b+&_r#9M~K?Ctz>ogY@MDzqNsGGS^Q$6ty%H#+YbFU&y^=jr9nNeSq7`sFc!D zSBK<6<6l#TS7WUDr@azL*r5%&Cej9OlrYgfJI&(D=tpM@)0gS{27N0@WIn;|Dt%?+ z^p$<5>x{l6W^@UJF-0|1XGpd%_2libZEPY<bIW!Z&q!EC-v=ywQ|eOx%6R*1IWj5O zy3O=GOJC6*eOG>2vk|UWGp!4(G2jdY>CoUjLd?1<7|&h}P|<ri>nTo@QKO3Vy;-(& zx;Wuv!J<27%Yg@H)tBk}Z|Ez9T5@{8+s%SKWn|!E2KS>g&K>o{`WT2xOz2xnd@hj! zwYZ!mDtWMs+7!x&WKZl$^gaGESx7yY{CtmONv!=xobG>H{Na%Y=To<TLSG`f{_c6J zB_K)drLR+SUO9Y0S7iv4GWLH)00iTzj;Vefm96PiN_psj%P6RdzS``G#9j&*Bo~25 zCHfxZVd#}eT`e~R0!{ds-5}h@U%{@*Oy5zb>$xl4B9AC-=`p(S?p3P3)AMn)_P}pE zvMX>Qra_VJbgLf(?KZlbj0IRsk0dM8eRVe|_*Rd!3(D--cX^*pinXoc5D9eIu&p-a zqrC5Tw?j}@YtzHIQ2+u?mH7`W58}2DR7&6FxGUA`otukKtgT+y6<QOj>=M>wi(CiO zfP#KPso>8gm38fkdYRVK1E5|()=FkZ(d7kok-kE~Kz2Rma*&IQ#0|@PFr!imQiyL_ z@?vwpOn$D*^mP^rNuc*^2sG}uOyz>zZ#=X+XvCP#?pib}bf+kagTFbqZ_ziDe?03Z zz67jlGNDXyd*ZodrxjSGS-5%>4kx}+&{5A<&oo;2?U*njC~m!$Nd1OnZ}t$aG{6dd zU3TN)2kyeUGlLrgq~<5J(i;bsV<r5OF}^{slp6cfP+*B@v(vCVaOqy4Uz_gMH|(ku z2H2#Q5v4A0P@d24$PN(S*L{z_JJhZE&W2>)a}6blaSBg~OVHH;O$f6RLzLPWF0GY= zwx?~WjloHPh*bXoIyIk^=vx@DvJ;v6oN*MAmdY5B?W%lqV^F<)07FWNyIP1J)A2Rw z_|#HxT0BPDK`IToCVJXa1TTbRvF+j0^u;qZbC#Ubo1-rVx}_5^m=0~6EXqP0tg8qz znmD|kbZ4+>w|*K5D(Pk!UT>McPP^8L3Baq^`67WrTX<2_I<Ew|%~XHe6r5Xt_E#mb zE-E>H&Crc<Le974^sME9Qw!~w->oiC7%T4{Rn8Wqx1xaF75WMrK;XmkalW4oyV}D3 zQ6|dqqUvNL6|{yP#wbr_U)m9PC1-EDNZ;Y0pG<xtWlpK6K=M_eC@oZ2*huQtjW~`S zV?EuRBMZrL+WNQU^gJNg^sqU<o3f23TAD;Pb;Vgx$aHcN-86lRM>L4H`<<P<qCfe8 zm1!vT#Imuj`yOw`)RMBAL`-=}0j@qjnsM)#`3lBANc+yMIP-ydTTag><A<-61iF8I zLsRM1CCpEJR)#-Q2AiSpMBC73p7MzTZcCR;MnXWTP*P@%FpfcD)MoV(eLpeHtml<` zL#36^GQ6xN+TF+4rS{}(w0Q?l4}42b=?)F{zm;w{OkZlEhy2mag(%Z4-B(pK>0$ZX zAFL5-@WFtQ!o^Ulej!(7x7H0mtLN!E(;^Wg>7ozAgVW4u3fg4L5*Ca@bM|3e%e+sY zgagkh3B(EQQ|={b(Uoob*Teu`qp$pOaJDK;tg`&pl*bX5zdieyeg~jz)I++f_g`&U z86p^Hq_CW>5AO6X9FS?h@6e0LRYXcA`5~XDFK#Y#kI+}DE;%M#+GeWBbJ_%Keuao5 z<6<W4b^#tw)4tc>4<P485VrIlr0?f?3|!hkC6_kJ_0xBiqLZmo_M7rPS^eDgu!S(@ zi8rbUb^@~*u|2S%*Ma*TLXYAs4I?6j*Z`mtrdpVZ<r4!TBLUU8BuA5!5Krm8HoRi{ z(PWBV?Tkjj|4a>TA@1qi_Tt!VrTLr5d*B<EV#Y1g_X@yTq%Rb*TP-ym?Z_ewJNYa4 zZEe3P&ZpztUW`)%&h7-|=Yqh+mjrFP^Ea#7q%T}bQ%;6;>UhUU8{mB`>Dju614_Le zi^uH%eXBf}1b`<eMdS3{|Ey>eZi!ecSfus_|CO0cbv*4F+iTJCeD0&K(KmFjFviA} z1nJVLs&9XWYY8*QGM({)habYYGS3H8d&cU^^sUF?H*BMy6#)1EeHVHtwJT;v*2DC( zXH9W$X_GrHr7TaKWT(p@J>cK=9r}*Cf0QT*aojRHi`*ICHp=TJLe;z^p!<muL;dUd z$Vp`2GJU689QoMvDE^pkp7i)kzp8N#+1d@14WPDB2wHpR<{{#1CGyJ*{?azgLQxfB zX{r#v#gt<knxuEy#ZWJ4^rXRY)<HKlEv%S&x~yF1dMu00dxR6IE>>9P#`G=7-SfKd z;>@{O`PI)zJ0)fVt-;_v6D)wzHeA-ZS%FReS4dXSgILO+x_=Abb8m0C=+gYj*y|o% zQ&$44S11y<N!TZ_8B14`65~}|HC3In6$6#x9OxC%_dl(PD{4y{^u>PqDFxPo5YxoO z02Es--0H(&i|G@fqd)K8b~mV^nUm@OQNN(TWJxhLtIr-c?h`axtN;kMTLpFCvb^Dp zu+bjTuYu^FO_bv&v{6b;=chYDTQtoM_Tib(Sjm8)uR6*6W%|CX;cV1@y_voteimcG z!aLWG{Rd&UJ5xOxloI?$RVh(L4_Gz$58GPAJ5vMgI8(-p6KL8)!bhmd!qtadI-~vz zCDHRS3QG1EPfcRr^j1<UN#3N{G*ED3`o5~~?$P${)_skiisG@iu^D&zrtJR#T!Vaw zag{a$q$|DVNupoXkM*cp`nS^xu4cyB@dBslD^`aHJYm7w3gQ7MF5hZ)wb&ExfK#Lz zL|CQ@YbuD@6L71ZzUJGxFm`XUAMkpJ69Q}5>d`{rr!YIEMn5;L@sUfzV`8<oK^WMm ztec4_8d&nHsbPQS=nD(-WG0e5Cb9`$Z6OloMf{>HxO#KjtLJ@M`Q5L4K0sfWxk~?f zBN+64TG@w-vO=hP*jjo#6Ap$l&2Vm>@wnJ=)sxxW)_Ozdou#64*>Y(+PfZykBc|{K zr$R*f5-63D-d1^Xdlxm_Ngcp1-hmT3KI53aU2w+#_waql<CoOWg;9)iY-yzDJ`m8Q zDYtGQtt;@DRx*Ak|H@<Z-H?~rVx`MkZ$Wbonk>!{y=Mia0pQxA*&RI+#_%O9Z3{{r zuwQ>Q;M9vWiiZKapT0ZyosH7>z~A1#S-Ukbfldl`k2<5lrRt_kA<Ik>cdDKeGH+R< z;b*SI_%qp>j8=f^v?DweQ`@$Jg{!+<b7EJ?JfF&A!vt^}Bw@EVG`B*>Lwo%t&90$7 zMBfH_0cw26v2<ImQ&sV7KU~@~=~N54_+0gY^y+G&k1C~v8eE2n%Da<^R~jyF3o!iF zhBsZ*6|5J^Birb&ogl89mp0H$>O8hO1r8lPR8L=Ti=|&1if}B8uB}=tA5f>7pzpTC zB>bg}Q!$l}EU+cm9DLlGDi{N#q14~5;CpvwGYi$a0e>wA?mRK4_|ChW1*)vS58V9t z8Gfz#g0=@k{GWm{+wwK?mr6@R|4UGD{gTnoFMcw=gU;@TIgxXYid}O)dz6Ze2471= zAr3LD-5GF9oEk7apf3Plt)bq<2K*yu{~aPTWH^#W&y_lyQdCBDckl!iLqQ^ca0y!q zqAbj2DFe)j;zMhizKG~jQ!%j5@LTjX&7Qoi<j1jLM`C}lSrf+vPEq>F#MmVvVCS#= z@Hy@YnHeqO20H6oCP2@$PX|>SNFL~$URa=w0~CXnD#Ko_$YPmYSjGqN2``6e!HIGy zlT#Et5{FLIal5`-Z*an(JzOWVxNt-<1+g#q(zLMwaM7ke!0*mmYB9is@jK-&`A}^L z!4=7%3j5#0%}gXk*{uFRlUo``NR?EL9f!#||6;6Y()oZpM_-t432CV4IgRny16Jk2 z!=++BhfDPBM6;_HEny&iO{uo)ayH~E1Mlzd_wrPENdl$*L+03>MTRq*Y9Z;P)gi@1 zk<98DlM{3zZ#wY$1WDtHNY8w|D1I9h-bmbu?yH1#p*UDK)2ThlX&`g=4*GuWw4@O2 zgVUe_Et{k-b}MPN9@V*b+9<>=^~hVn@4kg_fTJ8bMdw30Y~z(w(H+cDx0hr&su_wP zOSz7!8+~q_CArr-NW@aAeoN<V2|g~alhWqt32F9mRj(-q+=wjsgnuZ8>NWa)YZcp3 zeO}sh)Tz0l8Qs_6_wBvP5r-sg{*OwuyKei`Bie4-RnP#Wbj78^n8x%C?h|CguptB$ zYsbXVIn2g^4`osZJv^qj(_KhebitjW;E0yemn&o3MPFFZWJKL+F)a&@bw>xenvGC2 zi{Dzhd4Wm)hQIrBDg+1)#}UDG-D}W#T;W38gA&Sk(Y0QN{tVfPbyigxEVD=5H&26S z3!P|vZ7ft`#ghRav}*feBp;`5Da%wLKD;&%U33zMtai(du!1M^GvfPWa#+`Xc6pFw zOL6p1^?TVokk%_#LQP1KU|bLzdSigJSF`RB_Eb(=3xU^StvM%r*lI%vV^KbtrYpLA z)pHL-#<{@B4Z`~200sAiZon6v7Z(NygQE#i7WYq3@d@_%VU|Pv!zbu#^G-cn#O37; z$zd6I&NQMbtI}~Spnd#n@{gVc#7T;OphR~0P^+(-mqJY<gz=e?7yfC}%t(_8a&XfV zXyupIC~`y5?ahhajMu<^VUbc+y^T2GC+B2X55*DmBc=zJd-Yp;@8gVnY(7LjHHqIO z4;YC2<K)AJgDKa_kMxIXE-cO(0LK;Q#d(Q6?^ic+D9?|8E0;9%ORwx=6t@z3T&m5o zzh%?(^}+i?f3{(|Iig%DUm$%pNcsW#_CjLd@ng()#|R!p(oy;*yZuW6vhJV@JCX`Y z<<@N~U8{8gt!KnM_6RXuUEEX-J|Z5+U^xpkucQoQi;wiXs`p7FZwx~=rk{mi6VG?P z+LE>YK{^k6{A7tSB$(`-n~w1iQ%SH~`l_kim0L8+=CDkvZW1v!Rh~b0dNnT!U6HZ} z=$p1PMwmgzLeNgxuwo*;=@bc~gBB3_&C<Hxz|rt(ud;_^y#4=&m<NHwjm3~M*F9PV z)DTx<0{R)Ktuu^{%cfmN%yn6zkS3!Y3vpJZy8GWvJV0Nta{9GIr}CVXK{$`U+d81f zga7gBYkl5tWXFd9(AuS0aG4LZ3BlVjds|{yc26&5IQ_b@CU&Sef;3r9aC$ZQg4;9_ zjfvBwt(dI}`~EWu@C_OQY-~ELgC4{>iuF&r@d>{fkdM1lmBM7W%q<buR#ll5wRpgo z^Quk$@H8?(*5DaE9dL+R7<{dC!e5$Z{Z2L`N@xvHy@WKsfpD=5<19|}Yw0(N<xW2{ z>%&v~FR5!HvCWZ<28cq5j^#-kGR+@xVv@eZwNMxqtrqb6b^7jXsxVl$3|`5<T`Ogb z!n@{|w4<ortYCQfR+K^T7Av*)Jr5TipGf!~H#sk9ZW%xqJ3yg0C}L#b{&J9_L=^ju z^0c7*M)<c=g)GVH{zul`Ay;FZe0a^=;6D%-Mth1rrV0|>%SJh-?=jI^3;?<%vP93X z?Yx9KbK3?SUoRjlPksQyRK9*vk|i`q58-#ra5;>}tPqYnR+GDz(&^25qDyKe(srpD zMp?wnvV1RHCD>>DpxgX{2LxUxhYMJ6Ce8OFUVWnAf9F$aL5%VfLL5@OnZ7Tybmp05 zL(&bLnB=QhQNy~;xFTXH%v$LyZ$6lw#&V77^#q7G<F55%663^#bt`m^+i9V6k)%v$ zAu%ADertYa&9|pwTUL`|*XhA~N|uc&HmZ88i8B6ykSnuq9Fu{q!3=F+OdTYA6tt<i z!dy~r>fZzf?sd+;=XiOdK|4uMw~E7<wCb&C{IssTVjUXt(<V#}s~nE<ETcYb!e|4a zD73AN{OQz<8dSu6<cg5h&TkuCKcZ9bGcyz>!p5E=dwH;~oXPZ3livnh`sCC$QrRvD zIMt}TTw^Vm-*d^2DcsU{sTl01t4$mr4sF_gDM;6*uv{ptwSl!;v~0+qLd*{M?yzpa ziz0TEzSM2?{OnXF9(V~kR!vRUv03F@6IV<Xe+h&#Onp=^<gH0wgC;_+(hFi*8r_c_ zreYDtP|phgRJ6g%BoHSG<^c)bQ8tvOGsl(AR*?8xVl>NOuuQ<_$_LXu$gt}n9CsbF ztQPU-&?(h~?ptX^H)~6~P~{Kxyu>x_9S(JCym8nR5!@~eG(E_#ZRK1gw;dshS}3LC zrPGe0q8mD?iFsbdISYGYz;I$&KzD}e&*cXDuy#|uo7j8PkEO=s-+<VrklMFS9<Tx( z^3BOJ45f?dlDHF1wnw8SKiCauP;TR8OtR(;nv5PSLjJZskje$A^je$!y{VqQ_FXG- zRK8f%8brb7KD8L(CNl4v9%jCYx=;Ic>yxQf_Z6!a2%R%cKp1!zN-B0}YoL8@n!OLN z+)ZRRS|j59@?jUb7$kVj9dReR?>nkiNL;p0`MtDs&PSUTf{k%vU>jGsy&8l}T>@>L zQSY*1{E=v;L<P%{3QMRR*Dwse!k7}#F!75tfXC_UCD8oT{wuGkx?P@lgjSWEZF@Z3 zneAa#ci_fe^Gp6)B8Gd$G0Da~97zoyOb&k_W1r}(bH7r~@&HagrPzeX%=v(Th(wZp zv3Pn0!Sw4_VaT=DWb9!|U$aWzlB3J%byefUZWT*y?i(VbB_2KV1W<kdB?nk`G>Q8E zB?@*i**a>!w%HC%1zs*JxT)&gO*Esh2N_Jd&`l!$!epN)Ng~=cWcY;}Tth9;H!6*< z`+E1Pi-OzurnXnvqJ61w(c6a2D=QC)ffI23(x}O8ut=|mNKx8DNatywW}wLB5qvR+ z<Y%Sz)Nd)uyBNTM5ZR;!F{ZVHac3+hcun$#AEWQZEatuLpCqm@`Ew6xROPy!dy@+W ztZ5BaC7sSRky`7_TnQ2j<ve@ML8k6wN+vYM&UOQ&pYH_B9t?tPnn9{W%>G`f8{k5I z-w+b|xEd@ibuV>|)GKT3x=`i%aFN2zWCnLBU*DmxG(|-#t0*l7Eif7dhp~xMZ^+Uu z5@7Uy2DveDte#MI)Dy$&&lL0VAkuwqup)by8Y4xvI85`4j^E2EeKTujVwDWv;+}og z^4={;6_J@hRvh<W%44~s-W1B2aZiaIExWOr&Y74beqrLxEfeG5Q(_O4W9W;p$A(^~ za+4g>&Fw@Lu;0pT9K{)1*-z;kM#qnZd0<j&ttUBe@sz>ge4qi&1!-H>DyQ!Y_kmfG zB1AEnQ1+N33csPryi?w&2hpWqm`X}JXu*UkgTttgk&BMC@v`wwdev$<(QdQy3<W#y z0)1if=b1}H{5FPkNjm8V3@I$a*<<X&<(<<!f+gPsBF5kf=YwWz6b*Y#*d_M4TR}>D zm^nNw^4A%1bzws!Vh4-4ad+a}+ocJPXZxy*zDm^X%C+O!5XzM&PZ=0sW-mH=x~B30 zxo)g5Wz&~=JA&-mILdd=+Px>K@18XJARL{Hsc!l`Bl+D;sH85^>7G0^La?9=zV{}L zOL4W(lgSnep2b`=Sn%T0!=H)q-VrycMijmiW6Xxg%o*_sbb8CFJ8)Ov)+tY5ShgEb z+2(Ly--0u<z!Guw5|gp01B;CR5zyMW@^fIdt>F5eSly?(?=U#1l%oQS%OX;`M1rDd zY00$#6e;#`uso<%={r${#U18F0HX8Z@UknedsocGtykRj7<}nwR&~nGw@2G^n4U8$ z-=OknL2?=<8brdG4Phh~1}ky+R*pKf9Nj;`;R<Eqr<)F~$>c<2D>zPH0Hn-uD+9DA zkyWFGcUy+5aW}<rHCRl^S={`|4zl0Kg{208%1#f#GL;<cpxymu`xTRluk6Btoj6#F zrA-bcA4^<|h5;9IqxkB+qf+`#cIc-xVO!mjuE8=hh~1-^nzpPAS%(%)k@sAB%?PM9 zm|@eBFNOUWi{uwtk+Vd^fd8IelnT-~2FCcQjWJZzsKHr*y3}Z!?m@i+MT~XYBQ@Q0 z-!#xQ%T7t7X#~3U#a^sa?MC5(Mcp@soA+wwsD{cNrrY`7Shpvd{^9%rTR9XqUK(b0 zjdZE7g9?ds3tHmiu;#+JB^s5IcygomkKB78IDMZO#_+OApDVq0_EOH8)>7shu}9#~ z?F^tKupm{szsuPqrqTtVLzgBZ<J>rttIB{q9Z%&*#8FY%;TERfhsh~MoqKLgn$cHw zGpB{I^UQ=UA`$@-jf1j7cVQ+5HJEUzaLj*LbM+N4P^)P20d0y!?Zko(yH1_a6u4r9 z>?Vcj*KtL=<uTKJV-%vAsj!Rm?ff2Sdh#rkiV;?3AA3{VQoZ!e72!K<!pG_R#2O_V zJ$a)Za1;gpo*h)bmDGzUhzB42tTq!fX~c2-S3A{r2pY|lLhwappi6Rz$1qXr*_ARj z4=jy8gy7I%f`f`K4B3pnRHARJV9`HfSbY6HZ76*KDmVCU2|Z-Yy9QvC*soU78!@eg zWYiX-DR6G7)w^J`3jC?Xa2WnMfmLpw9{XU&OGB4?8@liGoW4{<m>xeRmeg-qf{96r zYV`ew3msQ0eN#2&8TW`Xeeo&!PDSv6z~IN49+fzCQ*ReuorXzAS_Pd`WZV7;eS@kQ z&#b1iS}1oC4#PZ)=W%Lq8FSdNdY{cuG*+M-OoAZ>b+p#X{JCRy#1B$%3Y*y=v=m9+ z;F*2u_>KtY8ZhoqayJcldR$?r(1pjf3Cv->r31?yx+LYgum8^M)qRz_f|)SE;Go9h zB1{5pm4dV%LAFHSOc2b$sjm(QMP_n%>#VFDi?A4-()Dxv9sCOdjnw4Nv?xf|Kwm1~ z$Bgt%vbKn9hh=jJb}4<w<wlE@ZPDa;@&sqrFK(VCeLN)(ewU>fP%wmu(kxgHVSrC} z0KjXT7n%0PqMcd3V9gA<6!Zdt=ea#g<4(~93d~$>&FO2_=&N1Oz+~hhc7NDk6>&w= zzJfQMoSwkSk@(zn2e;=_T0CU-{Rn=i`41oB@A%UglUmln=bP^0W64DK&E^n_gg07b ze!EE^MmH`tv0_`c`sDNtkyK?PMYxJy3*a$pp$OiCk}@W$Ie=kxLT1TLVdZwJ+y1)) zO7&56AS7ALGXf*&i2-@GBSXq}1+r{V$mmPUc3&8zPC1K_+(jy%Swa2gv`75*s#&DU z9uEc(&zgM~5ma6FY^j&sF_)=%mcLM5H~XLW@YR!PW#-{uGv}|__9seC%wZ)xmHiYp zll+3i|7DwC=fyY+ZpLYpMFQ_~yp35vRY|9WNp#-4k0`z&Ogpdq5lzm2A*bowhP`Og zg`IW`yiYp9A;3_VIT9H1^Z^qSgbcBEP_#&yMA0=Hc3<DWCV#A5??*$Y{lc;T$MnUF zzOeTL(dY0@m9mm7NmSNvh{hDgdNe=WWSUv9ecPC++`$qvin%?FbHyF<Ko+k<bNVI* z-Lw>^2rBD9Um5A$xp=N_PT#Sl^dve;z)WSA-3Hm5x~WQkp+FOXa$+K-tE!{=_fNg* z%%o=a@~)yN*)S$LD1Jyih}aF8guX8g6z#xZU~4O7{e)@u)R3!OgV*1DJM2G_zv(r< z*0*ZZwnpDB3Auk2h;IgDWMhw}kTyC>C3UGvFiAmur^N&pkU&dyWn`ye?j~EhinZA# zV9c{RnAx$tw;@U?QWsGrx(S*xU$*?#VjNK$(Wq5wRE?yY?kup=y6BUL{Y94aCL7HQ z8Gtp;NV~S;&Bh!N#fnqM?>1sqc~qTDT(M1Jjmb)COrtak@zd@nqr0zi9)77c_w5Cy zCHk8ElRAACv-5$?%VysJD9;iX6HD17)IpUJ9wib@2_)$m{w|p^7Ji&)h-ut$=?u^2 ze2`=Es;DT2XE%u<IYQZVLsgk%am*?O<;l<8T0J{^8_h})tT>A>(JMw*x!whVAf#aB z&};KJOcjtnvq${CvYb~Jar$)Q*N_5OFCWk)Z=Ma{a!urR@mmvpcV!1pviZHd-an#W z497blCCt>V6D^+otJ{y?j`DXVV=JIZ9nBK@`Zd{zTyG7W!5p^Ex-mrm_pj~4o{~gn zFrjZ;A7boX7z&f>+X-r+6m^1IcHCT*JqO^ai86h%{5hf1b(C=^q{^`+O(84!tbMVU zb&ArE3$KxsE5E0&Jad28O<(hq-PUb4BsD)IiM7ajO=-boMHGr8l8x6!>2=EapBKyz zaOb2t@^d$*#CHG16FG><R7U!Cv2bu4e$4b>8m8#%Y-*YWXYv?@UU5|rLhu5F2<P41 zQOqr^gGYcKh25GYrJ|W#XP0!*7!4pNJ{$4=RK)?YO56mqI<`75tQ>Y5w5Y(r`?fz) zN^6@0?rGjXL$Ljc($CTNN4Bm@cf>@so!b#s?HZ;GP$}GIj%FX7A2Z!spRTm=oc%nW zdyM{vD|=%hr+u6#wgQY1siVT2z9^;{3+?ZWv+7QD-%*Xmd3MBUx3AlqXmZ|Fs+&yx z@+bq%$Lf|aji@>jwx9cu2r;Q@RE2+JW;T#2*N0(RhE6Se;W>+gGEcvhQ*9K$t4?Rn zypmLB?vJ(8_e`#JIb=V9gIt%Jl{zrZ36|D1jHme_AAl<ubt`{y50}B8L}#|yO)-$k z`P)F>Nd@tguu0^_)Rf^fc8{hE6`7jd6V@y|y9%(X;vZPR%uzfQ4mfUs$o5L(mpCy{ z`~tZUDsjXd7+v9bFe&RaC7p(1lJDm<P)V>*j<jX^qB(W{o%H>U**8#ZmsU^8ACT+4 zLo4RYjdN=wFcqK}%M^8^C)D3=$uZq5ctgc6P{(96ILVrg<18Ds+`L)@#VVUAeKVan z?@+&%CrRhMs);a7`XKgjuEg9`y*LkCT?Pv5xz{Rz6R1rX7q3k(RQ&5XCd|$NyOoZ4 zu%TCPwN@Z2Ij9pqzU*=O(hupotZ@5M20d+6*liw5U!3_j?Ej>c+Q9_S&Eo#HreJ>1 z&+r$P3=sJ*l5D@ur9&74qMO+S<zT81c_45X%Y|BJvn-Ly#I~C+K0)Udn#A0uk;>1W zQ>s}GFi3*yh?YjP%slOW+%H6QTHDU_frU&9lTvoi%ob9rmvp5;0~`!(ej$g|c#f@F zsj68!ef9g1ZmDfbF8*?6n!<g#jA5&Mo?QKK9>J+#=o>vbeY=;xu%x*J2Z0iOv%d-T zztK4>%)wC@VG;HL8BPPcaYA1gvMf87`D}^4*4F`&>g3+~-s{+M35vMG{$N8c7W<j> zjzKu;@FJ2hn?)<I%Mo<6j?CKV+fW)Rr+}tokA5G4#}&Y+7Ca={qpx_+><fjoDQW^g z8pFFxFXEQBQN(Rg^W~@XL6*B_1Fn?3EAQQKfXc-DaHCApqDeY4Rzp^jH~iL^peoO! zBD!wr2ZMW8aU+7$)agzSM>KQ#=9_gIYK3KYnOS`(1Qn8$Qp^-rsfCdeotyL2?k24v z3XY_6JX+Lh2H=7U?6%v4SEh|m>Cp>4$i<{WhuftR&<JKsvD}>FFVnZE;jYV6?t$+d z7PXIw*l()1&6>45AG^WZY)oQv>*L^x1Fu+&KJ(_<d@##>B~~+)<$o_RFLopxZYV2r zH2%_bAqGn%>sKjjX;v!%6T5&<&Lu|+B23?dVCZ}S((cS@84ol_m9%No@TdhM7~LUN z8ZvWGpt;;7kZ1$=LhdV)N*SYQY9PDUc6)%pl;o6GtyMv2oxY~K-Rz4;1j-amvtDva z8@ng*yLx&M^Oa}nFFsKGVq;S&hcqbR=RMGDz%A0$Q(;~%K3C&b>Dx`{>&8$g$rUF0 z;QVf=U{~*?rF8={dsx!6Q=+HFT$nVKwprAzzWp9?C>8+Dl!{KSuE5%EO3)|O$7s^o zS@ife0#6h3m`vMg!=~_6`UdZPxccPsh_OmJheIRfks4M*+1<AkUn=1@SQ_CO^TVE8 zYQh&>7Q^!CpF9g~%X$h6Tk5Xs7EB0bQF3#*7ZPL4vSxjRDVW>mmE)O_$wmyEncvtg z5V+b%hsJ)%b>$%F5`L`|9O_>svreNe=wS<acY{@^oYL)a9<^Iyu|@jIqx2mrNS>jU zd1BuL(9L~?LQZWw@u-saiMuLnUp>5Jtp6MRL9u)4^lcA+P3pFsDB-05wbCL|)_KJ| z9e4T-4pyQveG9oF51bcCF;DjbUdbH3wqXTB(NLmot0aX4jc`c=j_P;{(CJ%~^2fFQ z@BysS53_p3zp8The+c{^=sQW2a<_3l1~Q1$um>uu=(WR|Rm|YBCWG^1@#M6}dpl9) z?TbI)ubC}#;Rq<uIQ^hm2ni|sOib@7@~}yJ{N-xOl+WmF*Lb4@X|PE)l3Zuo`wgom zW)~w1*Mz<>T_13VWR^_GCjpGf1*b7PiKHo^No(UC+f-G~5P#tj{Qu|+2S25=bc)Lh zGwB;O-11f((M*n)m+caJj37&3llwH^&gJ+s;H|+L(>sqz|AtNJy$<;MC#%!3NF-~P zp7m0`K$gQIq?nQ{3;Ua|?*&-9Ur7wHG4bYlEl|E6b3KMFE|u8T<Xi(b_XB&02Pbft zC%Gu9z<wmA2~2CTtLo3|z(1$2KKdz~3)v{;sFw?`ys>3k{tc|X&6ZpG-X69ppHB%k z_ilaC`S%Ea^Ma^a3=wjJVHze0aFR%6xvWS!4+9aZ5GR#v2V?Szs+`<?VD-M;HWkN} z)K*`>3@osb*-oDk=se(Jl817o;Cw}Z`Z9ihPG7TRhB#p-I$z!Xt|}|tmIqe(&YKxt zyA>nDWa86AV~Cv^4AJyk{=#5m&E7-IPV47N?zqaz{y#W7n@iNkM2k+UZDPhUDvuEP zg_4r0V#gazCxC@C4Rn<YLmqOv=QK|K5YAw-kd?9-H!W)q8tbAkeeb@k&Q5sGiUk?7 zSV(!l*+F04==73;XuPQrX%nF%f7fH1<^fXMWEh;^0497HCa`{=zhb6}({w2qYSa&d zJ3C~<G~Y&aI@aaGR2uWWY%GQj+uF`}aEVIF)zQo0i%<$IcMib_<)rLOTJGFwEX!77 zP6K#6^{if<)Q`9nGkrJc`#>+tBZIz3cU&^vP3N!jiCv&L2h36PLMn&pi^xMAWy9|X ze9i4=Pv3l>;2zsdbb~X-29Lq?Y)pyuGqxQknPL5rrB6edzJ^jmY590|O+`TIf-rDY zyJyv)viuf$sSA_kB2-xF#Ow+OwaD>PvQ7fik_o&f`r4VKwXy1+l&@j(q044&yH6Bq zllzTjS{yFWBGTGp-kBZcl5V;x?=H1^7+>uA5x(IF8f7lqL&Xd6Ab<6WZkA-ULEF(_ zrnNRf6!<s^-NLx0jHa7Ogd&h#18{xVaQ57tnVgiFb&J&WbPl^Q;z2Gu*yQ<z7B)lO z#5QBnPCX|Nnb`sAAuwzhpsRRD^+c54Q}o5%a7-t_6IuBWbP=7=pdnFj<hnZ>t(n{g zlVwQ|)w!{jgZ;sqH{{&;_kQz(dsw}p`dWK5(ku!YgxERfbZ+M@Z0~z5w0u0Li~*}* znrzg|b;Brg>&=D$$Gwv3$^ny$AwiRx52KsG;Hoo*io5J@dP=2}?9A4kD;2EnGE{A` z41T>rK<cV`^U>r(Z>FCsEp%z5FKmlwYujYHt<sz8QJ!w6s>HH{o{=1#UkkbyydPrD zp$+=xhKPtj+#{MHx0a%5=OEfD_ocMniPG&Y^1d2}9HM^LdtpMTVbeL;qDWWzX;3n! zPm!La^=}HXm?)H@8+NA2JvS33mJsnHpsgGNnqRsdPfJ?E!VA<%-*csf<Z~TO%elrt z?~EMZ{wuRQB68W_xFnV7tnO906B`3J&%~(UWd%30gP11_K4NvSeGy`7jh3XQNq4t( zUl_xZXS-Ezkaur4OHeOoi$OV^<w1<h5T9zdy)F_;gQlyG9R{TAR8HZc75}t97L;;8 zykIlk3Za`+^8Tp-#0?xSs_QlDzHo}Z&m~Mp@96^<hX=ObW&g4Nj?I`FEEeashfbAt zW&i@8P<Mz_q4ZJY6QW+|iHU>DSQ6MArtik#Ubc&XF1RG1GX}@XD+YZ^uvjfl9i3UQ z7PEpA>jFAAxpbIEwHq%I?d<Y6%K`C<iDAAig5P-_&y!iGjd!Tu@<5f**KYFm9Z|~D zDn0Ej;<JAM5v2w?UFlCp7vFIgr}H)7N%KR2zZrdH0?^UfR)n)TFyeeC_MZiJGtf|2 z`r@MI?X@Z`l~hc0GYrN+^OY55`q9!>#+SDUQP7vW{xlNGi6|e`CTG(}l>)7QU|Cp0 zK0cT3;vwGQsj`|+JdJ#*yLxS3ZINNzj=od$I~Qs6>v~Mp^}P2(H>*IDm!E(v!A?vF z1k$Ofn_GyDIul@RO{5MEs-J~<Os>D8T7c8)tc+YipW}DBMs(&n@7%#Eod-j%?%f06 zZGT<4q6j}{d_3&6@N~@VQ`)9J^#DIP-8|y9C-+@PEG?pe8n4*279C0{)9SKpEDt|L zPTy{x-fWDGkz4fLQj8M?HJLl;^sRU(Z1?_&J)oQBL!<bW3<W$<mH8`{6|6WFW(6-` zrS{vlAleL<##TUw%e(br4u~_)HP>}<McI8r*M&kl4YOxoPOsQO#ILXW9(`A=zVhbR zatxV;XgCU(Yr9QtOR{cM=c0IcVarh#N_oL#SN*K|n;u2(q3_fO0nFi%2vyAoCY0<2 zgH6C531D1*aAIzt;E1M%=aF+osDM#9Mycr-iT9uiciHn)UUP)l-p12=forHP<t3J4 zy(lWv_w2Z={f>4?{?3<zZk~h;1B)OG@v+UK^<|Rf^@64>aK=uT32}Ue;fRMOJATm> z1Ad?2Z*EVeJhg8iVeap1L&(cLwQg>m)|3Ek((N^7HrZ}b_w6D#m0EK|CNc?FOa>uo z?%B;_*&#;Xr$OpcJvg;Ft{cWv`3iNRm@@9D+WNY;#lNEO73E-}J{4xis9XDEqZxgD zu!HKJ1YL&#v-W|rs#i29!8B78>0$M^GqVXO@-mac)uqf&;m6PI5-{pUPcH$<TI>9{ zg!RMCj2nfCri+=_gYWM6t=0hjsz6h_QgS?lW2ha##Q`mFMLmSFU5*g6%S+&~eA=s< zfRiR#^`5?47k%-`r@_0dHhx#8S1oa4RYM<m5nc^5<wA`ZzYBCSD=8+E{qSris3^AN zb+(Z;PxDvhr%uzVLZuAqw#N)D<Vl)8BrHjl)H<nZG%+vq+GA?4A5!2<Ru6(iFV+iO z?XT1~eG?gFNuPT@`L38&q+V|8AbUdDEmyF=0(kmmP{;4-D_?k;u3Yf)pil<gY1s$f z%@?p%eRnq*C1(5soM=l|mw)9h39-zs9y7hEZoZ-RQzG}a8UA|w`dL9tj=DGKOUkc# zW*>dm$Y91os8fFiUub=Lk=%$8C}hHP{ej_9znN$TN{KDEycFmOYe*NjMDu0nHc9+p z3bo(UmzuCVSRowNi4_OjKlaW;OInZ#qI8pd|0mut6BS(pYSsC}ej8>+glo|>jh+)} z=d*Mc?*G5oD`kHD)=ihCsKd$rf#eJ_<@n}vjewJ6;eONIlQ*<lEq!%dRL%D=($Yvt zcS%a8Gzv&aNGKpBU5cbjcXvvc<kHR3-QBE6EzJW<?GnH1_kH)To%x(|=H%Qn_s-18 zeP@L+(?n3BLy^aBdZa9a$RidPN$t>y--{0Y&wr1^x|Flf)=6H$HL#+=x(JI!x;f#k z$!83u(9=>r<8#~fW=STz0eIGU;w0ong5;$s_Wc7Gt|&%end@u0cGYT|U_3!RlIeM3 z+){?2zieui$o11P;I-W8fh;J6YNkqb#edD-cmS94sMR6U_MR!t`?LK+=jEB4@`wp{ z(BC%p1{E5M8pPuZ7}w8&Z4bt22)xEPA9rpYymnxJQViFlZikwi=8qRy!3TAOy9RCy zjuK9&GzB=lVAsDimS7gyi3VO6vu<uLi(P!5j$vnFB^iB|XvFUR*N3YND)g?|u`zVj z{mD6)f7N-)G%IQd##pZwGqr7KyOKDbSPq^(ztbqM+AE<NS)QLYgxnYD#`YiS&viG? zr70FCgf;c@Rt2YtJ*caWKi)9-O0nsCTy^N$IaGRxC>%Qv<HVl0TKrmChPuv{28n1n zg?B(-zm84iG^=u%6f;dud3Af`l0AUWtjsu|LtvmaqE%8E-nLmP%~q916ob$`{pjww zaRR^6wz2noMV!_)`}Imn?8CCS%>o_^9omVJbfdjb(LiKblkpo;%^oZdPR`FEk#?s! z|5+YYG>OwQ5kDtLwOG3?`1L7dl!?%IRxw>=*9m2dvr2t}nC2iPS`n(EaxY31Zz5Z# z%jph|`Sz<eBaI8*t~Zl5^~T7iFd8}B{M0f2x5{<q+JA5?W%!#(x=XQXY{X!Ibn>HJ zB1zqme9yPZhS~kM^z!;C-sW&d=*L8aW7{t7#-RA{@+V=nLC9eAzF2J|q3%rA{<DLQ zDpgHlNCaePFn*VrAf!DTGO_X&Hw3NzMm|G9Y@<MkHH1(gJEXZ0wK3n&-f^^pz|)bW z#B+d7bIMaXM}V?PsP*iCW?AfYWGLv%oZ|gF6^AzW?Uk*#mT1;o^!tXGNuTjzC_LFZ zMwN`pb3CKBc~JDau6zE(<ER)cE`6@{z{nrc=Xpg?Qc)3I26?I=cUEmP`_=m;JEn6o zSDTcFb%qy?>v6PX<7umrE_NB4-jZJE264Ivw?g0l4oh0wk>84)KF5ZlhV?-X4(Z=E zuVP~9r1K;gdJT$y$t9{<_`-LqhKyG0>>OONdW$PgUqN#*>ty?evvG0VF&7b*6}hw# zroRtSOe1hVj;whyZ2oCElzjT<PY(O)ON|!!{o>GUZz+up%})AFcK$`<$5Cl>4k^O- zY%pp)u@^?;lz8%`dxTLsxSv|O!Okmr*UDZgJgR6E?4(;D2GCV?o!Q~BtVN^&t6xIb z(IuZt7tMRi5-KD6m~KvMYTuU4@WWp*7s$OGqY(Vz-jVt?r9Yx;V>5$3`QNvb1RkYk zR%REc3~dzu#OtmH3k)bph6&=aDv-RL{8gLdPFk2+fPFpU3a@w3Uz?GC6l<6#jg4xQ zEU%1^>BvvPYWlTYVQgQ4h{R`0*G{4s)aDVBpIV)1f#$FFzYaRZaLXN2h&Xto1S6mL zHC3W{x_BB$VO79$daFHyF};e$?L`>dS`H7)REpm+pzm0}(8Mpw4Ushb;q}7|_e3Ki zB(1n>n&;1ruX7DZF&13-S=7D&|3%M@rCp%1{H_UOrHII*n%I`f6H#7LZYZlq(66`C zMvZCFgc3K)G-tm>U}DKyJD?EH$<b9>xZ`oPrpvB-)V)b~jDpQOB2BVp)vK5?CKC4a zFKY6v3O^UQ1m6*a7HN-$dv4gxo`t3AfW#GEfv!8Jtuz%hNN3cmR0o3+39_<EaH;M3 zUrt7dDT+rp8}*Skcb$VUe4lDR2>kxcIfh-hioV#gw5+R7Mc#QFthOa1y4w949*NDj zh~m~naSw?<F_mP`)xO{#xr6?c@D+SJUFzrj<CM6mR2$1B?az<1Kh^rq)sd@Wd1t98 zAAF@w{QGm79jBxn#GXDS!#)fW42v+n>7@Hj%8s3dXtsVpEMsw+q*JyyGxHh9yppB{ zJv75iC*P$8zl@i5kJWv(61~}`u$uti@WPe%AC8Hge6$a=y-#@=OLuK-k|-eKcN|P% z#5RLhsz@(12ugXRj~u@(R}qsG?jBYq@hA-XAbTP+fkE39-G!k?7yIsZyt1_CB&Xny zL!PJp9yPrOeUy}^@M3c`b52HXW%XoavSGGh`}_00{&fnNH5k?tZnn=~Af9GvR4@9* zWB#XO7r4{zgLF$VZyrSq*zMbol!tr0D4B;LgNbZ|prVZ=%cOdo2Z(GR1+3j%(@>il zQ@4D6kUUPJ5f$zte@xv#-nB9F^1I*B&yVr#)>$^<@)$eBptMs029ll#NmoB753zS5 zn`<@+Qh&zwL~KkaP2ItPou3}#id`bU;Vr3_PF38#|5=KPSoCdCx|98wS!7u(v_DO^ z6O3_7TQ`NCL8b_&KfEEbm1baX-TCryhU!GI8oThxz62lTXwKMWrRGwZmsm}uT@Ae` z4p$K0Ezz>XX7`i!NR9&3p0L^AQm6Hp@l__q!QHzE8pBnApbeEXQtfD(Jy*z0?VP#Y zafvFMiv(!-eT{ZJi?!yrCnU`T=Kf`91J?fcyHBL8DI-iG18AZomfex7Udu6&4&^_a zF+iGrX3hei_JzO`Bu4@rh*}NYOJ@^FLWT6!)n*$-a!lf%9i0PFm+%=WPcNK0LVchA zFwV#<ZSLOFKhUZ+G?#rNP4SnUKy#)H;U=rMYpzT09S$e!KHUxC@Ybe^Z9&#@Og+Gb zMXZDQoTE}Gr)n(U9@Q@=cplIv*)^Qlg?qknUocbC_^V$vxk>A@)sf9|Q%53nR_^rM zRrmf)`Elgy@8`f}N?p{>uYdd0zAx$QqBHKwg*?v4>rY7(4171-EWEgO_r6+*4B^7r zKIN?wncUT0?OCJowIr)=%qx+7YX2Y_r}05_E1QHaUdh9~6X%1KM#a9hlFRXoOtJ=j zJ4?(dYQkb2qaJkN_d3-cZlq90Af%&ynDT52u^SpQ(*})hZ^ZBwyyX?>UUAw^zRDI{ zFL916`SL+-{EpZpW#yn?$SI58N#fg@(^lx4dIQdzWz+wB_I{tH6bVi0SYfNb+wWJ) zd>d6q0GTpmrlkMi*h6o2O=_omjYb{BH6CM8hZ=fg2Dhp$?mIaxDiexo5<{)muBe~p z6%0tN8-wo@6lb#^UMiZZW#pWw4wb9BPk~)dL+KMgM8bkCwul7k@mse!R?a66%$%5J zJ?16Yo+|U_ozapD$9M^eVQ0rF>5<<M`rag~>2*_W_Bumy(1|X?TkFAmox69Fuh+Rm z-j(My^I0=fZZpLu#jE>yYCB<vI=qtjOYxTCzxp1c_EI}+_CfPmxt#puBGnoFH5$;6 zMJ5%Wtn27b%2(>Hh360%9|!OAVr{YN{?Di#&--v;Ihv;JXUwFz3M&qTFK#w^f^oNd z+%ertXMXvyrqom>nH3&z);8{rNRt;%>1f@(3&B~6-oyU}7reX>eY#|xl(>5qOks=N z0Un(bjc)lR*i@86*mjsCV}QkO;|81tn~&;o?%7zH)fbgKUz@mHVt&{lZc^prWgB?g z6oRZezCGS&<)XV$rQ%v92ngj({4&a`r^F~*8Y31hs#xWu1OH)8VU;Jv81Q9ydn||N zz3FB_s(rHMF!FX=ghO&lR(r$|UJRno2R6XTxZEuhe7fGAf!fjk-4ysTf@bP|mfXXK z@8cu-lf~m&X6cbE!`1w6d9Qf_BqX=zm*BFmb2YG@8x>zm+{_xRvHDs=7WYtF#O|X1 zJG`AdB<?Ja?+k&R1#6d)bG##TJp1)g1l9)8%esCyJmFZB_}!b}!zxn@4%nU_#I{uM z5EoQ0Z4&_b_NZ|$mY>)?Zg#EDLg)11^l=H(#nwjOGFEo=s-|FFQ1dVM3>A!Pp*pUH z^>nR-G<_r6eW7bc-a#%tS>3aHYR}!a{ZLzP4HEdQxOeEXLEFALJ}7n(DeqLFs5536 z98l77cD7LoEOZa?_JjFNzn1ow#-%LR=5Yv;?$v#b-lmL@MJspNd=LG)RGV3MemRZ( zti205=<467DdX{~Y8Qrv;bEG&u0m;s-K$;`&y}4L;c&4out8hlqypoI<iDkvsd+7S zlz9o1Z9mI=7pKn>A~QLbs&(svQaI~WAm_d>R3mZ_u2^kY7Tj)N=)()zy$;`Ux)1Gq z??q?l4&m0}B+^bBY$~bTK<^LA_C1(daksVVd{_=dnkNg)gi3I0C?D|*X%yv0q^U;N z>rYZUb4jA@_K3iiW*vbNmXR7KuERTT>X~<M!r58F3fwb<)g6|qlOY2nOzqpwzleR8 zJLY7>vpE~Tm4IHQN*$Nd@Mr%NAS*(RL5`I?3>DP(pKg!@D0mDOb97yK_l!no6&8|C zrexttx>esuA3sa8a1q=7(uMRZe!0^JYwt@w_4b|($QJ)X#|}9es?X4e<_z-m_zI8k zC@9;WNYfb!j>mlKw1F5Z_UszvLV`@MOVT=3G}A1M@n0|!c)s$FtEkT(NA(=RO=Il- z1k@AhxB#w7bG>Dyb$3`9;)`J_SZ@c1bgW`qt$(nEO|ULWSxUV>s1~VK&c3X@L&{E? z4zzwFePEWDU!#xW3a@!-SBftrQR+I<#L*;SEJ5WO+Ux}dX=?vi>@Te>opD1Hk8bOi zniN)X%PDE5@O#eiNX$-U-RyGfq53v;BQ-L*7CUL|w23jnzo+N<zahlj8#!MuYsBk5 z1o%^6h@;aLfs4;3O%$I_bkvge^z72F@QJ;blrmb*rci(<p20g)@TT|0RC_-&4kXtb z$IGvs4w-bWHl(U%K{zUC(B=^x(g<8UaYJM43_kKeO=}1+l5g4JWoq}~*)-b!{dY@^ zWS@s)%9zU<s`!f25z+hAsN4?=2b()cFC`DB#wX^zhGP{*z2z_0XyO~^+5&skJ|E}6 zlt%U$eUp~CkjJ$y8_uO)rL*^x?y)lKcdv__UyGR)BN@ppOU1hwE?uE!<-gx&neAhO z)qB@5`N$H5oiOW+=I{(sXj(7nZEs8cuH77yD6z4|7^)Bf@Dx!;-u1KkjE}YqVW=O} zs1H3_+ZbVL$Hb!|2WTM{_ff@b?`B8_#RllTlYREwe}<#KMkmH%)V2^#XF~51E)DNR zIU8_l`rR85N^xQ$1M*9<YV*>(DKjI;&-iFx9&rNtjNvp(U^T-LYVSAhnhJ@y7gohD zh3!}DUGLwkR1TygnGZc5-;q8o!n3PUnD%O^?|YPXBY6Zy=oF#XFIU!L6Av|bGbRa2 zbtue{&(lqussaTQ8gvk$L3^6%_@%Z3HKeINJL&JG`n)V%{57&~njX#IpzdyNCpKYi zAq_pX*$9%jUotGW<#i)7O6>lsG!p-jA|8KLv;6>jW#l}mjyPq&pxJePf5uX#dx0&A z9-sE3%^3HkRsuD^%yd5BW`q8Xt>SMAH4!T%u{<tMscjW-i^fr!;I}l4Oqh)~e8|&n zwn=QEU*;+pcxTM8wLywkhIi3~=^vi(*di0Z;i}g=4|0F<!u%mtl6}={PB-MisRm_h zClDm>rGW;&eX>;aCS6_0iM*4(-H%)CQDI385fZQUe>*m3)ms)>1}T6mg>5o-BT*1_ zc2!PSxtUK^#j2CI_G+!pK7>cQIb=-6keD_*HWC-dw+00H>mbKI%`yRtku?fp&lNU} zz3d!fITyx*YeBsLUAqjP^tr*(0GnGLu;bj?PeMOM&Uu!KEXe5U_4t))ZiHMYZ#@g+ z)1{$Gn(#tX01-E@Rpu(3`Ms*2!UtJX^Vq+TSCP@c3x+3kaUBwV#R`J7rGkm!<j!!# zB4w42qwgknFB@lk&YLHETL;g2&lfdKKY^Tn@E1Nvv&HgbbAfAXo6G<3iwM@Ie@{yi z%y<xg=2ckmq73(e)k~#k1RZN@>5jGMl+eMDD;U0OuETmTcO><S()RXhUog&8p}W)s z@rIEWW{qK0MK8z!lK64;2bRSW81}S8qezD?9HG0$Npx}9@J8jTp<rLHZ{djYtBzOp zBZtMSLTB?I5KkuND^cT@9|}sgpQ|X62ZZiV-(>jUfH(GgoNV1EC2Xo#ry2)Q5#@@q z1DX#w7B7u!h4)&S&fl4qk#H{@Y?J5}$hyC(mSGY7y*yiLlsjOw^?WqfbL57VcaurO zT8PFECW-rUGi-*!wT0&ax&I}-lDgB)r?ntHZ;Wjgf20+ix`2FV+c9!|qI3;o1ViNo z;`_#Rb7DogG)Nrsw`hZ6W3Kmi?lLag2Ng%|66cx#apT(i+doklp1B9084l{dxb?`f zdxo|7<Uy@8&aoKxkrBsU1=E6!6^8w@aO}<#0sjfap$1UiU32oFYH_zPcenj{k3iD2 z%e~Dd-ORG&e@ci)jtgJH?9FWk9W&yulzUM;e@duD2XDtLi_&|gZAH9D^iVpB4P=Kd zG0w8?U0%sSe?vKjf-89YN4Vy~o4<)B_4s(+QH4Z@4$bM)50)%lJyWMiYrz*U|E5bk zaB_@k^{^BvssYarI+xC7wku70ADWH;5hoWr-;?D3b+nVpRwkA9L~M_$NoDz(k|`jh z6-m_W_gt*Mx#MHQfY^<=U-(HaTiGbQ-E(ATb*lBk%jPF+5V#xKZPDsTNvGcTDCD6o z>)G1bB^%=UIdMQ7#eLQ;rn}Sj;;_@@ni>kX;9K3<vh@%sND4&g?Is|aNKZTd9Wy?o z30JE;x<&u0AQ)obxV(QWe{G@ScUx>;`*_`WT>HIzMnv5-A>VmtBl@N9+G(_KQyBMw zzNMm-h{i8}<(n9x#Zjo7Db3oB1Wqg@<E@pH$MDII!mnO&H>0*2g{69rT{_J3DlWsF zX%6otPS+mavX*fdbO+t`d{On+L1wNA-S0%CY1|sGVbBryvG-GMs+zJ`dWhAOoug4S zn2|H=JPqK0Yy-<pb}mN?^9gaW6a2bTAu9dNe}G!HfdxCS#nG)q+-Y&5^F8ghOa(;t zJ+Ephg7Hi|p_-niP%CajJQ*A#0|E00$mH{6P)_1s&%bsdI{iaW^CM%#cT<TaU>ogA zs~76$QZE%|+J3rE<hT00(lW3{?dU!K&-g_E=Jd^{{IEd&68cTvVm_WZ54MB}YG;DQ z@8sw0ilzy7Bn2;jZ`P6-A(duSVPkUb8rGsx6+!QkwyQs4)z4fmych}u4xeDNIMUH> z`kz~L4!$(PlP@~3|0#dKo!e5`A^!>6oC~CGv0djRR0)oe!xzu>XeXHFB#}idU2%`8 zadz1^h+Lc(_@h$d=kW;%Yt-=<;(ku~Y<u}%i%4v8_;#CDm_g!7jiRXrh33&z>9lJ{ z;d9M<mRIR)S}oAqfDlu$dT06Y!YNhrfLXCTzU1`#knNte_wj|!7W3wGK~GK-28WCZ z8(bI4oYd+jky7Dq-A%=nDxS3m-(9AKj;h`=8qv)yiPe{13wBr!deqinB6`me?8?DK z|20M4$;oV4R3y~(Pfqu%QvR27={N2*$U7@aTT2$e%0`%e^4SNssX#$0S0L_Va>N-G z7XiWf3j#x=6sUHIr-V;)?lhS-p=i&mu`6o?N<vJ;fec-h4$uip6@LmFgBvd&FNS;8 z*T!oUgv2_CrEDvPmYh;H8<%Y3rG{5YH*rwE+V+QN^?c?xQ%x_a<;aBB{94SqPa9{5 z?l2}u{9WTB&NHWPd0?+75WDsGJmVljmi4>&wn!=mL7VPh52fDore{<?;AWes>lmQ? z0cC+G<mE~kT{<V}WWw$O+mtEU{sX0T_-O%HC}YK8mAoEXQ-RK1K`X#VU2>DXpGuc) z{7W1k6s%e0ff)dypE(X|fD24IeC=NG`kHkiDe`F>@;wd-TeHNoS6ewp+DR?&oLh#J z;d`UrTA1StG#gfdF6fRu4%SI{7^ZI)8YWg-#<jHnW60gV$#NPkxLLr3FQ~t{V9-w5 zA{H-~c5X!{-kB#Ao-%BjN@14FXQBiT)G$m_7zy)*TrM9FuFst29@Zy7CgcY~clAUw zp5>pbUTVCxSauTN9{Xwkq?OOVs3mTqD+1D|@hum<R+r5?lddAiYfd>Kj?zI2Blgl3 z6~8Lfx{yp->Nm+t^c(cWyZ=qSX3XeV5r}6`e$#9%Pm2nYS+aR5a`xe<JMM*)E!h?J zdU*)_g6AMVC-0f0jzwV0{l{Bjh7lWj*G&@Gp*^rmso`VkiQ)Mn_Zcd1_GD3J<wS4@ zo-b+nU<{Gs8`)K(ZKU>3%fUHNs(t_79371Raqd_`nbvX+z<y=utG}%Cre(;upE6H# zM&CFx@JdL1lwkJy^YhF|ZVfDolTz^bd%x`m;v7AmGpys2d{23Poy_DJ+T+un0L%~s z-n7Soq_vxI2sDtB)hf(Rp^4{1S@K7#=3Ng*piJfnnOsJ=)HvniK+(${>OJ9k+|7Ow zGy6eldn}otgh>=oIwXIqrT=F#tA!N=diq*zb^ZR_@t|F+j`2IN`<9J6dH$=03GJo= z#i<-~sr(9BV8<!>%b~-Z+S2jfGkN+F@O!=~eL->?``=#zAO(gJ41#xp!j)&wk>6J` zLnHef;dwImgVi-2%g@NgHdTW<UJX_^Ws=$=k+~M?oEO7+nsfSm2C;U^!J~)~7=evK zpjQIqE>QdcX*=)^TAN=)-C(@AyIM88LL{R1ktJTH+vq4oDt8+ni+<2T3+n|?=Q3=7 zv=yd)cnx_CLRJ_SJ8v~L4odo)IKD3zIM{8Zs?Ay!GsAm;*b=Za_ngV+mVjUJsB1sx z`WBR|fUtZ0MRO1Qn+F~bxi}SzY{_0vio;dsYW4eiSfw?n*!rF4YOB?R%9jEm0y<%v zBBu2<p#W_g^pyA9xBeCJ&$xnYnXV45p>%B0j2btBJ;XUvy4I9_67qIZBaLY|@IY~p z+0#5(TDIa}5QR-=U;pOEB!@kt6u%vpC-qEr+@mUCtREE<_VJ|qXD<>?aT94Bs~>s~ zQ83}+i1G)yrnc|?iAR=+<fG5ReYw72X17HcmDlw8w|A;9P%XpbT$>$ZEEU#Ma+}{$ zuw0Tab{oT@fGeshe`<&PNCKAWKczDy2nnRTw$&1;fo-%MGF@5aQ(r3YGB*1Zo-Nm4 zf^r~-MA+-nzD17#%*ZVpLD05*rv%GD=)h|aFvfF6)xtjgh(?i_9=mI6CBy6weDCua zDB)g+Yq<^!`6khAj~UrkprG9#B5p|{!c<Z-EsD-So81Echkx4Ixtc&mj}cF$xr#Mh zj3rSHP`p5x;Gac%mRfh5|4QOY2MZUZJ`zr_s*SOzHWx7Iq0?rRb*L4sb=oPiliDSR zpULO(W$WhkuX`tqZR(4Dbokk52AZ(iP30*5l&rt`)hpv2r(I#w3EiJuj!6EO8>}f0 zmDRP1)<xCtz`rH_;!TSl*lS7?%0WS{$mw5?4+q?qyL8QLS*TL2STCR+d&LF!Dt1o6 zTl;QP%mqk|WwB?VWQYUbZ)%rqy*d%^=cv00SUK*7GuP~7t&~<bJmBIu?fUJ59>x7L z%kEHNY&h+&W#NP-BkPo6c($nf3g=@@Rrb)k+D^wcm)?unFVMS!!RmHZB6Ng_;0rL1 zT$R0gC0Ew%_qkHMONT(U&XO@IQ0{I_s}D$!5R)2kF>X+CtHqB_BSa?a8Q1pg2{ltA zTWi?g!;<~!i`nAaz5o&;*jhB#_)Vp2xObM{)$yon>iDNiDko^?Alq`jJL}UQ;NxI3 zC39S;sc(i4cK%1$nh^DfoXHoRb@JU5<#oNhLGyMhbc6=in~UAFRvqQrx1*)_pT*A` z>ce`?rgu}9ps&rUef)wc8K#>v4#6MmJcj4Pp^F9DH-1m<HjwRX$I{OAi&Y=;rFGE| zXviB?QzgZZ)Ws&g*-t4s2mQT~PmpPwgp-(oRv7s?Fg@h)Re#qR?qQ$TXy5CK>~y_J z?R+y_(QS;a>)rn&a`erlkkVJD;8n<okvC@A=^AABt=9?J(Px4~{7`;$#9w()Q05A) z(PoE`v(!Z<HEuwbJ;^9bxvaeZ3tsrsW^-fZdNr2QR`@74*x2v+EZ>St-7f3#i%^u} zArl+pphbtNA*#9OVl@Gx>9RkzGOUA*0SzJ@TtPo}#!d<@<UYmiN?#>}{_Bn6>in>Z zRn_(*!?fLpV^XjHXJMFu|3FV4(PBkK;&Q!+!9H}kdieq$JM6ha-Wk#|$E}RUWpRC! z#Yz*bwP#LYXbBKe>r^70|0C>SWFlg1olJR594c%2`S2m}jn`F`^`9182kUrx>k7HN zGkxC13k(`RLZ$Cu#v&aaJ`r`<=~7t5QRhd2oZUu`Y!o5S&Aa2VKKr78b|SbO;-hy} zubU4=fwp)vaGd^<uH!c3oEIIKyqnrIcdTAdcZyd}+LG=KCv8x!hvb3h(zr5@6Pq*l zjt|?c?o<vlIxhI-RUI<@8KymCO~~NI{B<tQ4D%{`($(f@z3qUDdat)Xkf3|vPaI?o zrLv<<@<s-k<D+-s%H=ut?rp5i`|ezRbrwtGl>E)m23Ve9TJ&h_G)DA2f&ONDaq7^Q zpp^Oh+zu0U8tw`?B3M@XHS}gtd!+kfbEj|RdZ#gP$B(wWSFRTr=_9@8Ev2!~cd2CC zdvrwCSRAj%2XBf%S*S2#-AL`v=7sU`FXjAOXxi(~crC#Ae906Oe-@t3JHk(WRa*w~ z&Jqyjlsx+_HyeK%^>d8y^!T+%r*RSTPpD^IM+z@$kgXcb9}Y?2A&>i>CtWoMyyb>M z`yRp8+%Vh+>s45=S2Os(o>Sk(wY=xDrm)-+4-cl7W~HmvBT@W(FkIRlFVR$on(ouI z+$C9{{SemSz4Xl1>6G_tjw!r@;a``6lZf+wHE8bnn1Zy^6st1!>%MqI+3qex@Rx_z z!f!P~`4%1Ipi8O;jw8=;N}CnBOa#x|r6}W2aH$SbGSRR;f|E$aEw#?Ps@nKZ{maN; z$Tv6Ur9pg4zA0uN`3a3C9<2qU{*b)0cBwP1Ed6+Hks$*kV8Ps{b{km3EkOrEQjJxN zj!H~c*paU&Y85&b&@-T5Amj%`%yC3^A`W+CUItU<HLbzMX;dsMUc+$7(5aO#j1oS5 znG;idiIY3fpf$20qOW^~0hNQY$1zAdKGOi#h)b^5SfggP4~zzK8^7?8jY9|JN(An$ z;u;MYh=^@qsa{jp=itm~#Phy;C+k892j%Tm^_k_Qf8wKMb<Kn2f8G&Y5Wd6C<AWjj zC#+2or@{WlHm_H;ewx!0UQ@t<{L@xfOF%!`C6vEGN`KZ{AzIJa5+r9jeZz@nV_BKR zv=i*R<(@xIvgW`ug*^JQG@pVFl7nKQQ@g#~VV(C2j+8o!m1(Os-6jZt{2*jF8uFx+ z49<UnruLP69VWnCfEEO~(x7VWY6|5*)3tfE@HiacBnyz=-X3a6Zv5>|K=!6?K_;W5 zItm+5t}`e}SrUtk<(Ri2p!3NWW8-s@BPJpcB1}k+>Yk6EbCsUM1m-wL0lLWAP3y>8 zfs+=V3ue}kxfCscFH>yqx?O1@jcy7fDCX6*EYLnAJ+Qg)bj0NC0GvcFjzrBX^eqM; zfoLqb&@;D}%%-zh|JZo}7dXeIl{XnFb)V;Yi{VZc1kq1=NfQd>x$w@xYU~g0qmt-W zhOE%*`LDmY(GfZ9F}--x#EFM7m#hGY^uY0p8eH1>w4G1PdVsQh9Kx8A{elUEI?o_t z{lIWRE%u1ZMQmf7z<;CRsJrX;oyrrza1kcG8@`6>%s(-*g$hvt354Wu+Q~m)!ggY> zzuv1>wgo`4B=BsxD&;nL-H3ew!%!s39OGE9NZ`2@n>hHAF%jmSl|R@3l}BsZfui?4 zX`xnj)1pX+#l?noC1XtNJ#xUvU`nD{n~Fw2h4pmD13G0l?(zWB_};-ysqyld*=%Jt z3Zzk{G(IQ*r}=45gZ-K=?b8`Mto6lF_%7Z@tE4cb7eaM*5C^RtH=DarT=Mf3x-VBD z3k+$DP_=5fn?T+2$gj8l*x+{0%D1I23?ASsukcHNM7~Q}4DR#I!`)l*eu{m!Cf*<V z`ZXE|`p1JZ?h{O6tm3LG=e+G8`|Oh>&+(KfY%H=^9*5G6(JP8#xvpy|WAobT52Y-$ z^vxH_*O)MQP79k)gcBp~BqA+}(>GqrDXM|((+jCLvW0e;#9hEcgrO^H4b#}ct4a$i zNLw9_5g-RWEUPGzkH%{=%lR=m!X}jd92;KMie%=&Y8$z<`@YJivVqc-=e)6_bQXMi z;N`e^o8j!g@g>iB0GP3T6nm-QGO(jfioog=mI^r&Y<Nf>S5JlL*UNvllfyDFDVmqf z<3l&*6hO_PKm{?v%%^-{1R~hLUz?3fyZkLL#%YQ`-sC!YgCddtL9*Kh6V-J5!`4qs z^G&5dF8+h4CTUL9FQf&$Es(dN<D-F2;jYpSB{14jxv}XS_WwiW5RfOjXGKTIPltR* z(0e*QtZ|&%pa6rar!L_H;3WKysJ9A_?Em<z7_rB<`~Qe`JZB_=)bTOT0NfxRaLuwf zUI2v1t#-F@ia>-x7ZvE9t0{&;zQ2qL1H{qW_c~#>6Jg-ML&$3>g-%PoS=Nd*_(K8k zBf;(bspMENV76~M3L6uU;z>5)(Ins<#<xI#U}@WfJ+vw!)=~lx<g}*a`e6vAj111i zjt`*P_pD`iT|a}LXI>7hQUj<<cXBa__=3Jq6!%K7mjHyo`J)v0PPgX!%3Ar;3sS&w z8EwcEHb&BN3zbwXx9DR~fw(7X5bGo7Nc~Qr@Glqw>yqq|yUBIER*f4(KwO(*tH$Ry zcF^OAI27~!g#g0PzB6$Q8A#}(CK^RPkphPKomBUcsGwta&%;Iph=Pzjzr4@}R+dYr z60k$ff2cr5=ONA|Dx)Mjo((E6!nJ=h&v?aad}TKjR8YPeEtsgr36}@GE(j2~hQ;u> zKr9v_sf7cuHoZUp(E-J4O!oKV(~FgTdSEw4$Q!G@=o-vF(wp~AL;OIz%bWh^VOd#2 zh5sL4ln=wle=;CYfuz|2xtc)k(b}mt9J!z|P2t^MWiL1?yV<!F*!elN!sVZ6u+Bq5 znn8{(5xj2Z(Uguu9>8<TZFwEn3OT-bsaazW8QJnO01s4zJfGroLks>ELZ$-^!3lf6 zSaxO@ZYK`eJSH{vjx<3X()hLfn>;=^?FCgo)%D>o8XGB0fc(|5&5c&K{e!~c4)(L0 zNC4o?7*~w4NgvN=AY+2H?<~knMXj8)%Aq#=n@e-B$Lxoi*falWMK9~?>SvRNJ|%hB zGeChQP%*qQpHV@_OG3b<5k#ImS}vUfN?AdW=`f{Ls&RkkL^%?F$h4?+zasfQJ`@2{ z_}8R(`^FqUO?qz{9dKn~oeXk#@R(coffLY@ra>zTNo_hp4;TN)u#OH84IGXg!vBPK zA5}`7<%bdgnf@fj*IL#QoTC**<c$K#*U#FV-g8edg$GjwQ(^=18;TsXOq1~HiuC&b z5(G4yzpZz2kY<aZf(NU@qNdRR5Djn02Ga`eG)c9t$N^qH766sufQDEssvJ=IC)lP} zt{hY~IgC4T5>SY7Vg-D`rf9Sk2&QQ?t4uw_U!g&@Vv(nR8exa-VIa(x`~Cvywi_=< zoeIOi5v+jy3;>N{@mkq=6;bWd7=MLgHY{z#U50VAD$#0qsTW-Baz{d}j)Ew7PN!zV zDhl0Att;CVj;hv*`=3ymF-h-z)*9Qnv*wj8Snf9&Ev5Y-Hh~nwPG*h6ZfFM8_93^t zuqZaqCt31}=Fi>VjCnEB0Mp)Wr^n^-VLlA>KBoZe>bWwTTd~fw#L9<8%k^FakmW?w zb@ci~f1d*j2msX%KKb*PEz@cp;Hy*jRaeHX8%!%S<?w&ZD`2|1E{o<GgeKQh7d5q; z15={iY^F|TC)ltE2)M>+3Pv+PZ3EJ}$F35ZrsEzJJ$z0W%DiywjK818SD<XscbQ*# zT1Wsc&}+Fn2WUM7yQ*d=Uls5%b^YtBDrR3P$cnLQmSnlv)CH&?c7-JW<%fN0y~6;# zcFV^aCWmenr??>kWX;Mt$q|5h;V5OZlI!5+*W+g-!QFssN^ic&_+vr>L!u8e!BG(M znq5H}O=kii;j5<*J8yRYMHd|V9NBySW{^w)XhevFf-b)sIfy_Mem9^Y<ejtIB4HKl zi(<3g&PwDIo4_RTDvdL=-hg_EzY9o~<=<||?ho-8{E(b89`)`vLN1u6o8p<kGF}lN z2{0zH8;uWNPyw;O$$4baW(~%~ruze;zr+OGc)#H|`oz+Y*!Z{V#TJ+lczd@nT99>p z=BBTZZT2k}j`F`aPf*bBhdVxn;dBVNA$g?OzW&R1ra6r$^A_oMm_cd(;adMJyKvLh zcOwQAG+6_geM;Q#<FPrwz^A%aJ(!U3zX1}vRp;Ek<<#Gwzm%-XB)D|xP2V^;;{z7- zt#VKo?1|ycE4PG4dbm>lO9BNI2jIe4-ss<E%Uhztg8hLcg`$lPGHE-sTZ_KHifJ)y z!tvvkSnVMuLVgL_3EG}4Fx4$&-ed5L2RM7aYLE~eg{Qy7E+nCh|2>@<7DeL(5coFQ zb{IC_JM0uEs=R1OMy|iHqLTN0ra~6VH=(wY8$0`#new(%<6Ap$#31*LGZ~94)cO5q zU2_AjMtE=VLgta%*G06%X08D+1}L`@UqMg_+TlT7CkN1i7n7J$x9NvVN!?$QJ*8{Q zSarh61E9zQAK7&jIH+%j%sU-U1-kSwRl{3DIQ`|EvH?^TOP}ua=cCBX>ZJKsH1f?? z8H4vv#Nj{x39I+(<#3nZ*yln1Ptj|yV92K`I|J#ekAA3lDB2%xBP(Z=i%@`{ijsz6 JwfvXB{{#6-^CtiR literal 0 HcmV?d00001 diff --git a/tests/phpunit/tests/image/editorImagick.php b/tests/phpunit/tests/image/editorImagick.php index cd424a8856cc5..eb71d9ff4715b 100644 --- a/tests/phpunit/tests/image/editorImagick.php +++ b/tests/phpunit/tests/image/editorImagick.php @@ -758,4 +758,57 @@ public function test_image_max_bit_depth() { public function __return_eight() { return 8; } + + /** + * Test that resizes are smaller for 16 bit PNG images. + * + * @ticket 36477 + * + * @dataProvider data_resizes_are_small_for_16bit_images + */ + public function test_resizes_are_small_for_16bit_images( $file ) { + + $temp_file = DIR_TESTDATA . '/images/test-temp.png'; + + $imagick_image_editor = new WP_Image_Editor_Imagick( $file ); + $imagick_image_editor->load(); + $size = $imagick_image_editor->get_size(); + + $org_filesize = filesize( $file ); + + $imagick_image_editor->resize( $size['width'] * .5, $size['height'] * .5 ); + + $saved = $imagick_image_editor->save( $temp_file ); + + $new_filesize = filesize( $temp_file ); + + unlink( $temp_file ); + + $this->assertLessThan( $org_filesize, $new_filesize, 'The resized image file size is not smaller than the original file size.' ); + } + + /** + * data_test_resizes_are_small_for_16bit + * + * @return array[] + */ + public static function data_resizes_are_small_for_16bit_images() { + return array( + 'cloudflare-status' => array( + DIR_TESTDATA . '/images/png-tests/cloudflare-status.png', + ), + 'deskcat8' => array( + DIR_TESTDATA . '/images/png-tests/deskcat8.png', + ), + '17-c3-duplicate-entries' => array( + DIR_TESTDATA . '/images/png-tests/Palette_icon-or8.png', + ), + 'rabbit-time-paletted' => array( + DIR_TESTDATA . '/images/png-tests/rabbit-time-paletted-or8.png', + ), + 'test8' => array( + DIR_TESTDATA . '/images/png-tests/test8.png', + ), + ); + } } From 09459f1e4b5eeb3604cfedfa12047ec03c7489b5 Mon Sep 17 00:00:00 2001 From: Adam Silverstein <adamsilverstein@git.wordpress.org> Date: Tue, 7 Jan 2025 22:51:51 +0000 Subject: [PATCH 169/323] Media: improve error messages for unsupported uploads. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Improve language explaining the reason for failure when uploading a modern image format like WebP or AVIF that the server doesn’t handle. Props adamsilverstein, Cybr. Fixes #61361. git-svn-id: https://develop.svn.wordpress.org/trunk@59590 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/script-loader.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/script-loader.php b/src/wp-includes/script-loader.php index 6a5768a8a4b9b..19813615bd80e 100644 --- a/src/wp-includes/script-loader.php +++ b/src/wp-includes/script-loader.php @@ -983,7 +983,7 @@ function wp_default_scripts( $scripts ) { /* translators: %s: File name. */ 'file_exceeds_size_limit' => __( '%s exceeds the maximum upload size for this site.' ), 'zero_byte_file' => __( 'This file is empty. Please try another.' ), - 'invalid_filetype' => __( 'Sorry, you are not allowed to upload this file type.' ), + 'invalid_filetype' => __( 'This file cannot be processed by the web server.' ), 'not_an_image' => __( 'This file is not an image. Please try another.' ), 'image_memory_exceeded' => __( 'Memory exceeded. Please try another smaller file.' ), 'image_dimensions_exceeded' => __( 'This is larger than the maximum size. Please try another.' ), @@ -1007,7 +1007,7 @@ function wp_default_scripts( $scripts ) { /* translators: %s: File name. */ 'error_uploading' => __( '&#8220;%s&#8221; has failed to upload.' ), 'unsupported_image' => __( 'This image cannot be displayed in a web browser. For best results convert it to JPEG before uploading.' ), - 'noneditable_image' => __( 'This image cannot be processed by the web server. Convert it to JPEG or PNG before uploading.' ), + 'noneditable_image' => __( 'The web server cannot generate responsive image sizes for this image. Convert it to JPEG or PNG before uploading.' ), 'file_url_copied' => __( 'The file URL has been copied to your clipboard' ), ); From d5f8c9b3e6546856a1af66ce2fb1527481afc251 Mon Sep 17 00:00:00 2001 From: Pascal Birchler <swissspidy@git.wordpress.org> Date: Wed, 8 Jan 2025 12:34:17 +0000 Subject: [PATCH 170/323] I18N: Update `theme.json` i18n schema with latest changes from Gutenberg. Makes shadow, duotone and aspect ratio names properly translatable. Props dalleyne, audrasjb, oandregal, swissspidy. Fixes #62728. git-svn-id: https://develop.svn.wordpress.org/trunk@59591 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/theme-i18n.json | 69 +++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 25 deletions(-) diff --git a/src/wp-includes/theme-i18n.json b/src/wp-includes/theme-i18n.json index 1781b9356f4bf..1b7a8d0d31190 100644 --- a/src/wp-includes/theme-i18n.json +++ b/src/wp-includes/theme-i18n.json @@ -3,33 +3,33 @@ "description": "Style variation description", "settings": { "typography": { - "fontSizes": [ - { - "name": "Font size name" - } - ], - "fontFamilies": [ - { - "name": "Font family name" - } - ] + "fontSizes": [ + { + "name": "Font size name" + } + ], + "fontFamilies": [ + { + "name": "Font family name" + } + ] }, "color": { - "palette": [ - { - "name": "Color name" - } - ], - "gradients": [ - { - "name": "Gradient name" - } - ], - "duotone": [ - { - "name": "Duotone name" - } - ] + "palette": [ + { + "name": "Color name" + } + ], + "gradients": [ + { + "name": "Gradient name" + } + ], + "duotone": [ + { + "name": "Duotone name" + } + ] }, "spacing": { "spacingSizes": [ @@ -45,6 +45,13 @@ } ] }, + "shadow": { + "presets": [ + { + "name": "Shadow name" + } + ] + }, "blocks": { "*": { "typography": { @@ -69,6 +76,18 @@ { "name": "Gradient name" } + ], + "duotone": [ + { + "name": "Duotone name" + } + ] + }, + "dimensions": { + "aspectRatios": [ + { + "name": "Aspect ratio name" + } ] }, "spacing": { From 287b2f8c961e8a67b2a232d37273b6ddfa611c28 Mon Sep 17 00:00:00 2001 From: Pascal Birchler <swissspidy@git.wordpress.org> Date: Wed, 8 Jan 2025 12:52:04 +0000 Subject: [PATCH 171/323] I18N: Mail: Make PHPMailer messages translatable. Adds a new `WP_PHPMailer` class to leverage the WordPress i18n system with PHPMailer, so that any user-visible error messages can be properly translated. Props sukhendu2002, swissspidy, audrasjb, iandunn, nacin, mark-k. Fixes #23311. git-svn-id: https://develop.svn.wordpress.org/trunk@59592 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-locale-switcher.php | 7 +- src/wp-includes/class-wp-phpmailer.php | 93 ++++++++++++++++++ src/wp-includes/pluggable.php | 3 +- tests/phpunit/data/languages/de_DE.l10n.php | 2 +- tests/phpunit/data/languages/de_DE.mo | Bin 863 -> 965 bytes tests/phpunit/data/languages/de_DE.po | 4 + tests/phpunit/includes/bootstrap.php | 9 +- tests/phpunit/includes/mock-mailer.php | 16 ++- .../tests/l10n/phpmailerTranslations.php | 66 +++++++++++++ 9 files changed, 192 insertions(+), 8 deletions(-) create mode 100644 src/wp-includes/class-wp-phpmailer.php create mode 100644 tests/phpunit/tests/l10n/phpmailerTranslations.php diff --git a/src/wp-includes/class-wp-locale-switcher.php b/src/wp-includes/class-wp-locale-switcher.php index 9f1c4831ed446..db4ae298c69c0 100644 --- a/src/wp-includes/class-wp-locale-switcher.php +++ b/src/wp-includes/class-wp-locale-switcher.php @@ -273,11 +273,12 @@ private function load_translations( $locale ) { * @since 4.7.0 * * @global WP_Locale $wp_locale WordPress date and time locale object. + * @global PHPMailer\PHPMailer\PHPMailer $phpmailer * * @param string $locale The locale to change to. */ private function change_locale( $locale ) { - global $wp_locale; + global $wp_locale, $phpmailer; $this->load_translations( $locale ); @@ -285,6 +286,10 @@ private function change_locale( $locale ) { WP_Translation_Controller::get_instance()->set_locale( $locale ); + if ( $phpmailer instanceof WP_PHPMailer ) { + $phpmailer->SetLanguage(); + } + /** * Fires when the locale is switched to or restored. * diff --git a/src/wp-includes/class-wp-phpmailer.php b/src/wp-includes/class-wp-phpmailer.php new file mode 100644 index 0000000000000..b3c976d13d9a6 --- /dev/null +++ b/src/wp-includes/class-wp-phpmailer.php @@ -0,0 +1,93 @@ +<?php +/** + * WordPress PHPMailer class. + * + * @package WordPress + * @since 6.8.0 + */ + +/** + * WordPress PHPMailer class. + * + * Overrides the internationalization method in order to use WordPress' instead. + * + * @since 6.8.0 + */ +class WP_PHPMailer extends PHPMailer\PHPMailer\PHPMailer { + + /** + * Constructor. + * + * @since 6.8.0 + * + * @param bool $exceptions Optional. Whether to throw exceptions for errors. Default false. + */ + public function __construct( $exceptions = false ) { + parent::__construct( $exceptions ); + $this->SetLanguage(); + } + + /** + * Defines the error messages using WordPress' internationalization method. + * + * @since 6.8.0 + * + * @return true Always returns true. + */ + public function SetLanguage( $langcode = 'en', $lang_path = '' ) { + $error_strings = array( + 'authenticate' => __( 'SMTP Error: Could not authenticate.' ), + 'buggy_php' => sprintf( + /* translators: 1: mail.add_x_header. 2: php.ini */ + __( + 'Your version of PHP is affected by a bug that may result in corrupted messages. To fix it, switch to sending using SMTP, disable the %1$s option in your %2$s, or switch to MacOS or Linux, or upgrade your PHP version.' + ), + 'mail.add_x_header', + 'php.ini' + ), + 'connect_host' => __( 'SMTP Error: Could not connect to SMTP host.' ), + 'data_not_accepted' => __( 'SMTP Error: data not accepted.' ), + 'empty_message' => __( 'Message body empty' ), + /* translators: There is a space after the colon. */ + 'encoding' => __( 'Unknown encoding: ' ), + /* translators: There is a space after the colon. */ + 'execute' => __( 'Could not execute: ' ), + /* translators: There is a space after the colon. */ + 'extension_missing' => __( 'Extension missing: ' ), + /* translators: There is a space after the colon. */ + 'file_access' => __( 'Could not access file: ' ), + /* translators: There is a space after the colon. */ + 'file_open' => __( 'File Error: Could not open file: ' ), + /* translators: There is a space after the colon. */ + 'from_failed' => __( 'The following From address failed: ' ), + 'instantiate' => __( 'Could not instantiate mail function.' ), + /* translators: There is a space after the colon. */ + 'invalid_address' => __( 'Invalid address: ' ), + 'invalid_header' => __( 'Invalid header name or value' ), + /* translators: There is a space after the colon. */ + 'invalid_hostentry' => __( 'Invalid hostentry: ' ), + /* translators: There is a space after the colon. */ + 'invalid_host' => __( 'Invalid host: ' ), + /* translators: There is a space at the beginning. */ + 'mailer_not_supported' => __( ' mailer is not supported.' ), + 'provide_address' => __( 'You must provide at least one recipient email address.' ), + /* translators: There is a space after the colon. */ + 'recipients_failed' => __( 'SMTP Error: The following recipients failed: ' ), + /* translators: There is a space after the colon. */ + 'signing' => __( 'Signing Error: ' ), + /* translators: There is a space after the colon. */ + 'smtp_code' => __( 'SMTP code: ' ), + /* translators: There is a space after the colon. */ + 'smtp_code_ex' => __( 'Additional SMTP info: ' ), + 'smtp_connect_failed' => __( 'SMTP connect() failed.' ), + /* translators: There is a space after the colon. */ + 'smtp_detail' => __( 'Detail: ' ), + /* translators: There is a space after the colon. */ + 'smtp_error' => __( 'SMTP server error: ' ), + /* translators: There is a space after the colon. */ + 'variable_set' => __( 'Cannot set or reset variable: ' ), + ); + $this->language = $error_strings; + return true; + } +} diff --git a/src/wp-includes/pluggable.php b/src/wp-includes/pluggable.php index d0b2d3602a980..42a63fa63ddf7 100644 --- a/src/wp-includes/pluggable.php +++ b/src/wp-includes/pluggable.php @@ -251,7 +251,8 @@ function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() require_once ABSPATH . WPINC . '/PHPMailer/PHPMailer.php'; require_once ABSPATH . WPINC . '/PHPMailer/SMTP.php'; require_once ABSPATH . WPINC . '/PHPMailer/Exception.php'; - $phpmailer = new PHPMailer\PHPMailer\PHPMailer( true ); + require_once ABSPATH . WPINC . '/class-wp-phpmailer.php'; + $phpmailer = new WP_PHPMailer( true ); $phpmailer::$validator = static function ( $email ) { return (bool) is_email( $email ); diff --git a/tests/phpunit/data/languages/de_DE.l10n.php b/tests/phpunit/data/languages/de_DE.l10n.php index 8eef01d79ce00..9190d3641ca68 100644 --- a/tests/phpunit/data/languages/de_DE.l10n.php +++ b/tests/phpunit/data/languages/de_DE.l10n.php @@ -1,2 +1,2 @@ <?php -return ['domain'=>NULL,'plural-forms'=>'nplurals=2; plural=n != 1;','messages'=>['html_lang_attribute'=>'de-DE','text directionltr'=>'ltr','number_format_decimal_point'=>',','number_format_thousands_sep'=>'.','Update %s now'=>'Jetzt %s aktualisieren','[%1$s] Confirm Action: %2$s'=>'[%1$s] Aktion bestätigen: %2$s','[%s] Erasure Request Fulfilled'=>'[%s] Löschauftrag ausgeführt','[%s] Personal Data Export'=>'[%s] Export personenbezogener Daten'],'language'=>'de_DE','x-generator'=>'Poedit 2.2.1']; \ No newline at end of file +return ['domain'=>NULL,'plural-forms'=>'nplurals=2; plural=n != 1;','messages'=>['html_lang_attribute'=>'de-DE','text directionltr'=>'ltr','number_format_decimal_point'=>',','number_format_thousands_sep'=>'.','Update %s now'=>'Jetzt %s aktualisieren','[%1$s] Confirm Action: %2$s'=>'[%1$s] Aktion bestätigen: %2$s','[%s] Erasure Request Fulfilled'=>'[%s] Löschauftrag ausgeführt','[%s] Personal Data Export'=>'[%s] Export personenbezogener Daten', 'You must provide at least one recipient email address.'=>'Du musst mindestens eine Empfänger-E-Mail-Adresse angeben.'],'language'=>'de_DE','x-generator'=>'Poedit 2.2.1']; diff --git a/tests/phpunit/data/languages/de_DE.mo b/tests/phpunit/data/languages/de_DE.mo index dcfef58f489228b3208aef0fbc17704d06c6fe8c..8254de97f2af35c7f3e97a518dce585162dcb2f3 100644 GIT binary patch delta 416 zcmXZWze>YE90%}A>K_n9XhjsI9%#`e9UT-0C0&YLv?Aglr}-I<CYO-AD7bWVmcs{- z`T{O>v51IM-$9>1pTTcxk9_mF`-LRm@2St}?pJx@fnm)cD@arvuwMTeIg9-O*+PcM zGU7UnRbdq_!ChE^C$M<l8G8rIIQL)^=_3m`J0-?;80)e{Y*sO7!{UPmu0abY;S0n& zY%ul>;$rW`?KlmDAzss5B{%Fe$$6Y>!_zFemH}~Lctiq&L=n&EQl^rW;S>uQaS;R= zm9(zk|MsnPH|7s1O)}%PbSMLFKM%FnPVBQ=vqR_1KDrg#b2jG=gbH&J(l!t1+;7-* z*FR!SGPkB^Avz`(k<^khQp_LK!S7?K0@8+*<|I+25vNxlPb#F$Yj`b`@%GR~Yc$62 Kf>ho9xY-}a9${<% delta 295 zcmX@gexI%Wo)F7a1|Z-BVi_P#0b*VtUIWA+@BoNG{D(j+4aDz(SPqD}85tNPfwUHo z76#HTKpG?;0i{cTv=ER#0Z1DI@nRqr1M;skF)+vj>32XHXih!@A2S1kGEhJlNV5Xz zKp+iN%McEwBY`v!F+@Z8KqlC+AhjUC2E;(K7&t&2AYg$|U_I<0c4$FLVo9okYOz9I ze)(iZ#%+_^nA9hWGeu9{$K*758>0rlPhwtrX<~Y+l|o8tyo>AP0w&SPUm2AqF-uGi HVJ-v!bHXIt diff --git a/tests/phpunit/data/languages/de_DE.po b/tests/phpunit/data/languages/de_DE.po index aa97af62e9a0f..b68c53867d8bc 100644 --- a/tests/phpunit/data/languages/de_DE.po +++ b/tests/phpunit/data/languages/de_DE.po @@ -57,3 +57,7 @@ msgstr "[%s] Löschauftrag ausgeführt" #: wp-admin/includes/file.php:2415 msgid "[%s] Personal Data Export" msgstr "[%s] Export personenbezogener Daten" + +#: wp-includes/class-wp-phpmailer.php:71 +msgid "You must provide at least one recipient email address." +msgstr "Du musst mindestens eine Empfänger-E-Mail-Adresse angeben." diff --git a/tests/phpunit/includes/bootstrap.php b/tests/phpunit/includes/bootstrap.php index 5ee8f38b5753f..c28ddb6eb07b2 100644 --- a/tests/phpunit/includes/bootstrap.php +++ b/tests/phpunit/includes/bootstrap.php @@ -246,10 +246,6 @@ $multisite = $multisite || ( defined( 'WP_TESTS_MULTISITE' ) && WP_TESTS_MULTISITE ); $multisite = $multisite || ( defined( 'MULTISITE' ) && MULTISITE ); -// Override the PHPMailer. -require_once __DIR__ . '/mock-mailer.php'; -$phpmailer = new MockPHPMailer( true ); - if ( ! defined( 'WP_DEFAULT_THEME' ) ) { define( 'WP_DEFAULT_THEME', 'default' ); } @@ -305,6 +301,11 @@ function wp_tests_options( $value ) { // Load WordPress. require_once ABSPATH . 'wp-settings.php'; +// Override the PHPMailer. +require_once __DIR__ . '/mock-mailer.php'; + +$phpmailer = new MockPHPMailer( true ); + // Delete any default posts & related data. _delete_all_posts(); diff --git a/tests/phpunit/includes/mock-mailer.php b/tests/phpunit/includes/mock-mailer.php index f5172d62a6c59..aedeba4e40cd0 100644 --- a/tests/phpunit/includes/mock-mailer.php +++ b/tests/phpunit/includes/mock-mailer.php @@ -1,8 +1,22 @@ <?php +/** + * Mock PHPMailer class for testing. + * + * @package WordPress + * @subpackage UnitTests + * @since 4.5.0 + */ + require_once ABSPATH . 'wp-includes/PHPMailer/PHPMailer.php'; require_once ABSPATH . 'wp-includes/PHPMailer/Exception.php'; +require_once ABSPATH . 'wp-includes/class-wp-phpmailer.php'; -class MockPHPMailer extends PHPMailer\PHPMailer\PHPMailer { +/** + * Test class extending WP_PHPMailer. + * + * @since 4.5.0 + */ +class MockPHPMailer extends WP_PHPMailer { public $mock_sent = array(); public function preSend() { diff --git a/tests/phpunit/tests/l10n/phpmailerTranslations.php b/tests/phpunit/tests/l10n/phpmailerTranslations.php new file mode 100644 index 0000000000000..15e8dcd9dac04 --- /dev/null +++ b/tests/phpunit/tests/l10n/phpmailerTranslations.php @@ -0,0 +1,66 @@ +<?php +/** + * Unit tests covering PHPMailer translations. + * + * @package WordPress + * @subpackage PHPMailer + * @since 6.8.0 + */ + +/** + * Class Test_PHPMailer_Translations. + * + * Provides tests for PHPMailer translations. + * + * @group mail + * @group i18n + * @group l10n + * + * @since 6.8.0 + */ +class Test_PHPMailer_Translations extends WP_UnitTestCase { + /** + * Tests that PHPMailer error message translation works as expected. + * + * @ticket 23311 + */ + public function test_missing_recipient_error_message_should_be_translated() { + reset_phpmailer_instance(); + + $is_switched = switch_to_locale( 'de_DE' ); + + $phpmailer = tests_retrieve_phpmailer_instance(); + $phpmailer->setFrom( 'invalid-email@example.com' ); + + try { + $phpmailer->send(); + $this->fail( 'Expected exception was not thrown' ); + } catch ( PHPMailer\PHPMailer\Exception $e ) { + $error_message = $e->getMessage(); + } finally { + if ( $is_switched ) { + restore_previous_locale(); + } + } + + $this->assertSame( + 'Du musst mindestens eine Empfänger-E-Mail-Adresse angeben.', + $error_message, + 'Error message is not translated as expected' + ); + } + + /** + * Test that PHPMailer error message keys are consistent across implementations. + * + * @ticket 23311 + */ + public function test_all_error_message_keys_should_be_translated() { + reset_phpmailer_instance(); + + $phpmailer = new PHPMailer\PHPMailer\PHPMailer(); + $wp_phpmailer = tests_retrieve_phpmailer_instance(); + + $this->assertEqualSets( array_keys( $phpmailer->GetTranslations() ), array_keys( $wp_phpmailer->GetTranslations() ) ); + } +} From 86f31c81668c0a680b6db275b41298f7e8513389 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Wed, 8 Jan 2025 17:46:54 +0000 Subject: [PATCH 172/323] Coding Standards: Use strict comparison in `wp_check_for_changed_dates()`. Follow-up to [42401]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59593 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index 6d225470d2b4e..a0933f1ffdbf8 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -7255,12 +7255,14 @@ function wp_check_for_changed_dates( $post_id, $post, $post_before ) { $new_date = gmdate( 'Y-m-d', strtotime( $post->post_date ) ); // Don't bother if it hasn't changed. - if ( $new_date == $previous_date ) { + if ( $new_date === $previous_date ) { return; } // We're only concerned with published, non-hierarchical objects. - if ( ! ( 'publish' === $post->post_status || ( 'attachment' === get_post_type( $post ) && 'inherit' === $post->post_status ) ) || is_post_type_hierarchical( $post->post_type ) ) { + if ( ! ( 'publish' === $post->post_status || ( 'attachment' === $post->post_type && 'inherit' === $post->post_status ) ) + || is_post_type_hierarchical( $post->post_type ) + ) { return; } From c53397d1f852fd1f53d8ae9defc5907283a9e198 Mon Sep 17 00:00:00 2001 From: Carolina Nymark <poena@git.wordpress.org> Date: Thu, 9 Jan 2025 09:21:33 +0000 Subject: [PATCH 173/323] Twenty Twenty: Correct the font weight of the quote block in the editor. This change removes the font weight of the paragraph inside the quote block, so that the design in the editor and the front looks the same. Props sainathpoojary, ankitkumarshah, sabernhardt, krupajnanda. Fixes #62753. git-svn-id: https://develop.svn.wordpress.org/trunk@59594 602fd350-edb4-49c9-b593-d223f7449a82 --- .../themes/twentytwenty/assets/css/editor-style-block-rtl.css | 1 - .../themes/twentytwenty/assets/css/editor-style-block.css | 1 - 2 files changed, 2 deletions(-) diff --git a/src/wp-content/themes/twentytwenty/assets/css/editor-style-block-rtl.css b/src/wp-content/themes/twentytwenty/assets/css/editor-style-block-rtl.css index 8a5f813502b72..141b9d9f86a4c 100644 --- a/src/wp-content/themes/twentytwenty/assets/css/editor-style-block-rtl.css +++ b/src/wp-content/themes/twentytwenty/assets/css/editor-style-block-rtl.css @@ -682,7 +682,6 @@ hr.wp-block-separator.is-style-dots::before { .editor-styles-wrapper .wp-block-quote p { color: inherit; - font-weight: 400; margin: 0 0 20px 0; letter-spacing: inherit; } diff --git a/src/wp-content/themes/twentytwenty/assets/css/editor-style-block.css b/src/wp-content/themes/twentytwenty/assets/css/editor-style-block.css index 7f18f4772441e..862a51cc2b8e1 100644 --- a/src/wp-content/themes/twentytwenty/assets/css/editor-style-block.css +++ b/src/wp-content/themes/twentytwenty/assets/css/editor-style-block.css @@ -686,7 +686,6 @@ hr.wp-block-separator.is-style-dots::before { .editor-styles-wrapper .wp-block-quote p { color: inherit; - font-weight: 400; margin: 0 0 20px 0; letter-spacing: inherit; } From a48e1806f767c550cbb8b66d672507f589a7be9a Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Thu, 9 Jan 2025 19:41:47 +0000 Subject: [PATCH 174/323] Login and Registration: Check that the `$_POST` values are strings in `wp_signon()`. This prevents a fatal error from `trim()` via `wp_authenticate()` if an array is passed instead. Follow-up to [6643], [58093]. Props leedxw, audrasjb, SergeyBiryukov. Fixes #62794. git-svn-id: https://develop.svn.wordpress.org/trunk@59595 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/user.php | 4 ++-- tests/phpunit/tests/auth.php | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/user.php b/src/wp-includes/user.php index f60dbe5d3fae2..6222e932a9015 100644 --- a/src/wp-includes/user.php +++ b/src/wp-includes/user.php @@ -48,10 +48,10 @@ function wp_signon( $credentials = array(), $secure_cookie = '' ) { 'remember' => false, ); - if ( ! empty( $_POST['log'] ) ) { + if ( ! empty( $_POST['log'] ) && is_string( $_POST['log'] ) ) { $credentials['user_login'] = wp_unslash( $_POST['log'] ); } - if ( ! empty( $_POST['pwd'] ) ) { + if ( ! empty( $_POST['pwd'] ) && is_string( $_POST['pwd'] ) ) { $credentials['user_password'] = $_POST['pwd']; } if ( ! empty( $_POST['rememberme'] ) ) { diff --git a/tests/phpunit/tests/auth.php b/tests/phpunit/tests/auth.php index 5c196b499fcce..f45071904e9c8 100644 --- a/tests/phpunit/tests/auth.php +++ b/tests/phpunit/tests/auth.php @@ -634,6 +634,28 @@ public function test_wp_signon_does_not_throw_deprecation_notices_with_default_p $this->assertContains( 'empty_password', $error_codes, 'The "empty_password" error code should be present.' ); } + /** + * Tests that a warning or a fatal error is not thrown when the login or password + * passed via `$_POST` is an array instead of a string. + * + * The messages that we should not see: + * `Warning: wp_strip_all_tags() expects parameter #1 ($text) to be a string, array given`. + * `TypeError: trim(): Argument #1 ($string) must be of type string, array given`. + * + * @ticket 62794 + */ + public function test_wp_signon_does_not_throw_fatal_errors_with_array_parameters() { + $_POST['log'] = array( 'example' ); + $_POST['pwd'] = array( 'example' ); + + $error = wp_signon(); + $this->assertWPError( $error, 'The result should be an instance of WP_Error.' ); + + $error_codes = $error->get_error_codes(); + $this->assertContains( 'empty_username', $error_codes, 'The "empty_username" error code should be present.' ); + $this->assertContains( 'empty_password', $error_codes, 'The "empty_password" error code should be present.' ); + } + /** * HTTP Auth headers are used to determine the current user. * From 1dd2f28680c98373468adb53aff18df00586c559 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Fri, 10 Jan 2025 18:12:08 +0000 Subject: [PATCH 175/323] Coding Standards: Use strict comparison in `get_posts_by_author_sql()`. Follow-up to [13576], [25669]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59596 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index a0933f1ffdbf8..ebf7c7f3a9e40 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -7358,7 +7358,7 @@ function get_posts_by_author_sql( $post_type, $full = true, $post_author = null, $id = get_current_user_id(); if ( null === $post_author || ! $full ) { $post_status_sql .= " OR post_status = 'private' AND post_author = $id"; - } elseif ( $id == (int) $post_author ) { + } elseif ( $id === (int) $post_author ) { $post_status_sql .= " OR post_status = 'private'"; } // Else none. } // Else none. From 4051e31bec3a61ac6293387580cae7e655d26a52 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sat, 11 Jan 2025 00:35:45 +0000 Subject: [PATCH 176/323] Coding Standards: Use strict comparison in `wp_check_post_hierarchy_for_loops()`. Follow-up to [10129], [15806]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59597 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index ebf7c7f3a9e40..74cedc40e1766 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -7934,7 +7934,7 @@ function wp_check_post_hierarchy_for_loops( $post_parent, $post_id ) { } // Can't be its own parent. - if ( $post_parent == $post_id ) { + if ( $post_parent === $post_id ) { return 0; } From c0d073d62d32d424d9149619a7fcae48ddb82c26 Mon Sep 17 00:00:00 2001 From: Pascal Birchler <swissspidy@git.wordpress.org> Date: Sat, 11 Jan 2025 13:42:46 +0000 Subject: [PATCH 177/323] Embeds: Add Canva to oEmbed provider allowlist. Props swissspidy. Fixes #58840. git-svn-id: https://develop.svn.wordpress.org/trunk@59598 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-oembed.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/wp-includes/class-wp-oembed.php b/src/wp-includes/class-wp-oembed.php index 5b699e9362c64..2d59c2217dc3e 100644 --- a/src/wp-includes/class-wp-oembed.php +++ b/src/wp-includes/class-wp-oembed.php @@ -110,6 +110,7 @@ public function __construct() { '#https?://pca\.st/.+#i' => array( 'https://pca.st/oembed.json', true ), '#https?://((play|www)\.)?anghami\.com/.*#i' => array( 'https://api.anghami.com/rest/v1/oembed.view', true ), '#https?://bsky.app/profile/.*/post/.*#i' => array( 'https://embed.bsky.app/oembed', true ), + '#https?://(www\.)?canva\.com/design/.*/view.*#i' => array( 'https://canva.com/_oembed', true ), ); if ( ! empty( self::$early_providers['add'] ) ) { @@ -190,6 +191,7 @@ public function __construct() { * | Crowdsignal | crowdsignal.net | 6.2.0 | * | Anghami | anghami.com | 6.3.0 | * | Bluesky | bsky.app | 6.6.0 | + * | Canva | canva.com | 6.8.0 | * * No longer supported providers: * From 88796678fd838ab0e790d22558f258c906262400 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sun, 12 Jan 2025 18:12:14 +0000 Subject: [PATCH 178/323] Coding Standards: Use strict comparison in `get_page_by_path()`. Follow-up to [3511], [18541], [19075], [21845]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59599 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index 74cedc40e1766..8cb7287289b41 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -6061,9 +6061,9 @@ function get_page_by_path( $page_path, $output = OBJECT, $post_type = 'page' ) { $revparts = array_reverse( $parts ); - $foundid = 0; + $found_id = 0; foreach ( (array) $pages as $page ) { - if ( $page->post_name == $revparts[0] ) { + if ( $page->post_name === $revparts[0] ) { $count = 0; $p = $page; @@ -6071,18 +6071,21 @@ function get_page_by_path( $page_path, $output = OBJECT, $post_type = 'page' ) { * Loop through the given path parts from right to left, * ensuring each matches the post ancestry. */ - while ( 0 != $p->post_parent && isset( $pages[ $p->post_parent ] ) ) { + while ( 0 !== (int) $p->post_parent && isset( $pages[ $p->post_parent ] ) ) { ++$count; $parent = $pages[ $p->post_parent ]; - if ( ! isset( $revparts[ $count ] ) || $parent->post_name != $revparts[ $count ] ) { + if ( ! isset( $revparts[ $count ] ) || $parent->post_name !== $revparts[ $count ] ) { break; } $p = $parent; } - if ( 0 == $p->post_parent && count( $revparts ) === $count + 1 && $p->post_name == $revparts[ $count ] ) { - $foundid = $page->ID; - if ( $page->post_type == $post_type ) { + if ( 0 === (int) $p->post_parent + && count( $revparts ) === $count + 1 + && $p->post_name === $revparts[ $count ] + ) { + $found_id = $page->ID; + if ( $page->post_type === $post_type ) { break; } } @@ -6090,10 +6093,10 @@ function get_page_by_path( $page_path, $output = OBJECT, $post_type = 'page' ) { } // We cache misses as well as hits. - wp_cache_set( $cache_key, $foundid, 'post-queries' ); + wp_cache_set( $cache_key, $found_id, 'post-queries' ); - if ( $foundid ) { - return get_post( $foundid, $output ); + if ( $found_id ) { + return get_post( $found_id, $output ); } return null; From 062df4cd8825c3a44de4c05fe612bf3172ede84b Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Mon, 13 Jan 2025 14:55:09 +0000 Subject: [PATCH 179/323] Coding Standards: Add missing space for self-closing tags. Props laxman-prajapati, sabernhardt. Fixes #62799. git-svn-id: https://develop.svn.wordpress.org/trunk@59600 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/network/settings.php | 2 +- src/wp-admin/options-discussion.php | 2 +- src/wp-admin/options-media.php | 2 +- src/wp-admin/setup-config.php | 2 +- src/wp-includes/widgets.php | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/wp-admin/network/settings.php b/src/wp-admin/network/settings.php index c93d98a169849..82543f6219f85 100644 --- a/src/wp-admin/network/settings.php +++ b/src/wp-admin/network/settings.php @@ -405,7 +405,7 @@ <tr> <th scope="row"><?php _e( 'Site upload space' ); ?></th> <td> - <label><input type="checkbox" id="upload_space_check_disabled" name="upload_space_check_disabled" value="0"<?php checked( (bool) get_site_option( 'upload_space_check_disabled' ), false ); ?>/> + <label><input type="checkbox" id="upload_space_check_disabled" name="upload_space_check_disabled" value="0"<?php checked( (bool) get_site_option( 'upload_space_check_disabled' ), false ); ?> /> <?php printf( /* translators: %s: Number of megabytes to limit uploads to. */ diff --git a/src/wp-admin/options-discussion.php b/src/wp-admin/options-discussion.php index d9e084d14383b..6bb8ce2f54acc 100644 --- a/src/wp-admin/options-discussion.php +++ b/src/wp-admin/options-discussion.php @@ -90,7 +90,7 @@ <ul> <li> <label for="close_comments_days_old"><?php _e( 'Close comments when post is how many days old' ); ?></label> - <input name="close_comments_days_old" type="number" step="1" min="0" id="close_comments_days_old" value="<?php echo esc_attr( get_option( 'close_comments_days_old' ) ); ?>" class="small-text"/> + <input name="close_comments_days_old" type="number" step="1" min="0" id="close_comments_days_old" value="<?php echo esc_attr( get_option( 'close_comments_days_old' ) ); ?>" class="small-text" /> </li> </ul> diff --git a/src/wp-admin/options-media.php b/src/wp-admin/options-media.php index ce814c9d3891e..b2eb47c4f402a 100644 --- a/src/wp-admin/options-media.php +++ b/src/wp-admin/options-media.php @@ -70,7 +70,7 @@ <label for="thumbnail_size_h"><?php _e( 'Height' ); ?></label> <input name="thumbnail_size_h" type="number" step="1" min="0" id="thumbnail_size_h" value="<?php form_option( 'thumbnail_size_h' ); ?>" class="small-text" /> </fieldset> -<input name="thumbnail_crop" type="checkbox" id="thumbnail_crop" value="1" <?php checked( '1', get_option( 'thumbnail_crop' ) ); ?>/> +<input name="thumbnail_crop" type="checkbox" id="thumbnail_crop" value="1"<?php checked( '1', get_option( 'thumbnail_crop' ) ); ?> /> <label for="thumbnail_crop"><?php _e( 'Crop thumbnail to exact dimensions (normally thumbnails are proportional)' ); ?></label> </td> </tr> diff --git a/src/wp-admin/setup-config.php b/src/wp-admin/setup-config.php index 2d1ff715d3d23..d2fa4ae8ea7ee 100644 --- a/src/wp-admin/setup-config.php +++ b/src/wp-admin/setup-config.php @@ -227,7 +227,7 @@ function setup_config_display_header( $body_classes = array() ) { <table class="form-table" role="presentation"> <tr> <th scope="row"><label for="dbname"><?php _e( 'Database Name' ); ?></label></th> - <td><input name="dbname" id="dbname" type="text" aria-describedby="dbname-desc" size="25" placeholder="wordpress"<?php echo $autofocus; ?>/> + <td><input name="dbname" id="dbname" type="text" aria-describedby="dbname-desc" size="25" placeholder="wordpress"<?php echo $autofocus; ?> /> <p id="dbname-desc"><?php _e( 'The name of the database you want to use with WordPress.' ); ?></p></td> </tr> <tr> diff --git a/src/wp-includes/widgets.php b/src/wp-includes/widgets.php index 32d8a95e1b984..aa17656507a4f 100644 --- a/src/wp-includes/widgets.php +++ b/src/wp-includes/widgets.php @@ -1746,7 +1746,7 @@ function wp_widget_rss_form( $args, $inputs = null ) { <input id="rss-show-author-<?php echo $esc_number; ?>" name="widget-rss[<?php echo $esc_number; ?>][show_author]" type="checkbox" value="1" <?php checked( $args['show_author'] ); ?> /> <label for="rss-show-author-<?php echo $esc_number; ?>"><?php _e( 'Display item author if available?' ); ?></label><br /> <?php endif; if ( $inputs['show_date'] ) : ?> - <input id="rss-show-date-<?php echo $esc_number; ?>" name="widget-rss[<?php echo $esc_number; ?>][show_date]" type="checkbox" value="1" <?php checked( $args['show_date'] ); ?>/> + <input id="rss-show-date-<?php echo $esc_number; ?>" name="widget-rss[<?php echo $esc_number; ?>][show_date]" type="checkbox" value="1" <?php checked( $args['show_date'] ); ?> /> <label for="rss-show-date-<?php echo $esc_number; ?>"><?php _e( 'Display item date?' ); ?></label><br /> <?php endif; ?> </p> From 9d9d73cd9e5d243e4841fe9567ef388e3fb65932 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Mon, 13 Jan 2025 22:20:03 +0000 Subject: [PATCH 180/323] Docs: Correct `@return` value for `update_attached_file()`. Follow-up to [4612], [21967], [24490], [47611], [48214]. Props arnoutblueshell, karthickmurugan, SergeyBiryukov. Fixes #62803. git-svn-id: https://develop.svn.wordpress.org/trunk@59602 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index 8cb7287289b41..98b9092f16f1f 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -852,13 +852,15 @@ function get_attached_file( $attachment_id, $unfiltered = false ) { * Updates attachment file path based on attachment ID. * * Used to update the file path of the attachment, which uses post meta name - * '_wp_attached_file' to store the path of the attachment. + * `_wp_attached_file` to store the path of the attachment. * * @since 2.1.0 * * @param int $attachment_id Attachment ID. * @param string $file File path for the attachment. - * @return bool True on success, false on failure. + * @return int|bool Meta ID if the `_wp_attached_file` key didn't exist for the attachment. + * True on successful update, false on failure or if the `$file` value passed + * to the function is the same as the one that is already in the database. */ function update_attached_file( $attachment_id, $file ) { if ( ! get_post( $attachment_id ) ) { From 47774776112815b1b997a68fc51cf3dabd3f44c2 Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Tue, 14 Jan 2025 11:37:00 +0000 Subject: [PATCH 181/323] Docs: Correct a translator comment that was added in [59578]. See #62005 git-svn-id: https://develop.svn.wordpress.org/trunk@59603 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/pluggable.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/pluggable.php b/src/wp-includes/pluggable.php index 42a63fa63ddf7..f4a8d8412e88c 100644 --- a/src/wp-includes/pluggable.php +++ b/src/wp-includes/pluggable.php @@ -2605,7 +2605,7 @@ function wp_hash( $data, $scheme = 'auth', $algo = 'md5' ) { if ( ! in_array( $algo, hash_hmac_algos(), true ) ) { throw new InvalidArgumentException( sprintf( - /** translators: 1: Name of a cryptographic hash algorithm. 2: List of supported algorithms. */ + /* translators: 1: Name of a cryptographic hash algorithm. 2: List of supported algorithms. */ __( 'Unsupported hashing algorithm: %1$s. Supported algorithms are: %2$s' ), $algo, implode( ', ', hash_hmac_algos() ) From 83718be6851597c68ba085b120c892616443698d Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Tue, 14 Jan 2025 15:35:18 +0000 Subject: [PATCH 182/323] Tests: Restore the environment before performing assertions in `download_url()` tests. This aims to avoid affecting other tests in case of failure. Follow-up to [42773], [51939]. See #62280. git-svn-id: https://develop.svn.wordpress.org/trunk@59604 602fd350-edb4-49c9-b593-d223f7449a82 --- tests/phpunit/tests/admin/includesFile.php | 26 ++++++++++++++-------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/tests/phpunit/tests/admin/includesFile.php b/tests/phpunit/tests/admin/includesFile.php index 4bfe80db6fc5d..943cabb7c09c1 100644 --- a/tests/phpunit/tests/admin/includesFile.php +++ b/tests/phpunit/tests/admin/includesFile.php @@ -43,6 +43,7 @@ public function test_download_url_non_200_response_code() { add_filter( 'pre_http_request', array( $this, '_fake_download_url_non_200_response_code' ), 10, 3 ); $error = download_url( 'test_download_url_non_200' ); + $this->assertWPError( $error ); $this->assertSame( array( @@ -55,6 +56,10 @@ public function test_download_url_non_200_response_code() { add_filter( 'download_url_error_max_body_size', array( $this, '__return_5' ) ); $error = download_url( 'test_download_url_non_200' ); + + remove_filter( 'download_url_error_max_body_size', array( $this, '__return_5' ) ); + remove_filter( 'pre_http_request', array( $this, '_fake_download_url_non_200_response_code' ) ); + $this->assertWPError( $error ); $this->assertSame( array( @@ -63,9 +68,6 @@ public function test_download_url_non_200_response_code() { ), $error->get_error_data() ); - - remove_filter( 'download_url_error_max_body_size', array( $this, '__return_5' ) ); - remove_filter( 'pre_http_request', array( $this, '_fake_download_url_non_200_response_code' ) ); } public function _fake_download_url_non_200_response_code( $response, $parsed_args, $url ) { @@ -94,11 +96,13 @@ public function test_download_url_should_respect_filename_from_content_dispositi add_filter( 'pre_http_request', array( $this, $filter ), 10, 3 ); $filename = download_url( 'url_with_content_disposition_header' ); - $this->assertStringContainsString( 'filename-from-content-disposition-header', $filename ); + + remove_filter( 'pre_http_request', array( $this, $filter ) ); + $this->assertFileExists( $filename ); $this->unlink( $filename ); - remove_filter( 'pre_http_request', array( $this, $filter ) ); + $this->assertStringContainsString( 'filename-from-content-disposition-header', $filename ); } /** @@ -126,10 +130,12 @@ public function test_save_to_temp_directory_when_getting_filename_from_content_d add_filter( 'pre_http_request', array( $this, $filter ), 10, 3 ); $filename = download_url( 'url_with_content_disposition_header' ); - $this->assertStringContainsString( get_temp_dir(), $filename ); - $this->unlink( $filename ); remove_filter( 'pre_http_request', array( $this, $filter ) ); + + $this->unlink( $filename ); + + $this->assertStringContainsString( get_temp_dir(), $filename ); } /** @@ -209,10 +215,12 @@ public function test_download_url_should_reject_filename_from_invalid_content_di add_filter( 'pre_http_request', array( $this, $filter ), 10, 3 ); $filename = download_url( 'url_with_content_disposition_header' ); - $this->assertStringContainsString( 'url_with_content_disposition_header', $filename ); - $this->unlink( $filename ); remove_filter( 'pre_http_request', array( $this, $filter ) ); + + $this->unlink( $filename ); + + $this->assertStringContainsString( 'url_with_content_disposition_header', $filename ); } /** From 48ba7a364d581decc6ba7c2b84c3d72e84b0fe73 Mon Sep 17 00:00:00 2001 From: Pascal Birchler <swissspidy@git.wordpress.org> Date: Wed, 15 Jan 2025 12:44:43 +0000 Subject: [PATCH 183/323] REST API: Improve autosave and revision endpoints for templates and template parts. Fixes those endpoints for file-based templates and template parts, as templates based on theme files can't be revisioned or autosaved. Props antonvlasenko, swissspidy, spacedmonkey, kadamwhite. Fixes #61970. git-svn-id: https://develop.svn.wordpress.org/trunk@59605 602fd350-edb4-49c9-b593-d223f7449a82 --- ...-wp-rest-template-revisions-controller.php | 12 +- .../wpRestTemplateAutosavesController.php | 414 +++++++++-- .../wpRestTemplateRevisionsController.php | 688 +++++++++++++++--- 3 files changed, 973 insertions(+), 141 deletions(-) diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-template-revisions-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-template-revisions-controller.php index 22cdc268fa8c6..c0bc7663e1f8b 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-template-revisions-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-template-revisions-controller.php @@ -170,7 +170,17 @@ protected function get_parent( $parent_template_id ) { return new WP_Error( 'rest_post_invalid_parent', __( 'Invalid template parent ID.' ), - array( 'status' => 404 ) + array( 'status' => WP_Http::NOT_FOUND ) + ); + } + + $parent_post_id = isset( $template->wp_id ) ? (int) $template->wp_id : 0; + + if ( $parent_post_id <= 0 ) { + return new WP_Error( + 'rest_invalid_template', + __( 'Templates based on theme files can\'t have revisions.' ), + array( 'status' => WP_Http::BAD_REQUEST ) ); } diff --git a/tests/phpunit/tests/rest-api/wpRestTemplateAutosavesController.php b/tests/phpunit/tests/rest-api/wpRestTemplateAutosavesController.php index 550eb8e5fe999..e2da442e7d874 100644 --- a/tests/phpunit/tests/rest-api/wpRestTemplateAutosavesController.php +++ b/tests/phpunit/tests/rest-api/wpRestTemplateAutosavesController.php @@ -22,7 +22,17 @@ class Tests_REST_wpRestTemplateAutosavesController extends WP_Test_REST_Controll /** * @var string */ - const PARENT_POST_TYPE = 'wp_template'; + const TEMPLATE_PART_NAME = 'my_template_part'; + + /** + * @var string + */ + const TEMPLATE_POST_TYPE = 'wp_template'; + + /** + * @var string + */ + const TEMPLATE_PART_POST_TYPE = 'wp_template_part'; /** * Admin user ID. @@ -52,7 +62,16 @@ class Tests_REST_wpRestTemplateAutosavesController extends WP_Test_REST_Controll private static $template_post; /** - * Create fake data before our tests run. + * Template part post. + * + * @since 6.7.0 + * + * @var WP_Post + */ + private static $template_part_post; + + /** + * Create fake data before the tests run. * * @param WP_UnitTest_Factory $factory Helper that lets us create fake data. */ @@ -73,9 +92,9 @@ public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) { // Set up template post. self::$template_post = $factory->post->create_and_get( array( - 'post_type' => self::PARENT_POST_TYPE, + 'post_type' => self::TEMPLATE_POST_TYPE, 'post_name' => self::TEMPLATE_NAME, - 'post_title' => 'My Template', + 'post_title' => 'My template', 'post_content' => 'Content', 'post_excerpt' => 'Description of my template', 'tax_input' => array( @@ -86,6 +105,27 @@ public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) { ) ); wp_set_post_terms( self::$template_post->ID, self::TEST_THEME, 'wp_theme' ); + + // Set up template part post. + self::$template_part_post = $factory->post->create_and_get( + array( + 'post_type' => self::TEMPLATE_PART_POST_TYPE, + 'post_name' => self::TEMPLATE_PART_NAME, + 'post_title' => 'My template part', + 'post_content' => 'Content', + 'post_excerpt' => 'Description of my template part', + 'tax_input' => array( + 'wp_theme' => array( + self::TEST_THEME, + ), + 'wp_template_part_area' => array( + WP_TEMPLATE_PART_AREA_HEADER, + ), + ), + ) + ); + wp_set_post_terms( self::$template_part_post->ID, self::TEST_THEME, 'wp_theme' ); + wp_set_post_terms( self::$template_part_post->ID, WP_TEMPLATE_PART_AREA_HEADER, 'wp_template_part_area' ); } /** @@ -117,12 +157,26 @@ public function test_register_routes() { } /** - * @covers WP_REST_Template_Autosaves_Controller::get_context_param + * @coversNothing * @ticket 56922 */ public function test_context_param() { + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_context_param_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_context_param_with_data_provider + * @covers WP_REST_Template_Autosaves_Controller::get_context_param + * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_context_param_with_data_provider( $rest_base, $template_id ) { // Collection. - $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/autosaves' ); + $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves' ); $response = rest_get_server()->dispatch( $request ); $data = $response->get_data(); @@ -144,7 +198,7 @@ public function test_context_param() { ); // Single. - $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/autosaves/1' ); + $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves/1' ); $response = rest_get_server()->dispatch( $request ); $data = $response->get_data(); $this->assertCount( @@ -165,25 +219,55 @@ public function test_context_param() { } /** - * @covers WP_REST_Template_Autosaves_Controller::get_items + * Data provider for test_context_param_with_data_provider. + * + * @return array + */ + public function data_context_param_with_data_provider() { + return array( + 'templates' => array( 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template parts' => array( 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @coversNothing * @ticket 56922 */ public function test_get_items() { + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_get_items_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_get_items_with_data_provider + * @covers WP_REST_Template_Autosaves_Controller::get_items + * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_get_items_with_data_provider( $parent_post_property_name, $rest_base, $template_id ) { wp_set_current_user( self::$admin_id ); + // Cannot access this property in the data provider because it is not initialized at the time of execution. + $parent_post = self::$$parent_post_property_name; $autosave_post_id = wp_create_post_autosave( array( 'post_content' => 'Autosave content.', - 'post_ID' => self::$template_post->ID, - 'post_type' => self::PARENT_POST_TYPE, + 'post_ID' => $parent_post->ID, + 'post_type' => $parent_post->post_type, ) ); $request = new WP_REST_Request( 'GET', - '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/autosaves' + '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves' ); $response = rest_get_server()->dispatch( $request ); $autosaves = $response->get_data(); + $this->assertSame( WP_Http::OK, $response->get_status(), 'Response is expected to have a status code of 200.' ); $this->assertCount( 1, @@ -197,7 +281,7 @@ public function test_get_items() { 'Failed asserting that the ID of the autosave matches the expected autosave post ID.' ); $this->assertSame( - self::$template_post->ID, + $parent_post->ID, $autosaves[0]['parent'], 'Failed asserting that the parent ID of the autosave matches the template post ID.' ); @@ -209,22 +293,121 @@ public function test_get_items() { } /** - * @covers WP_REST_Template_Autosaves_Controller::get_item + * Data provider for test_get_items_with_data_provider. + * + * @return array + */ + public function data_get_items_with_data_provider() { + return array( + 'templates' => array( 'template_post', 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template parts' => array( 'template_part_post', 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @dataProvider data_get_items_for_templates_based_on_theme_files_should_return_bad_response_status + * @ticket 61970 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_get_items_for_templates_based_on_theme_files_should_return_bad_response_status( $rest_base, $template_id ) { + wp_set_current_user( self::$admin_id ); + switch_theme( 'block-theme' ); + + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves' ); + + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( + 'rest_invalid_template', + $response, + WP_Http::BAD_REQUEST, + sprintf( 'Response is expected to have a status code of %d.', WP_Http::BAD_REQUEST ) + ); + } + + /** + * Data provider for test_get_items_for_templates_based_on_theme_files_should_return_bad_response_status. + * + * @return array + */ + public function data_get_items_for_templates_based_on_theme_files_should_return_bad_response_status() { + return array( + 'templates' => array( 'templates', self::TEST_THEME . '//page-home' ), + 'template parts' => array( 'template-parts', self::TEST_THEME . '//small-header' ), + ); + } + + /** + * @dataProvider data_get_item_for_templates_based_on_theme_files_should_return_bad_response_status + * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_get_item_for_templates_based_on_theme_files_should_return_bad_response_status( $rest_base, $template_id ) { + wp_set_current_user( self::$admin_id ); + switch_theme( 'block-theme' ); + + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves/1' ); + + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( + 'rest_invalid_template', + $response, + WP_Http::BAD_REQUEST, + sprintf( 'Response is expected to have a status code of %d.', WP_Http::BAD_REQUEST ) + ); + } + + /** + * Data provider for test_get_item_for_templates_based_on_theme_files_should_return_bad_response_status. + * + * @return array + */ + public function data_get_item_for_templates_based_on_theme_files_should_return_bad_response_status() { + return array( + 'templates' => array( 'templates', self::TEST_THEME . '//page-home' ), + 'template parts' => array( 'template-parts', self::TEST_THEME . '//small-header' ), + ); + } + + /** + * @coversNothing * @ticket 56922 */ public function test_get_item() { + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_get_item_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_get_item_with_data_provider + * @covers WP_REST_Template_Autosaves_Controller::get_item + * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_get_item_with_data_provider( $parent_post_property_name, $rest_base, $template_id ) { wp_set_current_user( self::$admin_id ); + $parent_post = self::$$parent_post_property_name; + $autosave_post_id = wp_create_post_autosave( array( 'post_content' => 'Autosave content.', - 'post_ID' => self::$template_post->ID, - 'post_type' => self::PARENT_POST_TYPE, + 'post_ID' => $parent_post->ID, + 'post_type' => $parent_post->post_type, ) ); - $request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/autosaves/' . $autosave_post_id ); + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves/' . $autosave_post_id ); $response = rest_get_server()->dispatch( $request ); + + $this->assertSame( WP_Http::OK, $response->get_status(), 'Response is expected to have a status code of 200.' ); $autosave = $response->get_data(); $this->assertIsArray( $autosave, 'Failed asserting that the autosave is an array.' ); @@ -234,32 +417,59 @@ public function test_get_item() { "Failed asserting that the autosave id is the same as $autosave_post_id." ); $this->assertSame( - self::$template_post->ID, + $parent_post->ID, $autosave['parent'], sprintf( 'Failed asserting that the parent id of the autosave is the same as %s.', - self::$template_post->ID + $parent_post->ID ) ); } /** - * @covers WP_REST_Template_Autosaves_Controller::prepare_item_for_response + * Data provider for test_get_item_with_data_provider. + * + * @return array + */ + public function data_get_item_with_data_provider() { + return array( + 'templates' => array( 'template_post', 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template parts' => array( 'template_part_post', 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @coversNothing * @ticket 56922 */ public function test_prepare_item() { + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_prepare_item_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_prepare_item_with_data_provider + * @covers WP_REST_Template_Autosaves_Controller::prepare_item_for_response + * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_prepare_item_with_data_provider( $parent_post_property_name, $rest_base, $template_id ) { wp_set_current_user( self::$admin_id ); + $parent_post = self::$$parent_post_property_name; $autosave_post_id = wp_create_post_autosave( array( 'post_content' => 'Autosave content.', - 'post_ID' => self::$template_post->ID, - 'post_type' => self::PARENT_POST_TYPE, + 'post_ID' => $parent_post->ID, + 'post_type' => $parent_post->post_type, ) ); $autosave_db_post = get_post( $autosave_post_id ); - $template_id = self::TEST_THEME . '//' . self::TEMPLATE_NAME; - $request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . $template_id . '/autosaves/' . $autosave_db_post->ID ); - $controller = new WP_REST_Template_Autosaves_Controller( self::PARENT_POST_TYPE ); + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves/' . $autosave_db_post->ID ); + $controller = new WP_REST_Template_Autosaves_Controller( $parent_post->post_type ); $response = $controller->prepare_item_for_response( $autosave_db_post, $request ); $this->assertInstanceOf( WP_REST_Response::class, @@ -275,11 +485,11 @@ public function test_prepare_item() { "Failed asserting that the autosave id is the same as $autosave_db_post->ID." ); $this->assertSame( - self::$template_post->ID, + $parent_post->ID, $autosave['parent'], sprintf( 'Failed asserting that the parent id of the autosave is the same as %s.', - self::$template_post->ID + $parent_post->ID ) ); @@ -300,17 +510,45 @@ public function test_prepare_item() { } /** - * @covers WP_REST_Template_Autosaves_Controller::get_item_schema + * Data provider for test_prepare_item_with_data_provider. + * + * @return array + */ + public function data_prepare_item_with_data_provider() { + return array( + 'templates' => array( 'template_post', 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template parts' => array( 'template_part_post', 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @coversNothing * @ticket 56922 */ public function test_get_item_schema() { - $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/autosaves' ); + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_prepare_item_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_get_item_schema_with_data_provider + * @covers WP_REST_Template_Autosaves_Controller::get_item_schema + * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + * @param int $properties_count Number of properties to check for in the schema. + * @param array $additional_properties Additional properties to check for in the schema. + */ + public function test_get_item_schema_with_data_provider( $rest_base, $template_id, $properties_count, $additional_properties = array() ) { + $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves' ); $response = rest_get_server()->dispatch( $request ); $data = $response->get_data(); $properties = $data['schema']['properties']; - $this->assertCount( 19, $properties ); + $this->assertCount( $properties_count, $properties ); $this->assertArrayHasKey( 'id', $properties, 'ID key should exist in properties.' ); $this->assertArrayHasKey( 'slug', $properties, 'Slug key should exist in properties.' ); $this->assertArrayHasKey( 'theme', $properties, 'Theme key should exist in properties.' ); @@ -324,22 +562,58 @@ public function test_get_item_schema() { $this->assertArrayHasKey( 'has_theme_file', $properties, 'has_theme_file key should exist in properties.' ); $this->assertArrayHasKey( 'author', $properties, 'author key should exist in properties.' ); $this->assertArrayHasKey( 'modified', $properties, 'modified key should exist in properties.' ); - $this->assertArrayHasKey( 'is_custom', $properties, 'is_custom key should exist in properties.' ); $this->assertArrayHasKey( 'parent', $properties, 'Parent key should exist in properties.' ); $this->assertArrayHasKey( 'author_text', $properties, 'author_text key should exist in properties.' ); $this->assertArrayHasKey( 'original_source', $properties, 'original_source key should exist in properties.' ); - $this->assertArrayHasKey( 'plugin', $properties, 'plugin key should exist in properties.' ); + foreach ( $additional_properties as $additional_property ) { + $this->assertArrayHasKey( $additional_property, $properties, $additional_property . ' key should exist in properties.' ); + } } /** - * @covers WP_REST_Template_Autosaves_Controller::create_item + * Data provider for test_get_item_schema_with_data_provider. + * + * @return array + */ + public function data_get_item_schema_with_data_provider() { + return array( + 'templates' => array( + 'templates', + self::TEST_THEME . '//' . self::TEMPLATE_NAME, + 19, + array( 'is_custom', 'plugin' ), + ), + 'template parts' => array( + 'template-parts', + self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME, + 18, + array( 'area' ), + ), + ); + } + + /** + * @coversNothing * @ticket 56922 */ public function test_create_item() { + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_create_item_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_create_item_with_data_provider + * @covers WP_REST_Template_Autosaves_Controller::create_item + * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_create_item_with_data_provider( $rest_base, $template_id ) { wp_set_current_user( self::$admin_id ); - $template_id = self::TEST_THEME . '/' . self::TEMPLATE_NAME; - $request = new WP_REST_Request( 'POST', '/wp/v2/templates/' . $template_id . '/autosaves' ); + $request = new WP_REST_Request( 'POST', '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves' ); $request->add_header( 'Content-Type', 'application/x-www-form-urlencoded' ); $request_parameters = array( @@ -353,41 +627,83 @@ public function test_create_item() { $request->set_body_params( $request_parameters ); $response = rest_get_server()->dispatch( $request ); - $this->assertNotWPError( $response, 'The response from this request should not return a WP_Error object' ); + $this->assertNotWPError( $response, 'The response from this request should not return a WP_Error object.' ); $response = rest_ensure_response( $response ); $data = $response->get_data(); - $this->assertArrayHasKey( 'content', $data, 'Response should contain a key called content' ); - $this->assertSame( $request_parameters['content'], $data['content']['raw'], 'Response data should match for field content' ); + $this->assertArrayHasKey( 'content', $data, 'Response should contain a key called content.' ); + $this->assertSame( $request_parameters['content'], $data['content']['raw'], 'Response data should match for field content.' ); - $this->assertArrayHasKey( 'title', $data, 'Response should contain a key called title' ); - $this->assertSame( $request_parameters['title'], $data['title']['raw'], 'Response data should match for field title' ); + $this->assertArrayHasKey( 'title', $data, 'Response should contain a key called title.' ); + $this->assertSame( $request_parameters['title'], $data['title']['raw'], 'Response data should match for field title.' ); } /** - * @covers WP_REST_Template_Autosaves_Controller::delete_item + * Data provider for test_create_item_with_data_provider. + * + * @return array + */ + public function data_create_item_with_data_provider() { + return array( + 'templates' => array( 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template part' => array( 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @dataProvider data_create_item_incorrect_permission + * @covers WP_REST_Template_Autosaves_Controller::create_item_permissions_check * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. */ - public function test_create_item_incorrect_permission() { + public function test_create_item_incorrect_permission( $rest_base, $template_id ) { wp_set_current_user( self::$contributor_id ); - $template_id = self::TEST_THEME . '/' . self::TEMPLATE_NAME; - $request = new WP_REST_Request( 'POST', '/wp/v2/templates/' . $template_id . '/autosaves' ); - $response = rest_get_server()->dispatch( $request ); + $request = new WP_REST_Request( 'POST', '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves' ); + $response = rest_get_server()->dispatch( $request ); $this->assertErrorResponse( 'rest_cannot_manage_templates', $response, WP_Http::FORBIDDEN ); } /** - * @covers WP_REST_Template_Autosaves_Controller::delete_item + * Data provider for test_create_item_incorrect_permission. + * + * @return array + */ + public function data_create_item_incorrect_permission() { + return array( + 'template' => array( 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template part' => array( 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @dataProvider data_create_item_no_permission + * @covers WP_REST_Template_Autosaves_Controller::create_item_permissions_check * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. */ - public function test_create_item_no_permission() { + public function test_create_item_no_permission( $rest_base, $template_id ) { wp_set_current_user( 0 ); - $template_id = self::TEST_THEME . '/' . self::TEMPLATE_NAME; - $request = new WP_REST_Request( 'POST', '/wp/v2/templates/' . $template_id . '/autosaves' ); - $response = rest_get_server()->dispatch( $request ); + $request = new WP_REST_Request( 'POST', '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves' ); + $response = rest_get_server()->dispatch( $request ); $this->assertErrorResponse( 'rest_cannot_manage_templates', $response, WP_Http::UNAUTHORIZED ); } + /** + * Data provider for test_create_item_no_permission. + * + * @return array + */ + public function data_create_item_no_permission() { + return array( + 'template' => array( 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template part' => array( 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + /** * @coversNothing * @ticket 56922 diff --git a/tests/phpunit/tests/rest-api/wpRestTemplateRevisionsController.php b/tests/phpunit/tests/rest-api/wpRestTemplateRevisionsController.php index 014a191f0a13f..2391a92478ede 100644 --- a/tests/phpunit/tests/rest-api/wpRestTemplateRevisionsController.php +++ b/tests/phpunit/tests/rest-api/wpRestTemplateRevisionsController.php @@ -27,7 +27,22 @@ class Tests_REST_wpRestTemplateRevisionsController extends WP_Test_REST_Controll /** * @var string */ - const PARENT_POST_TYPE = 'wp_template'; + const TEMPLATE_PART_NAME = 'my_template_part'; + + /** + * @var string + */ + const TEMPLATE_PART_NAME_2 = 'my_template_part_2'; + + /** + * @var string + */ + const TEMPLATE_POST_TYPE = 'wp_template'; + + /** + * @var string + */ + const TEMPLATE_PART_POST_TYPE = 'wp_template_part'; /** * Admin user ID. @@ -65,10 +80,33 @@ class Tests_REST_wpRestTemplateRevisionsController extends WP_Test_REST_Controll */ private static $template_post_2; + /** + * Template part post. + * + * @since 6.7.0 + * + * @var WP_Post + */ + private static $template_part_post; + + /** + * Template part post. + * + * @since 6.7.0 + * + * @var WP_Post + */ + private static $template_part_post_2; + /** * @var array */ - private static $revisions = array(); + private static $template_revisions = array(); + + /** + * @var array + */ + private static $template_part_revisions = array(); /** * Create fake data before our tests run. @@ -92,7 +130,7 @@ public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) { // Set up template post. self::$template_post = $factory->post->create_and_get( array( - 'post_type' => self::PARENT_POST_TYPE, + 'post_type' => self::TEMPLATE_POST_TYPE, 'post_name' => self::TEMPLATE_NAME, 'post_title' => 'My Template', 'post_content' => 'Content', @@ -106,54 +144,84 @@ public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) { ); wp_set_post_terms( self::$template_post->ID, self::TEST_THEME, 'wp_theme' ); - // Update post to create a new revisions. - self::$revisions[] = _wp_put_post_revision( - array( - 'ID' => self::$template_post->ID, - 'post_content' => 'Content revision #2', - ) - ); + // Update post to create new revisions. + foreach ( range( 2, 5 ) as $revision_index ) { + self::$template_revisions[] = _wp_put_post_revision( + array( + 'ID' => self::$template_post->ID, + 'post_content' => 'Content revision #' . $revision_index, + ) + ); + } - // Update post to create a new revisions. - self::$revisions[] = _wp_put_post_revision( + // Create a new template post to test the get_item method. + self::$template_post_2 = $factory->post->create_and_get( array( - 'ID' => self::$template_post->ID, - 'post_content' => 'Content revision #3', + 'post_type' => self::TEMPLATE_POST_TYPE, + 'post_name' => self::TEMPLATE_NAME_2, + 'post_title' => 'My Template 2', + 'post_content' => 'Content 2', + 'post_excerpt' => 'Description of my template 2', + 'tax_input' => array( + 'wp_theme' => array( + self::TEST_THEME, + ), + ), ) ); + wp_set_post_terms( self::$template_post_2->ID, self::TEST_THEME, 'wp_theme' ); - // Update post to create a new revisions. - self::$revisions[] = _wp_put_post_revision( + // Set up template part post. + self::$template_part_post = $factory->post->create_and_get( array( - 'ID' => self::$template_post->ID, - 'post_content' => 'Content revision #4', + 'post_type' => self::TEMPLATE_PART_POST_TYPE, + 'post_name' => self::TEMPLATE_PART_NAME, + 'post_title' => 'My template part', + 'post_content' => 'Content', + 'post_excerpt' => 'Description of my template part', + 'tax_input' => array( + 'wp_theme' => array( + self::TEST_THEME, + ), + 'wp_template_part_area' => array( + WP_TEMPLATE_PART_AREA_HEADER, + ), + ), ) ); + wp_set_post_terms( self::$template_part_post->ID, self::TEST_THEME, 'wp_theme' ); + wp_set_post_terms( self::$template_part_post->ID, WP_TEMPLATE_PART_AREA_HEADER, 'wp_template_part_area' ); - // Update post to create a new revisions. - self::$revisions[] = _wp_put_post_revision( - array( - 'ID' => self::$template_post->ID, - 'post_content' => 'Content revision #5', - ) - ); + // Update post to create new revisions. + foreach ( range( 2, 5 ) as $revision_index ) { + self::$template_part_revisions[] = _wp_put_post_revision( + array( + 'ID' => self::$template_part_post->ID, + 'post_content' => 'Content revision #' . $revision_index, + ) + ); + } - // Create a new template post to test the get_item method. - self::$template_post_2 = $factory->post->create_and_get( + // Set up template part post. + self::$template_part_post_2 = $factory->post->create_and_get( array( - 'post_type' => self::PARENT_POST_TYPE, - 'post_name' => self::TEMPLATE_NAME_2, - 'post_title' => 'My Template 2', + 'post_type' => self::TEMPLATE_PART_POST_TYPE, + 'post_name' => self::TEMPLATE_PART_NAME_2, + 'post_title' => 'My template part 2', 'post_content' => 'Content 2', - 'post_excerpt' => 'Description of my template 2', + 'post_excerpt' => 'Description of my template part 2', 'tax_input' => array( - 'wp_theme' => array( + 'wp_theme' => array( self::TEST_THEME, ), + 'wp_template_part_area' => array( + WP_TEMPLATE_PART_AREA_HEADER, + ), ), ) ); - wp_set_post_terms( self::$template_post_2->ID, self::TEST_THEME, 'wp_theme' ); + wp_set_post_terms( self::$template_part_post_2->ID, self::TEST_THEME, 'wp_theme' ); + wp_set_post_terms( self::$template_part_post_2->ID, WP_TEMPLATE_PART_AREA_HEADER, 'wp_template_part_area' ); } /** @@ -161,8 +229,12 @@ public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) { */ public static function wpTearDownAfterClass() { // Also deletes revisions. - foreach ( self::$revisions as $revision ) { - wp_delete_post( $revision, true ); + foreach ( self::$template_revisions as $template_revision ) { + wp_delete_post( $template_revision, true ); + } + + foreach ( self::$template_part_revisions as $template_part_revision ) { + wp_delete_post( $template_part_revision, true ); } } @@ -195,12 +267,26 @@ public function test_register_routes() { } /** - * @covers WP_REST_Template_Revisions_Controller::get_context_param + * @coversNothing * @ticket 56922 */ public function test_context_param() { + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_context_param_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_context_param_with_data_provider + * @covers WP_REST_Template_Revisions_Controller::get_context_param + * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_context_param_with_data_provider( $rest_base, $template_id ) { // Collection. - $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions' ); + $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions' ); $response = rest_get_server()->dispatch( $request ); $data = $response->get_data(); $this->assertSame( @@ -215,7 +301,7 @@ public function test_context_param() { ); // Single. - $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions/1' ); + $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions/1' ); $response = rest_get_server()->dispatch( $request ); $data = $response->get_data(); $this->assertCount( @@ -236,17 +322,47 @@ public function test_context_param() { } /** - * @covers WP_REST_Template_Revisions_Controller::get_items + * Data provider for test_context_param. + * + * @return array + */ + public function data_context_param_with_data_provider() { + return array( + 'templates' => array( 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template parts' => array( 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @coversNothing * @ticket 56922 */ public function test_get_items() { + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_get_items_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_get_items_with_data_provider + * @covers WP_REST_Template_Revisions_Controller::get_items + * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_get_items_with_data_provider( $parent_post_property_name, $rest_base, $template_id ) { wp_set_current_user( self::$admin_id ); + $parent_post = self::$$parent_post_property_name; + $request = new WP_REST_Request( 'GET', - '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions' + '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions' ); $response = rest_get_server()->dispatch( $request ); $revisions = $response->get_data(); + $this->assertSame( WP_Http::OK, $response->get_status(), 'Response is expected to have a status code of 200.' ); $this->assertCount( 4, @@ -255,7 +371,7 @@ public function test_get_items() { ); $this->assertSame( - self::$template_post->ID, + $parent_post->ID, $revisions[0]['parent'], 'Failed asserting that the parent ID of the revision matches the template post ID.' ); @@ -266,7 +382,7 @@ public function test_get_items() { ); $this->assertSame( - self::$template_post->ID, + $parent_post->ID, $revisions[1]['parent'], 'Failed asserting that the parent ID of the revision matches the template post ID.' ); @@ -277,7 +393,7 @@ public function test_get_items() { ); $this->assertSame( - self::$template_post->ID, + $parent_post->ID, $revisions[2]['parent'], 'Failed asserting that the parent ID of the revision matches the template post ID.' ); @@ -288,7 +404,7 @@ public function test_get_items() { ); $this->assertSame( - self::$template_post->ID, + $parent_post->ID, $revisions[3]['parent'], 'Failed asserting that the parent ID of the revision matches the template post ID.' ); @@ -299,40 +415,168 @@ public function test_get_items() { ); } + /** + * Data provider for test_get_items_with_data_provider. + * + * @return array + */ + public function data_get_items_with_data_provider() { + return array( + 'templates' => array( 'template_post', 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template parts' => array( 'template_part_post', 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } /** + * @dataProvider data_get_items_endpoint_should_return_unauthorized_https_status_code_for_unauthorized_request * @covers WP_REST_Template_Revisions_Controller::get_items_permissions_check * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. */ - public function test_get_items_endpoint_should_return_unauthorized_https_status_code_for_unauthorized_request() { + public function test_get_items_endpoint_should_return_unauthorized_https_status_code_for_unauthorized_request( $rest_base, $template_id ) { wp_set_current_user( 0 ); - $request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions' ); + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions' ); $response = rest_get_server()->dispatch( $request ); $this->assertErrorResponse( 'rest_cannot_read', $response, WP_Http::UNAUTHORIZED ); } /** + * Data provider for test_get_items_endpoint_should_return_unauthorized_https_status_code_for_unauthorized_request. + * + * @return array + */ + public function data_get_items_endpoint_should_return_unauthorized_https_status_code_for_unauthorized_request() { + return array( + 'templates' => array( 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template parts' => array( 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @dataProvider data_get_items_endpoint_should_return_forbidden_https_status_code_for_users_with_insufficient_permissions * @covers WP_REST_Template_Revisions_Controller::get_items_permissions_check * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. */ - public function test_get_items_endpoint_should_return_forbidden_https_status_code_for_users_with_insufficient_permissions() { + public function test_get_items_endpoint_should_return_forbidden_https_status_code_for_users_with_insufficient_permissions( $rest_base, string $template_id ) { wp_set_current_user( self::$contributor_id ); - $request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions' ); + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions' ); $response = rest_get_server()->dispatch( $request ); $this->assertErrorResponse( 'rest_cannot_read', $response, WP_Http::FORBIDDEN ); } /** - * @covers WP_REST_Template_Revisions_Controller::get_item + * Data provider for test_get_items_endpoint_should_return_unauthorized_https_status_code_for_unauthorized_request. + * + * @return array + */ + public function data_get_items_endpoint_should_return_forbidden_https_status_code_for_users_with_insufficient_permissions() { + return array( + 'templates' => array( 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template parts' => array( 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @dataProvider data_get_items_for_templates_based_on_theme_files_should_return_bad_response_status + * @ticket 61970 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_get_items_for_templates_based_on_theme_files_should_return_bad_response_status( $rest_base, $template_id ) { + wp_set_current_user( self::$admin_id ); + switch_theme( 'block-theme' ); + + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions' ); + + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( + 'rest_invalid_template', + $response, + WP_Http::BAD_REQUEST, + sprintf( 'Response is expected to have a status code of %d.', WP_Http::BAD_REQUEST ) + ); + } + + /** + * Data provider for test_get_items_for_templates_based_on_theme_files_should_return_bad_response_status. + * + * @return array + */ + public function data_get_items_for_templates_based_on_theme_files_should_return_bad_response_status() { + return array( + 'templates' => array( 'templates', self::TEST_THEME . '//page-home' ), + 'template parts' => array( 'template-parts', self::TEST_THEME . '//small-header' ), + ); + } + + /** + * @dataProvider data_get_item_for_templates_based_on_theme_files_should_return_bad_response_status + * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_get_item_for_templates_based_on_theme_files_should_return_bad_response_status( $rest_base, $template_id ) { + wp_set_current_user( self::$admin_id ); + switch_theme( 'block-theme' ); + + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions/1' ); + + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( + 'rest_invalid_template', + $response, + WP_Http::BAD_REQUEST, + sprintf( 'Response is expected to have a status code of %d.', WP_Http::BAD_REQUEST ) + ); + } + + /** + * Data provider for test_get_item_for_templates_based_on_theme_files_should_return_bad_response_status. + * + * @return array + */ + public function data_get_item_for_templates_based_on_theme_files_should_return_bad_response_status() { + return array( + 'templates' => array( 'templates', self::TEST_THEME . '//page-home' ), + 'template parts' => array( 'template-parts', self::TEST_THEME . '//small-header' ), + ); + } + + /** + * @coversNothing * @ticket 56922 */ public function test_get_item() { + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_get_item_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_get_item_with_data_provider + * @covers WP_REST_Template_Revisions_Controller::get_item + * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_get_item_with_data_provider( $parent_post_property_name, $rest_base, $template_id ) { wp_set_current_user( self::$admin_id ); - $revisions = wp_get_post_revisions( self::$template_post, array( 'fields' => 'ids' ) ); + $parent_post = self::$$parent_post_property_name; + + $revisions = wp_get_post_revisions( $parent_post, array( 'fields' => 'ids' ) ); $revision_id = array_shift( $revisions ); - $request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions/' . $revision_id ); + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions/' . $revision_id ); $response = rest_get_server()->dispatch( $request ); $revision = $response->get_data(); @@ -343,7 +587,7 @@ public function test_get_item() { "Failed asserting that the revision id is the same as $revision_id" ); $this->assertSame( - self::$template_post->ID, + $parent_post->ID, $revision['parent'], sprintf( 'Failed asserting that the parent id of the revision is the same as %s.', @@ -353,47 +597,125 @@ public function test_get_item() { } /** + * Data provider for test_get_item_with_data_provider. + * + * @return array + */ + public function data_get_item_with_data_provider() { + return array( + 'templates' => array( 'template_post', 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template parts' => array( 'template_part_post', 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @dataProvider data_get_item_not_found * @covers WP_REST_Template_Revisions_Controller::get_item * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $rest_base Base part of the REST API endpoint to test. */ - public function test_get_item_not_found() { + public function test_get_item_not_found( $parent_post_property_name, $rest_base ) { wp_set_current_user( self::$admin_id ); - $revisions = wp_get_post_revisions( self::$template_post, array( 'fields' => 'ids' ) ); + $parent_post = self::$$parent_post_property_name; + + $revisions = wp_get_post_revisions( $parent_post, array( 'fields' => 'ids' ) ); $revision_id = array_shift( $revisions ); - $request = new WP_REST_Request( 'GET', '/wp/v2/templates/invalid//parent/revisions/' . $revision_id ); + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/invalid//parent/revisions/' . $revision_id ); $response = rest_get_server()->dispatch( $request ); $this->assertErrorResponse( 'rest_post_invalid_parent', $response, WP_Http::NOT_FOUND ); } /** + * Data provider for test_get_item_not_found. + * + * @return array + */ + public function data_get_item_not_found() { + return array( + 'templates' => array( 'template_post', 'templates' ), + 'template parts' => array( 'template_part_post', 'template-parts' ), + ); + } + + /** + * @dataProvider data_get_item_invalid_parent_id + * @covers WP_REST_Template_Revisions_Controller::get_item * @ticket 59875 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $actual_parent_post_property_name A class property name that contains the parent post object. + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. */ - public function test_get_item_invalid_parent_id() { + public function test_get_item_invalid_parent_id( $parent_post_property_name, $actual_parent_post_property_name, $rest_base, $template_id ) { wp_set_current_user( self::$admin_id ); - $revisions = wp_get_post_revisions( self::$template_post, array( 'fields' => 'ids' ) ); - $revision_id = array_shift( $revisions ); - $request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME_2 . '/revisions/' . $revision_id ); + $parent_post = self::$$parent_post_property_name; + $actual_parent_post = self::$$actual_parent_post_property_name; + $revisions = wp_get_post_revisions( $parent_post, array( 'fields' => 'ids' ) ); + $revision_id = array_shift( $revisions ); + + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions/' . $revision_id ); $response = rest_get_server()->dispatch( $request ); $this->assertErrorResponse( 'rest_revision_parent_id_mismatch', $response, 404 ); - $expected_message = 'The revision does not belong to the specified parent with id of "' . self::$template_post_2->ID . '"'; + $expected_message = 'The revision does not belong to the specified parent with id of "' . $actual_parent_post->ID . '"'; $this->assertSame( $expected_message, $response->as_error()->get_error_messages()[0], 'The message must contain the correct parent ID.' ); } /** - * @covers WP_REST_Template_Revisions_Controller::prepare_item_for_response + * Data provider for test_get_item_invalid_parent_id. + * + * @return array + */ + public function data_get_item_invalid_parent_id() { + return array( + 'templates' => array( + 'template_post', + 'template_post_2', + 'templates', + self::TEST_THEME . '//' . self::TEMPLATE_NAME_2, + ), + 'template parts' => array( + 'template_part_post', + 'template_part_post_2', + 'template-parts', + self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME_2, + ), + ); + } + + /** + * @coversNothing * @ticket 56922 */ public function test_prepare_item() { - $revisions = wp_get_post_revisions( self::$template_post, array( 'fields' => 'ids' ) ); + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_prepare_item_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_prepare_item_with_data_provider + * @covers WP_REST_Template_Revisions_Controller::prepare_item_for_response + * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_prepare_item_with_data_provider( $parent_post_property_name, $rest_base, $template_id ) { + $parent_post = self::$$parent_post_property_name; + $revisions = wp_get_post_revisions( $parent_post, array( 'fields' => 'ids' ) ); $revision_id = array_shift( $revisions ); $post = get_post( $revision_id ); - $request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions/' . $revision_id ); - $controller = new WP_REST_Template_Revisions_Controller( self::PARENT_POST_TYPE ); + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions/' . $revision_id ); + $controller = new WP_REST_Template_Revisions_Controller( $parent_post->post_type ); $response = $controller->prepare_item_for_response( $post, $request ); $this->assertInstanceOf( WP_REST_Response::class, @@ -409,11 +731,11 @@ public function test_prepare_item() { "Failed asserting that the revision id is the same as $revision_id." ); $this->assertSame( - self::$template_post->ID, + $parent_post->ID, $revision['parent'], sprintf( 'Failed asserting that the parent id of the revision is the same as %s.', - self::$template_post->ID + $parent_post->ID ) ); @@ -421,35 +743,63 @@ public function test_prepare_item() { $this->assertIsArray( $links, 'Failed asserting that the links are an array.' ); $this->assertStringEndsWith( - self::TEST_THEME . '//' . self::TEMPLATE_NAME . '/revisions/' . $revision_id, + $template_id . '/revisions/' . $revision_id, $links['self'][0]['href'], sprintf( 'Failed asserting that the self link ends with %s.', - self::TEST_THEME . '//' . self::TEMPLATE_NAME . '/revisions/' . $revision_id + $template_id . '/revisions/' . $revision_id ) ); $this->assertStringEndsWith( - self::TEST_THEME . '//' . self::TEMPLATE_NAME, + $template_id, $links['parent'][0]['href'], sprintf( 'Failed asserting that the parent link ends with %s.', - self::TEST_THEME . '//' . self::TEMPLATE_NAME + $template_id ) ); } /** - * @covers WP_REST_Template_Revisions_Controller::get_item_schema + * Data provider for test_prepare_item_with_data_provider. + * + * @return array + */ + public function data_prepare_item_with_data_provider() { + return array( + 'templates' => array( 'template_post', 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template parts' => array( 'template_part_post', 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @coversNothing * @ticket 56922 */ public function test_get_item_schema() { - $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions' ); + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_prepare_item_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_get_item_schema_with_data_provider + * @covers WP_REST_Template_Revisions_Controller::get_item_schema + * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + * @param int $properties_count Number of properties to check for in the schema. + * @param array $additional_properties Additional properties to check for in the schema. + */ + public function test_get_item_schema_with_data_provider( $rest_base, $template_id, $properties_count, $additional_properties = array() ) { + $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions' ); $response = rest_get_server()->dispatch( $request ); $data = $response->get_data(); $properties = $data['schema']['properties']; - $this->assertCount( 19, $properties ); + $this->assertCount( $properties_count, $properties ); $this->assertArrayHasKey( 'id', $properties, 'ID key should exist in properties.' ); $this->assertArrayHasKey( 'slug', $properties, 'Slug key should exist in properties.' ); $this->assertArrayHasKey( 'theme', $properties, 'Theme key should exist in properties.' ); @@ -463,11 +813,35 @@ public function test_get_item_schema() { $this->assertArrayHasKey( 'has_theme_file', $properties, 'has_theme_file key should exist in properties.' ); $this->assertArrayHasKey( 'author', $properties, 'author key should exist in properties.' ); $this->assertArrayHasKey( 'modified', $properties, 'modified key should exist in properties.' ); - $this->assertArrayHasKey( 'is_custom', $properties, 'is_custom key should exist in properties.' ); $this->assertArrayHasKey( 'parent', $properties, 'Parent key should exist in properties.' ); $this->assertArrayHasKey( 'author_text', $properties, 'author_text key should exist in properties.' ); $this->assertArrayHasKey( 'original_source', $properties, 'original_source key should exist in properties.' ); - $this->assertArrayHasKey( 'plugin', $properties, 'plugin key should exist in properties.' ); + + foreach ( $additional_properties as $additional_property ) { + $this->assertArrayHasKey( $additional_property, $properties, $additional_property . ' key should exist in properties.' ); + } + } + + /** + * Data provider for data_get_item_schema_with_data_provider. + * + * @return array + */ + public function data_get_item_schema_with_data_provider() { + return array( + 'templates' => array( + 'templates', + self::TEST_THEME . '//' . self::TEMPLATE_NAME, + 19, + array( 'is_custom', 'plugin' ), + ), + 'template parts' => array( + 'template-parts', + self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME, + 18, + array( 'area' ), + ), + ); } /** @@ -497,16 +871,35 @@ public function test_update_item() { } /** - * @covers WP_REST_Templates_Controller::delete_item + * @coversNothing * @ticket 56922 */ public function test_delete_item() { + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_delete_item_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_delete_item_with_data_provider + * @covers WP_REST_Templates_Controller::delete_item + * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $revisions_property_name A class property name that contains the revisions array. + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_delete_item_with_data_provider( $parent_post_property_name, $revisions_property_name, $rest_base, $template_id ) { wp_set_current_user( self::$admin_id ); - $revision_id = _wp_put_post_revision( self::$template_post ); - self::$revisions[] = $revision_id; + $parent_post = self::$$parent_post_property_name; + $revisions = self::$$revisions_property_name; + + $revision_id = _wp_put_post_revision( $parent_post ); + $revisions[] = $revision_id; - $request = new WP_REST_Request( 'DELETE', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions/' . $revision_id ); + $request = new WP_REST_Request( 'DELETE', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions/' . $revision_id ); $request->set_param( 'force', true ); $response = rest_get_server()->dispatch( $request ); @@ -515,48 +908,161 @@ public function test_delete_item() { } /** + * Data provider for test_delete_item_with_data_provider. + * + * @return array + */ + public function data_delete_item_with_data_provider() { + return array( + 'templates' => array( + 'template_post', + 'template_revisions', + 'templates', + self::TEST_THEME . '//' . self::TEMPLATE_NAME, + ), + 'template parts' => array( + 'template_part_post', + 'template_part_revisions', + 'template-parts', + self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME, + ), + ); + } + + /** + * @dataProvider data_delete_item_incorrect_permission * @covers WP_REST_Templates_Controller::delete_item * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $revisions_property_name A class property name that contains the revisions array. + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. */ - public function test_delete_item_incorrect_permission() { + public function test_delete_item_incorrect_permission( $parent_post_property_name, $revisions_property_name, $rest_base, $template_id ) { wp_set_current_user( self::$contributor_id ); - $revision_id = _wp_put_post_revision( self::$template_post ); - self::$revisions[] = $revision_id; + $parent_post = self::$$parent_post_property_name; + $revisions = self::$$revisions_property_name; + + $revision_id = _wp_put_post_revision( $parent_post ); + $revisions[] = $revision_id; - $request = new WP_REST_Request( 'DELETE', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions/' . $revision_id ); + $request = new WP_REST_Request( 'DELETE', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions/' . $revision_id ); $request->set_param( 'force', true ); $response = rest_get_server()->dispatch( $request ); $this->assertErrorResponse( 'rest_cannot_delete', $response, WP_Http::FORBIDDEN ); } /** + * Data provider for test_delete_item_with_data_provider. + * + * @return array + */ + public function data_delete_item_incorrect_permission() { + return array( + 'templates' => array( + 'template_post', + 'template_revisions', + 'templates', + self::TEST_THEME . '//' . self::TEMPLATE_NAME, + ), + 'template parts' => array( + 'template_part_post', + 'template_part_revisions', + 'template-parts', + self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME, + ), + ); + } + + /** + * @dataProvider data_delete_item_no_permission * @covers WP_REST_Templates_Controller::delete_item * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $revisions_property_name A class property name that contains the revisions array. + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. */ - public function test_delete_item_no_permission() { + public function test_delete_item_no_permission( $parent_post_property_name, $revisions_property_name, $rest_base, $template_id ) { wp_set_current_user( 0 ); - $revision_id = _wp_put_post_revision( self::$template_post ); - self::$revisions[] = $revision_id; - $request = new WP_REST_Request( 'DELETE', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions/' . $revision_id ); + $parent_post = self::$$parent_post_property_name; + $revisions = self::$$revisions_property_name; + + $revision_id = _wp_put_post_revision( $parent_post ); + $revisions[] = $revision_id; + + $request = new WP_REST_Request( 'DELETE', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions/' . $revision_id ); $request->set_param( 'force', true ); $response = rest_get_server()->dispatch( $request ); $this->assertErrorResponse( 'rest_cannot_delete', $response, WP_Http::UNAUTHORIZED ); } /** + * Data provider for test_delete_item_no_permission. + * + * @return array + */ + public function data_delete_item_no_permission() { + return array( + 'templates' => array( + 'template_post', + 'template_revisions', + 'templates', + self::TEST_THEME . '//' . self::TEMPLATE_NAME, + ), + 'template parts' => array( + 'template_part_post', + 'template_part_revisions', + 'template-parts', + self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME, + ), + ); + } + + /** + * @dataProvider data_delete_item_not_found * @covers WP_REST_Template_Revisions_Controller::get_item * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $revisions_property_name A class property name that contains the revisions array. + * @param string $rest_base Base part of the REST API endpoint to test. */ - public function test_delete_item_not_found() { + public function test_delete_item_not_found( $parent_post_property_name, $revisions_property_name, $rest_base ) { wp_set_current_user( self::$admin_id ); - $revision_id = _wp_put_post_revision( self::$template_post ); - self::$revisions[] = $revision_id; + $parent_post = self::$$parent_post_property_name; + $revisions = self::$$revisions_property_name; - $request = new WP_REST_Request( 'DELETE', '/wp/v2/templates/invalid//parent/revisions/' . $revision_id ); + $revision_id = _wp_put_post_revision( $parent_post ); + $revisions[] = $revision_id; + + $request = new WP_REST_Request( 'DELETE', '/wp/v2/' . $rest_base . '/invalid//parent/revisions/' . $revision_id ); $request->set_param( 'force', true ); $response = rest_get_server()->dispatch( $request ); $this->assertErrorResponse( 'rest_post_invalid_parent', $response, WP_Http::NOT_FOUND ); } + + /** + * Data provider for test_delete_item_not_found. + * + * @return array + */ + public function data_delete_item_not_found() { + return array( + 'templates' => array( + 'template_post', + 'template_revisions', + 'templates', + ), + 'template parts' => array( + 'template_part_post', + 'template_part_revisions', + 'template-parts', + ), + ); + } } From 9342553d5e403c651775be20d959d2779c4c3a2a Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Wed, 15 Jan 2025 12:50:48 +0000 Subject: [PATCH 184/323] Coding Standards: Use strict comparison in `paginate_links()`. Follow-up to [4275], [28785]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59606 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/general-template.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/general-template.php b/src/wp-includes/general-template.php index e96f0f7c37429..11dffac4b3270 100644 --- a/src/wp-includes/general-template.php +++ b/src/wp-includes/general-template.php @@ -4579,7 +4579,7 @@ function paginate_links( $args = '' ) { $dots = false; if ( $args['prev_next'] && $current && 1 < $current ) : - $link = str_replace( '%_%', 2 == $current ? '' : $args['format'], $args['base'] ); + $link = str_replace( '%_%', 2 === $current ? '' : $args['format'], $args['base'] ); $link = str_replace( '%#%', $current - 1, $link ); if ( $add_args ) { $link = add_query_arg( $add_args, $link ); @@ -4601,7 +4601,7 @@ function paginate_links( $args = '' ) { endif; for ( $n = 1; $n <= $total; $n++ ) : - if ( $n == $current ) : + if ( $n === $current ) : $page_links[] = sprintf( '<span aria-current="%s" class="page-numbers current">%s</span>', esc_attr( $args['aria_current'] ), @@ -4611,7 +4611,7 @@ function paginate_links( $args = '' ) { $dots = true; else : if ( $args['show_all'] || ( $n <= $end_size || ( $current && $n >= $current - $mid_size && $n <= $current + $mid_size ) || $n > $total - $end_size ) ) : - $link = str_replace( '%_%', 1 == $n ? '' : $args['format'], $args['base'] ); + $link = str_replace( '%_%', 1 === $n ? '' : $args['format'], $args['base'] ); $link = str_replace( '%#%', $n, $link ); if ( $add_args ) { $link = add_query_arg( $add_args, $link ); From aaf760cbdc5d1175b0a9adc9a2c9ca7beeeea068 Mon Sep 17 00:00:00 2001 From: Pascal Birchler <swissspidy@git.wordpress.org> Date: Wed, 15 Jan 2025 12:53:30 +0000 Subject: [PATCH 185/323] Undo accidental `svn:mergeinfo` property change in [59605]. See #61970. git-svn-id: https://develop.svn.wordpress.org/trunk@59607 602fd350-edb4-49c9-b593-d223f7449a82 From d2630e00cd6f2300bcd9f161051c255b1c60b3bb Mon Sep 17 00:00:00 2001 From: Felix Arntz <flixos90@git.wordpress.org> Date: Wed, 15 Jan 2025 18:34:35 +0000 Subject: [PATCH 186/323] REST API: Fix PHP warning about undefined `paged` argument in various REST API endpoints. This bug could occur in `WP_REST_Posts_Controller`, `WP_REST_Global_Styles_Revisions_Controller`, `WP_REST_Revisions_Controller`, and any of their child classes. This changeset fixes it throughout. Props apermo, pbearne, hemant-ahir, flixos90. Fixes #62292. git-svn-id: https://develop.svn.wordpress.org/trunk@59630 602fd350-edb4-49c9-b593-d223f7449a82 --- ...est-global-styles-revisions-controller.php | 2 +- .../class-wp-rest-posts-controller.php | 2 +- .../class-wp-rest-revisions-controller.php | 2 +- ...est-global-styles-revisions-controller.php | 41 +++++++++++++++++++ .../tests/rest-api/rest-posts-controller.php | 39 ++++++++++++++++++ .../rest-api/rest-revisions-controller.php | 40 ++++++++++++++++++ .../wpRestTemplateRevisionsController.php | 40 ++++++++++++++++++ 7 files changed, 163 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php index 54285fa560bee..4108f9711c8a7 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php @@ -189,7 +189,7 @@ public function get_items( $request ) { $revisions_query = new WP_Query(); $revisions = $revisions_query->query( $query_args ); $offset = isset( $query_args['offset'] ) ? (int) $query_args['offset'] : 0; - $page = (int) $query_args['paged']; + $page = isset( $query_args['paged'] ) ? (int) $query_args['paged'] : 0; $total_revisions = $revisions_query->found_posts; if ( $total_revisions < 1 ) { diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php index 95851199c6e4d..6f872be3dfd78 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php @@ -457,7 +457,7 @@ static function ( $format ) { remove_filter( 'post_password_required', array( $this, 'check_password_required' ) ); } - $page = (int) $query_args['paged']; + $page = isset( $query_args['paged'] ) ? (int) $query_args['paged'] : 0; $total_posts = $posts_query->found_posts; if ( $total_posts < 1 && $page > 1 ) { diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php index fb5fa29231a4f..1dbc611631b9b 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php @@ -294,7 +294,7 @@ public function get_items( $request ) { $revisions_query = new WP_Query(); $revisions = $revisions_query->query( $query_args ); $offset = isset( $query_args['offset'] ) ? (int) $query_args['offset'] : 0; - $page = (int) $query_args['paged']; + $page = isset( $query_args['paged'] ) ? (int) $query_args['paged'] : 0; $total_revisions = $revisions_query->found_posts; if ( $total_revisions < 1 ) { diff --git a/tests/phpunit/tests/rest-api/rest-global-styles-revisions-controller.php b/tests/phpunit/tests/rest-api/rest-global-styles-revisions-controller.php index b01ada9be28ff..5fd97a7a71abf 100644 --- a/tests/phpunit/tests/rest-api/rest-global-styles-revisions-controller.php +++ b/tests/phpunit/tests/rest-api/rest-global-styles-revisions-controller.php @@ -826,6 +826,47 @@ public function test_get_items_out_of_bounds_page_should_not_error_if_offset() { $this->assertCount( $expected_count, $response->get_data() ); } + + /** + * Tests for the pagination. + * + * @ticket 62292 + * + * @covers WP_REST_Global_Styles_Controller::get_items + */ + public function test_get_global_styles_revisions_pagination() { + wp_set_current_user( self::$admin_id ); + + // Test offset + $request = new WP_REST_Request( 'GET', '/wp/v2/global-styles/' . self::$global_styles_id . '/revisions' ); + $request->set_param( 'offset', 1 ); + $request->set_param( 'per_page', 1 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertEquals( 200, $response->get_status() ); + $data = $response->get_data(); + $this->assertCount( 1, $data ); + $this->assertEquals( 3, $response->get_headers()['X-WP-Total'] ); + $this->assertEquals( 3, $response->get_headers()['X-WP-TotalPages'] ); + + // Test paged + $request = new WP_REST_Request( 'GET', '/wp/v2/global-styles/' . self::$global_styles_id . '/revisions' ); + $request->set_param( 'page', 2 ); + $request->set_param( 'per_page', 2 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertEquals( 200, $response->get_status() ); + $data = $response->get_data(); + $this->assertCount( 1, $data ); + $this->assertEquals( 3, $response->get_headers()['X-WP-Total'] ); + $this->assertEquals( 2, $response->get_headers()['X-WP-TotalPages'] ); + + // Test out of bounds + $request = new WP_REST_Request( 'GET', '/wp/v2/global-styles/' . self::$global_styles_id . '/revisions' ); + $request->set_param( 'page', 4 ); + $request->set_param( 'per_page', 6 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( 'rest_revision_invalid_page_number', $response, 400 ); + } + /** * @doesNotPerformAssertions */ diff --git a/tests/phpunit/tests/rest-api/rest-posts-controller.php b/tests/phpunit/tests/rest-api/rest-posts-controller.php index e2fd7139f3f54..a1b8de0474359 100644 --- a/tests/phpunit/tests/rest-api/rest-posts-controller.php +++ b/tests/phpunit/tests/rest-api/rest-posts-controller.php @@ -5676,6 +5676,45 @@ public function test_multiple_post_format_support() { $this->assertCount( 2, $response->get_data(), 'Two posts are expected to be returned' ); } + /** + * Tests for the pagination. + * + * @ticket 62292 + * + * @covers WP_REST_Posts_Controller::get_items + */ + public function test_get_posts_with_pagination() { + + // Test offset + $request = new WP_REST_Request( 'GET', '/wp/v2/posts' ); + $request->set_param( 'offset', 1 ); + $request->set_param( 'per_page', 1 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertEquals( 200, $response->get_status() ); + $data = $response->get_data(); + $this->assertCount( 1, $data ); + $this->assertEquals( 30, $response->get_headers()['X-WP-Total'] ); + $this->assertEquals( 30, $response->get_headers()['X-WP-TotalPages'] ); + + // Test paged + $request = new WP_REST_Request( 'GET', '/wp/v2/posts' ); + $request->set_param( 'page', 2 ); + $request->set_param( 'per_page', 2 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertEquals( 200, $response->get_status() ); + $data = $response->get_data(); + $this->assertCount( 2, $data ); + $this->assertEquals( 30, $response->get_headers()['X-WP-Total'] ); + $this->assertEquals( 15, $response->get_headers()['X-WP-TotalPages'] ); + + // Test out of bounds + $request = new WP_REST_Request( 'GET', '/wp/v2/posts' ); + $request->set_param( 'page', 4 ); + $request->set_param( 'per_page', 10 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( 'rest_post_invalid_page_number', $response, 400 ); + } + /** * Internal function used to disable an insert query which * will trigger a wpdb error for testing purposes. diff --git a/tests/phpunit/tests/rest-api/rest-revisions-controller.php b/tests/phpunit/tests/rest-api/rest-revisions-controller.php index d2650d31fa852..cdb886c4e47e6 100644 --- a/tests/phpunit/tests/rest-api/rest-revisions-controller.php +++ b/tests/phpunit/tests/rest-api/rest-revisions-controller.php @@ -864,4 +864,44 @@ public function test_get_items_out_of_bounds_page_should_not_error_if_offset() { $response = rest_get_server()->dispatch( $request ); $this->assertCount( $expected_count, $response->get_data() ); } + + /** + * Tests for the pagination. + * + * @ticket 62292 + * + * @covers WP_REST_Revisions_Controller::get_items + */ + public function test_get_template_revisions_pagination() { + wp_set_current_user( self::$editor_id ); + + // Test offset + $request = new WP_REST_Request( 'GET', '/wp/v2/posts/' . self::$post_id . '/revisions' ); + $request->set_param( 'offset', 1 ); + $request->set_param( 'per_page', 1 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertEquals( 200, $response->get_status() ); + $data = $response->get_data(); + $this->assertCount( 1, $data ); + $this->assertEquals( $this->total_revisions, $response->get_headers()['X-WP-Total'] ); + $this->assertEquals( $this->total_revisions, $response->get_headers()['X-WP-TotalPages'] ); + + // Test paged + $request = new WP_REST_Request( 'GET', '/wp/v2/posts/' . self::$post_id . '/revisions' ); + $request->set_param( 'page', 2 ); + $request->set_param( 'per_page', 2 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertEquals( 200, $response->get_status() ); + $data = $response->get_data(); + $this->assertCount( 1, $data ); + $this->assertEquals( $this->total_revisions, $response->get_headers()['X-WP-Total'] ); + $this->assertEquals( (int) ceil( $this->total_revisions / 2 ), $response->get_headers()['X-WP-TotalPages'] ); + + // Test out of bounds + $request = new WP_REST_Request( 'GET', '/wp/v2/posts/' . self::$post_id . '/revisions' ); + $request->set_param( 'page', $this->total_revisions + 1 ); + $request->set_param( 'per_page', 1 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( 'rest_revision_invalid_page_number', $response, 400 ); + } } diff --git a/tests/phpunit/tests/rest-api/wpRestTemplateRevisionsController.php b/tests/phpunit/tests/rest-api/wpRestTemplateRevisionsController.php index 2391a92478ede..23352879f3cfe 100644 --- a/tests/phpunit/tests/rest-api/wpRestTemplateRevisionsController.php +++ b/tests/phpunit/tests/rest-api/wpRestTemplateRevisionsController.php @@ -1065,4 +1065,44 @@ public function data_delete_item_not_found() { ), ); } + + /** + * Tests for the pagination. + * + * @ticket 62292 + * + * @covers WP_REST_Template_Revisions_Controller::get_items + */ + public function test_get_template_revisions_pagination() { + wp_set_current_user( self::$admin_id ); + + // Test offset + $request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions' ); + $request->set_param( 'offset', 1 ); + $request->set_param( 'per_page', 1 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertEquals( 200, $response->get_status() ); + $data = $response->get_data(); + $this->assertCount( 1, $data ); + $this->assertEquals( 4, $response->get_headers()['X-WP-Total'] ); + $this->assertEquals( 4, $response->get_headers()['X-WP-TotalPages'] ); + + // Test paged + $request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions' ); + $request->set_param( 'page', 2 ); + $request->set_param( 'per_page', 2 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertEquals( 200, $response->get_status() ); + $data = $response->get_data(); + $this->assertCount( 2, $data ); + $this->assertEquals( 4, $response->get_headers()['X-WP-Total'] ); + $this->assertEquals( 2, $response->get_headers()['X-WP-TotalPages'] ); + + // Test out of bounds + $request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions' ); + $request->set_param( 'page', 4 ); + $request->set_param( 'per_page', 6 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( 'rest_revision_invalid_page_number', $response, 400 ); + } } From 5b01d24d8c5f2cfa4b96349967a9759e52888d03 Mon Sep 17 00:00:00 2001 From: Peter Wilson <peterwilsoncc@git.wordpress.org> Date: Wed, 15 Jan 2025 22:11:15 +0000 Subject: [PATCH 187/323] Options/Meta APIs: Optimize cache hits for non-existent options. Optimize the order of checking the various options caches in `get_option()` to prevent hitting external caches each time it is called for a known non-existent option. The caches are checked in the following order when getting an option: 1. Check the `alloptions` cache first to prioritize existing loaded options. 2. Check the `notoptions` cache before a cache lookup or DB hit. 3. Check the `options` cache prior to a DB hit. Follow up to [56595]. Props adamsilverstein, flixos90, ivankristianto, joemcgill, rmccue, siliconforks, spacedmonkey. Fixes #62692. See #58277. git-svn-id: https://develop.svn.wordpress.org/trunk@59631 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/option.php | 59 ++++++++------ tests/phpunit/tests/option/option.php | 111 ++++++++++++++++++++------ 2 files changed, 122 insertions(+), 48 deletions(-) diff --git a/src/wp-includes/option.php b/src/wp-includes/option.php index c84f1660f931b..4b26504b76356 100644 --- a/src/wp-includes/option.php +++ b/src/wp-includes/option.php @@ -162,37 +162,46 @@ function get_option( $option, $default_value = false ) { if ( ! wp_installing() ) { $alloptions = wp_load_alloptions(); - + /* + * When getting an option value, we check in the following order for performance: + * + * 1. Check the 'alloptions' cache first to prioritize existing loaded options. + * 2. Check the 'notoptions' cache before a cache lookup or DB hit. + * 3. Check the 'options' cache prior to a DB hit. + * 4. Check the DB for the option and cache it in either the 'options' or 'notoptions' cache. + */ if ( isset( $alloptions[ $option ] ) ) { $value = $alloptions[ $option ]; } else { + // Check for non-existent options first to avoid unnecessary object cache lookups and DB hits. + $notoptions = wp_cache_get( 'notoptions', 'options' ); + + if ( ! is_array( $notoptions ) ) { + $notoptions = array(); + wp_cache_set( 'notoptions', $notoptions, 'options' ); + } + + if ( isset( $notoptions[ $option ] ) ) { + /** + * Filters the default value for an option. + * + * The dynamic portion of the hook name, `$option`, refers to the option name. + * + * @since 3.4.0 + * @since 4.4.0 The `$option` parameter was added. + * @since 4.7.0 The `$passed_default` parameter was added to distinguish between a `false` value and the default parameter value. + * + * @param mixed $default_value The default value to return if the option does not exist + * in the database. + * @param string $option Option name. + * @param bool $passed_default Was `get_option()` passed a default value? + */ + return apply_filters( "default_option_{$option}", $default_value, $option, $passed_default ); + } + $value = wp_cache_get( $option, 'options' ); if ( false === $value ) { - // Prevent non-existent options from triggering multiple queries. - $notoptions = wp_cache_get( 'notoptions', 'options' ); - - // Prevent non-existent `notoptions` key from triggering multiple key lookups. - if ( ! is_array( $notoptions ) ) { - $notoptions = array(); - wp_cache_set( 'notoptions', $notoptions, 'options' ); - } elseif ( isset( $notoptions[ $option ] ) ) { - /** - * Filters the default value for an option. - * - * The dynamic portion of the hook name, `$option`, refers to the option name. - * - * @since 3.4.0 - * @since 4.4.0 The `$option` parameter was added. - * @since 4.7.0 The `$passed_default` parameter was added to distinguish between a `false` value and the default parameter value. - * - * @param mixed $default_value The default value to return if the option does not exist - * in the database. - * @param string $option Option name. - * @param bool $passed_default Was `get_option()` passed a default value? - */ - return apply_filters( "default_option_{$option}", $default_value, $option, $passed_default ); - } $row = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) ); diff --git a/tests/phpunit/tests/option/option.php b/tests/phpunit/tests/option/option.php index 36a40d9a2f495..9a2f061aa369c 100644 --- a/tests/phpunit/tests/option/option.php +++ b/tests/phpunit/tests/option/option.php @@ -112,8 +112,8 @@ public function test_get_option_notoptions_cache() { wp_cache_set( 'notoptions', $notoptions, 'options' ); $before = get_num_queries(); - $value = get_option( 'invalid' ); - $after = get_num_queries(); + get_option( 'invalid' ); + $after = get_num_queries(); $this->assertSame( 0, $after - $before ); } @@ -127,8 +127,8 @@ public function test_get_option_notoptions_set_cache() { get_option( 'invalid' ); $before = get_num_queries(); - $value = get_option( 'invalid' ); - $after = get_num_queries(); + get_option( 'invalid' ); + $after = get_num_queries(); $notoptions = wp_cache_get( 'notoptions', 'options' ); @@ -137,25 +137,6 @@ public function test_get_option_notoptions_set_cache() { $this->assertArrayHasKey( 'invalid', $notoptions, 'The "invalid" option should be in the notoptions cache.' ); } - /** - * @ticket 58277 - * - * @covers ::get_option - */ - public function test_get_option_notoptions_do_not_load_cache() { - add_option( 'foo', 'bar', '', false ); - wp_cache_delete( 'notoptions', 'options' ); - - $before = get_num_queries(); - $value = get_option( 'foo' ); - $after = get_num_queries(); - - $notoptions = wp_cache_get( 'notoptions', 'options' ); - - $this->assertSame( 0, $after - $before, 'The options cache was not hit on the second call to `get_option()`.' ); - $this->assertFalse( $notoptions, 'The notoptions cache should not be set.' ); - } - /** * @covers ::get_option * @covers ::add_option @@ -548,4 +529,88 @@ public function test_add_option_clears_the_notoptions_cache() { $updated_notoptions = wp_cache_get( 'notoptions', 'options' ); $this->assertArrayNotHasKey( $option_name, $updated_notoptions, 'The "foobar" option should not be in the notoptions cache after adding it.' ); } + + /** + * Test that get_option() does not hit the external cache multiple times for the same option. + * + * @ticket 62692 + * + * @covers ::get_option + * + * @dataProvider data_get_option_does_not_hit_the_external_cache_multiple_times_for_the_same_option + * + * @param int $expected_connections Expected number of connections to the memcached server. + * @param bool $option_exists Whether the option should be set. Default true. + * @param string $autoload Whether the option should be auto loaded. Default true. + */ + public function test_get_option_does_not_hit_the_external_cache_multiple_times_for_the_same_option( $expected_connections, $option_exists = true, $autoload = true ) { + if ( ! wp_using_ext_object_cache() ) { + $this->markTestSkipped( 'This test requires an external object cache.' ); + } + + if ( false === $this->helper_object_cache_stats_cmd_get() ) { + $this->markTestSkipped( 'This test requires access to the number of get requests to the external object cache.' ); + } + + if ( $option_exists ) { + add_option( 'ticket-62692', 'value', '', $autoload ); + } + + wp_cache_delete_multiple( array( 'ticket-62692', 'notoptions', 'alloptions' ), 'options' ); + + $connections_start = $this->helper_object_cache_stats_cmd_get(); + + $call_getter = 10; + while ( $call_getter-- ) { + get_option( 'ticket-62692' ); + } + + $connections_end = $this->helper_object_cache_stats_cmd_get(); + + $this->assertSame( $expected_connections, $connections_end - $connections_start ); + } + + /** + * Data provider. + * + * @return array[] + */ + public function data_get_option_does_not_hit_the_external_cache_multiple_times_for_the_same_option() { + return array( + 'exists, autoload' => array( 1, true, true ), + 'exists, not autoloaded' => array( 3, true, false ), + 'does not exist' => array( 3, false ), + ); + } + + /** + * Helper function to get the number of get commands from the external object cache. + * + * @return int|false Number of get command calls, false if unavailable. + */ + public function helper_object_cache_stats_cmd_get() { + if ( ! wp_using_ext_object_cache() || ! function_exists( 'wp_cache_get_stats' ) ) { + return false; + } + + $stats = wp_cache_get_stats(); + + // Check the shape of the stats. + if ( ! is_array( $stats ) ) { + return false; + } + + // Get the first server's stats. + $stats = array_shift( $stats ); + + if ( ! is_array( $stats ) ) { + return false; + } + + if ( ! array_key_exists( 'cmd_get', $stats ) ) { + return false; + } + + return $stats['cmd_get']; + } } From 8aea1ba5eee51bfef59beb0ba976333690bb0c89 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Thu, 16 Jan 2025 12:02:24 +0000 Subject: [PATCH 188/323] Coding Standards: Use strict comparison in `wp_xmlrpc_server::_multisite_getUsersBlogs()`. Follow-up to [https://mu.trac.wordpress.org/changeset/1218 mu:1218], [12852]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59632 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-xmlrpc-server.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index 2141f21e59662..527bf23966be2 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -4883,7 +4883,7 @@ protected function _multisite_getUsersBlogs( $args ) { return $blogs; } - if ( $_SERVER['HTTP_HOST'] == $domain && $_SERVER['REQUEST_URI'] == $path ) { + if ( $_SERVER['HTTP_HOST'] === $domain && $_SERVER['REQUEST_URI'] === $path ) { return $blogs; } else { foreach ( (array) $blogs as $blog ) { From 964c5d3857957045f892cf646750dcb3a66ca441 Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Thu, 16 Jan 2025 15:33:31 +0000 Subject: [PATCH 189/323] Users: Retain the current session when a user changes their password. Prior to this change a new session was unnecessarily created when a user changed their own password. Existing authentication cookies for the user will still be invalidated regardless of whether they share the same session token because session cookie keys contain a substring of the password hash. Props snicco, narenin, johnbillion Fixes #61366 git-svn-id: https://develop.svn.wordpress.org/trunk@59633 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/user.php | 11 ++++-- tests/phpunit/tests/user.php | 72 ++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/user.php b/src/wp-includes/user.php index 6222e932a9015..635f82c5ed353 100644 --- a/src/wp-includes/user.php +++ b/src/wp-includes/user.php @@ -2780,8 +2780,6 @@ function wp_update_user( $userdata ) { $current_user = wp_get_current_user(); if ( $current_user->ID === $user_id ) { if ( isset( $plaintext_pass ) ) { - wp_clear_auth_cookie(); - /* * Here we calculate the expiration length of the current auth cookie and compare it to the default expiration. * If it's greater than this, then we know the user checked 'Remember Me' when they logged in. @@ -2790,13 +2788,20 @@ function wp_update_user( $userdata ) { /** This filter is documented in wp-includes/pluggable.php */ $default_cookie_life = apply_filters( 'auth_cookie_expiration', ( 2 * DAY_IN_SECONDS ), $user_id, false ); + wp_clear_auth_cookie(); + $remember = false; + $token = ''; + + if ( false !== $logged_in_cookie ) { + $token = $logged_in_cookie['token']; + } if ( false !== $logged_in_cookie && ( (int) $logged_in_cookie['expiration'] - time() ) > $default_cookie_life ) { $remember = true; } - wp_set_auth_cookie( $user_id, $remember ); + wp_set_auth_cookie( $user_id, $remember, '', $token ); } } diff --git a/tests/phpunit/tests/user.php b/tests/phpunit/tests/user.php index 884200530f1d9..9e1faa2dca3f0 100644 --- a/tests/phpunit/tests/user.php +++ b/tests/phpunit/tests/user.php @@ -63,9 +63,37 @@ public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) { public function set_up() { parent::set_up(); + add_action( 'set_auth_cookie', array( $this, 'action_set_auth_cookie' ), 10, 6 ); + add_action( 'set_logged_in_cookie', array( $this, 'action_set_logged_in_cookie' ), 10 ); + add_action( 'clear_auth_cookie', array( $this, 'action_clear_auth_cookie' ) ); + + $_COOKIE = array(); + $this->author = clone self::$_author; } + final public function action_set_auth_cookie( + string $cookie, + int $expire, + int $expiration, + int $user_id, + string $scheme, + string $token + ): void { + $_COOKIE[ SECURE_AUTH_COOKIE ] = $cookie; + $_COOKIE[ AUTH_COOKIE ] = $cookie; + } + + final public function action_set_logged_in_cookie( string $cookie ): void { + $_COOKIE[ LOGGED_IN_COOKIE ] = $cookie; + } + + final public function action_clear_auth_cookie(): void { + unset( $_COOKIE[ LOGGED_IN_COOKIE ] ); + unset( $_COOKIE[ SECURE_AUTH_COOKIE ] ); + unset( $_COOKIE[ AUTH_COOKIE ] ); + } + public function test_get_users_of_blog() { // Add one of each user role. $nusers = array( @@ -1122,6 +1150,50 @@ public function test_changing_password_invalidates_password_reset_key() { $this->assertEmpty( $user->user_activation_key ); } + /** + * @ticket 61366 + * @dataProvider data_remember_user + */ + public function test_changing_own_password_retains_current_session( bool $remember ) { + $user = $this->author; + $manager = WP_Session_Tokens::get_instance( $user->ID ); + $expiry = $remember ? ( 2 * WEEK_IN_SECONDS ) : ( 2 * DAY_IN_SECONDS ); + $token = $manager->create( time() + $expiry ); + $pass = $user->user_pass; + + wp_set_current_user( $user->ID ); + wp_set_auth_cookie( $user->ID, $remember, '', $token ); + + $cookie = $_COOKIE[ AUTH_COOKIE ]; + $userdata = array( + 'ID' => $user->ID, + 'user_pass' => 'my_new_password', + ); + $updated = wp_update_user( $userdata, $manager ); + $parsed = wp_parse_auth_cookie(); + + // Check the prerequisites: + $this->assertNotWPError( $updated ); + $this->assertNotSame( $pass, get_userdata( $user->ID )->user_pass ); + + // Check the session token: + $this->assertSame( $token, $parsed['token'] ); + $this->assertCount( 1, $manager->get_all() ); + + // Check that the newly set auth cookie is valid: + $this->assertSame( $user->ID, wp_validate_auth_cookie() ); + + // Check that, despite the session token reuse, the old auth cookie should now be invalid because the password changed: + $this->assertFalse( wp_validate_auth_cookie( $cookie ) ); + } + + public function data_remember_user() { + return array( + array( true ), + array( false ), + ); + } + public function test_search_users_login() { $users = get_users( array( From e114dfb79cab98a0446ef96dc96f2646ab7a3a24 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Thu, 16 Jan 2025 16:16:15 +0000 Subject: [PATCH 190/323] Upload: Remove redundant check for `ABSPATH` in `wp-admin/async-upload.php`. This aims to bring consistency with a similar fragment in other files, since relocating `wp-admin` or `wp-load.php` is not supported at this time. Follow-up to [6659], [7971], [8315]. Props hussain896, swissspidy, knutsp, SergeyBiryukov. Fixes #62809. git-svn-id: https://develop.svn.wordpress.org/trunk@59634 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/admin-post.php | 7 ++----- src/wp-admin/admin.php | 1 + src/wp-admin/async-upload.php | 7 ++----- src/wp-includes/ms-files.php | 2 ++ 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/wp-admin/admin-post.php b/src/wp-admin/admin-post.php index be32e0710ac92..f880c41ac26a0 100644 --- a/src/wp-admin/admin-post.php +++ b/src/wp-admin/admin-post.php @@ -13,11 +13,8 @@ define( 'WP_ADMIN', true ); } -if ( defined( 'ABSPATH' ) ) { - require_once ABSPATH . 'wp-load.php'; -} else { - require_once dirname( __DIR__ ) . '/wp-load.php'; -} +/** Load WordPress Bootstrap */ +require_once dirname( __DIR__ ) . '/wp-load.php'; /** Allow for cross-domain requests (from the front end). */ send_origin_headers(); diff --git a/src/wp-admin/admin.php b/src/wp-admin/admin.php index 630765f77d03a..dac51ba1aa21e 100644 --- a/src/wp-admin/admin.php +++ b/src/wp-admin/admin.php @@ -31,6 +31,7 @@ define( 'WP_LOAD_IMPORTERS', true ); } +/** Load WordPress Bootstrap */ require_once dirname( __DIR__ ) . '/wp-load.php'; nocache_headers(); diff --git a/src/wp-admin/async-upload.php b/src/wp-admin/async-upload.php index a146f6a48a71b..683fd83248fd0 100644 --- a/src/wp-admin/async-upload.php +++ b/src/wp-admin/async-upload.php @@ -14,11 +14,8 @@ define( 'WP_ADMIN', true ); } -if ( defined( 'ABSPATH' ) ) { - require_once ABSPATH . 'wp-load.php'; -} else { - require_once dirname( __DIR__ ) . '/wp-load.php'; -} +/** Load WordPress Bootstrap */ +require_once dirname( __DIR__ ) . '/wp-load.php'; require_once ABSPATH . 'wp-admin/admin.php'; diff --git a/src/wp-includes/ms-files.php b/src/wp-includes/ms-files.php index 2efe452faf37e..42826ede61c6f 100644 --- a/src/wp-includes/ms-files.php +++ b/src/wp-includes/ms-files.php @@ -10,6 +10,8 @@ define( 'MS_FILES_REQUEST', true ); define( 'SHORTINIT', true ); + +/** Load WordPress Bootstrap */ require_once dirname( __DIR__ ) . '/wp-load.php'; if ( ! is_multisite() ) { From fc9aabbc898c359bdf169411e6f0b0b37a2b1607 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Thu, 16 Jan 2025 20:19:28 +0000 Subject: [PATCH 191/323] Build/Test Tools: Add input for disabling AppArmor. Old branches requiring outdated versions of Chromium to run JavaScript tests have recently started failing as a result of the `ubuntu-latest` container being updated to point to `ubuntu-24`. This introduces a new input to the reusable JavaScript testing workflow to allow a fix to be used without having to update Chromium or tests in these branches. Props swissspidy. See #62808. git-svn-id: https://develop.svn.wordpress.org/trunk@59635 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-javascript-tests.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.github/workflows/reusable-javascript-tests.yml b/.github/workflows/reusable-javascript-tests.yml index 842bb034352ed..e88f510cdfdf3 100644 --- a/.github/workflows/reusable-javascript-tests.yml +++ b/.github/workflows/reusable-javascript-tests.yml @@ -5,6 +5,12 @@ name: JavaScript tests on: workflow_call: + inputs: + disable-apparmor: + description: 'Whether to disable AppArmor.' + required: false + type: 'boolean' + default: false jobs: # Runs the QUnit test suite. @@ -44,6 +50,15 @@ jobs: - name: Install npm Dependencies run: npm ci + # Older branches using outdated versions of Puppeteer fail on newer versions of the `ubuntu-24` image. + # This disables AppArmor in order to work around those failures. + # + # See https://issues.chromium.org/issues/373753919 + # and https://chromium.googlesource.com/chromium/src/+/main/docs/security/apparmor-userns-restrictions.md + - name: Disable AppArmor + if: ${{ inputs.disable-apparmor }} + run: echo 0 | sudo tee /proc/sys/kernel/apparmor_restrict_unprivileged_userns + - name: Run QUnit tests run: npm run grunt qunit:compiled From ab4b4eb55d14feb74d34647c7aa4eb370dbd87a8 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Thu, 16 Jan 2025 21:03:12 +0000 Subject: [PATCH 192/323] Administration: Modernize admin color scheme SASS files. This updates the admin color scheme `.sass` files to address some deprecated notices caused by upstream changes. - `string` and `colors` are no longer globally available functions. - `@import` is deprecated in favor of `@use`. There are still a few notices that are output, however this will require an update to the `grunt-sass` package to resolve. Props MattyRob. Fixes #62323. git-svn-id: https://develop.svn.wordpress.org/trunk@59656 602fd350-edb4-49c9-b593-d223f7449a82 --- package-lock.json | 30 +- package.json | 2 +- src/wp-admin/css/colors/_admin.scss | 308 +++++++++--------- src/wp-admin/css/colors/_mixins.scss | 2 + src/wp-admin/css/colors/_variables.scss | 8 +- src/wp-admin/css/colors/blue/colors.scss | 24 +- src/wp-admin/css/colors/coffee/colors.scss | 16 +- src/wp-admin/css/colors/ectoplasm/colors.scss | 16 +- src/wp-admin/css/colors/light/colors.scss | 41 +-- src/wp-admin/css/colors/midnight/colors.scss | 10 +- src/wp-admin/css/colors/modern/colors.scss | 18 +- src/wp-admin/css/colors/ocean/colors.scss | 18 +- src/wp-admin/css/colors/sunrise/colors.scss | 12 +- 13 files changed, 266 insertions(+), 239 deletions(-) diff --git a/package-lock.json b/package-lock.json index ed9e1b4410f35..8175a44ff0880 100644 --- a/package-lock.json +++ b/package-lock.json @@ -144,7 +144,7 @@ "prettier": "npm:wp-prettier@2.6.2", "qunit": "~2.23.1", "react-refresh": "0.14.0", - "sass": "1.79.6", + "sass": "1.83.4", "sinon": "16.1.3", "sinon-test": "~3.1.6", "source-map-loader": "5.0.0", @@ -3727,6 +3727,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "optional": true, "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", @@ -4035,6 +4036,7 @@ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -4048,6 +4050,7 @@ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4061,6 +4064,7 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", + "optional": true, "engines": { "node": ">=0.12.0" } @@ -4071,6 +4075,7 @@ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -4085,6 +4090,7 @@ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { "is-number": "^7.0.0" }, @@ -14205,6 +14211,7 @@ "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", "dev": true, "license": "Apache-2.0", + "optional": true, "bin": { "detect-libc": "bin/detect-libc.js" }, @@ -20090,9 +20097,9 @@ "integrity": "sha512-jQ5Ql18hdCQ4qS+RCrbLfz1n+Pags27q5TwMKvZyhp5hh2UULUYZUy1keqj6k6SYsdqIYjnmz7xyyEY0V67B8Q==" }, "node_modules/immutable": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", - "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", "dev": true, "license": "MIT" }, @@ -26229,7 +26236,8 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true }, "node_modules/node-domexception": { "version": "1.0.0", @@ -30910,15 +30918,14 @@ } }, "node_modules/sass": { - "version": "1.79.6", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.6.tgz", - "integrity": "sha512-PVVjeeiUGx6Nj4PtEE/ecwu8ltwfPKzHxbbVmmLj4l1FYHhOyfA0scuVF8sVaa+b+VY4z7BVKjKq0cPUQdUU3g==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.4.tgz", + "integrity": "sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA==", "dev": true, "license": "MIT", "dependencies": { - "@parcel/watcher": "^2.4.1", "chokidar": "^4.0.0", - "immutable": "^4.0.0", + "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { @@ -30926,6 +30933,9 @@ }, "engines": { "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, "node_modules/sass-loader": { diff --git a/package.json b/package.json index fe2afcf572122..98e26ff06eaff 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "prettier": "npm:wp-prettier@2.6.2", "qunit": "~2.23.1", "react-refresh": "0.14.0", - "sass": "1.79.6", + "sass": "1.83.4", "sinon": "16.1.3", "sinon-test": "~3.1.6", "source-map-loader": "5.0.0", diff --git a/src/wp-admin/css/colors/_admin.scss b/src/wp-admin/css/colors/_admin.scss index 5431da789d9f0..49126269fb4c0 100644 --- a/src/wp-admin/css/colors/_admin.scss +++ b/src/wp-admin/css/colors/_admin.scss @@ -1,29 +1,31 @@ - -@import 'variables'; -@import 'mixins'; +@use 'sass:color'; +@use 'sass:string'; +@forward 'variables' show $scheme-name, $base-color, $body-background, $button-color, $custom-welcome-panel, $dashboard-accent-1, $dashboard-accent-2, $dashboard-icon-background, $form-checked, $highlight-color, $icon-color, $link, $link-focus, $low-contrast-theme, $menu-bubble-text, $menu-collapse-focus-icon, $menu-collapse-text, $menu-highlight-background, $menu-highlight-icon, $menu-highlight-text, $menu-submenu-text, $menu-submenu-focus-text, $menu-submenu-background, $notification-color, $text-color; +@use 'variables'; +@use 'mixins'; /** * This function name uses British English to maintain backward compatibility, as developers * may use the function in their own admin CSS files. See #56811. */ @function url-friendly-colour( $color ) { - @return '%23' + str-slice( '#{ $color }', 2, -1 ); + @return '%23' + string.slice( '#{ $color }', 2, -1 ); } body { - background: $body-background; + background: variables.$body-background; } /* Links */ a { - color: $link; + color: variables.$link; &:hover, &:active, &:focus { - color: $link-focus; + color: variables.$link-focus; } } @@ -36,12 +38,12 @@ span.wp-media-buttons-icon:before { } .wp-core-ui .button-link { - color: $link; + color: variables.$link; &:hover, &:active, &:focus { - color: $link-focus; + color: variables.$link-focus; } } @@ -66,16 +68,16 @@ span.wp-media-buttons-icon:before { /* Forms */ input[type=checkbox]:checked::before { - content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27#{url-friendly-colour($form-checked)}%27%2F%3E%3C%2Fsvg%3E"); + content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27#{url-friendly-colour(variables.$form-checked)}%27%2F%3E%3C%2Fsvg%3E"); } input[type=radio]:checked::before { - background: $form-checked; + background: variables.$form-checked; } .wp-core-ui input[type="reset"]:hover, .wp-core-ui input[type="reset"]:active { - color: $link-focus; + color: variables.$link-focus; } input[type="text"]:focus, @@ -97,8 +99,8 @@ input[type="checkbox"]:focus, input[type="radio"]:focus, select:focus, textarea:focus { - border-color: $highlight-color; - box-shadow: 0 0 0 1px $highlight-color; + border-color: variables.$highlight-color; + box-shadow: 0 0 0 1px variables.$highlight-color; } @@ -135,35 +137,35 @@ textarea:focus { .button.active, .button.active:focus, .button.active:hover { - border-color: $button-color; + border-color: variables.$button-color; color: color.adjust(#32373c, $lightness: -5%); - box-shadow: inset 0 2px 5px -3px $button-color; + box-shadow: inset 0 2px 5px -3px variables.$button-color; } .button.active:focus { box-shadow: 0 0 0 1px #32373c; } - @if ( $low-contrast-theme != "true" ) { + @if ( variables.$low-contrast-theme != "true" ) { .button, .button-secondary { - color: $highlight-color; - border-color: $highlight-color; + color: variables.$highlight-color; + border-color: variables.$highlight-color; } .button.hover, .button:hover, .button-secondary:hover{ - border-color: color.adjust($highlight-color, $lightness: -10%); - color: color.adjust($highlight-color, $lightness: -10%); + border-color: color.adjust(variables.$highlight-color, $lightness: -10%); + color: color.adjust(variables.$highlight-color, $lightness: -10%); } .button.focus, .button:focus, .button-secondary:focus { - border-color: color.adjust($highlight-color, $lightness: 10%); - color: color.adjust($highlight-color, $lightness: -20%); - box-shadow: 0 0 0 1px color.adjust($highlight-color, $lightness: 10%); + border-color: color.adjust(variables.$highlight-color, $lightness: 10%); + color: color.adjust(variables.$highlight-color, $lightness: -20%); + box-shadow: 0 0 0 1px color.adjust(variables.$highlight-color, $lightness: 10%); } .button-primary { @@ -174,74 +176,74 @@ textarea:focus { } .button-primary { - @include button( $button-color ); + @include mixins.button( variables.$button-color ); } .button-group > .button.active { - border-color: $button-color; + border-color: variables.$button-color; } .wp-ui-primary { - color: $text-color; - background-color: $base-color; + color: variables.$text-color; + background-color: variables.$base-color; } .wp-ui-text-primary { - color: $base-color; + color: variables.$base-color; } .wp-ui-highlight { - color: $menu-highlight-text; - background-color: $menu-highlight-background; + color: variables.$menu-highlight-text; + background-color: variables.$menu-highlight-background; } .wp-ui-text-highlight { - color: $menu-highlight-background; + color: variables.$menu-highlight-background; } .wp-ui-notification { - color: $menu-bubble-text; - background-color: $menu-bubble-background; + color: variables.$menu-bubble-text; + background-color: variables.$menu-bubble-background; } .wp-ui-text-notification { - color: $menu-bubble-background; + color: variables.$menu-bubble-background; } .wp-ui-text-icon { - color: $menu-icon; + color: variables.$menu-icon; } } /* List tables */ -@if $low-contrast-theme == "true" { +@if variables.$low-contrast-theme == "true" { .wrap .page-title-action:hover { - color: $menu-text; - background-color: $menu-background; + color: variables.$menu-text; + background-color: variables.$menu-background; } } @else { .wrap .page-title-action, .wrap .page-title-action:active { - border: 1px solid $highlight-color; - color: $highlight-color; + border: 1px solid variables.$highlight-color; + color: variables.$highlight-color; } .wrap .page-title-action:hover { - color: color.adjust($highlight-color, $lightness: -10%); - border-color: color.adjust($highlight-color, $lightness: -10%); + color: color.adjust(variables.$highlight-color, $lightness: -10%); + border-color: color.adjust(variables.$highlight-color, $lightness: -10%); } .wrap .page-title-action:focus { - border-color: color.adjust($highlight-color, $lightness: 10%); - color: color.adjust($highlight-color, $lightness: -20%); - box-shadow: 0 0 0 1px color.adjust($highlight-color, $lightness: 10%); + border-color: color.adjust(variables.$highlight-color, $lightness: 10%); + color: color.adjust(variables.$highlight-color, $lightness: -20%); + box-shadow: 0 0 0 1px color.adjust(variables.$highlight-color, $lightness: 10%); } } .view-switch a.current:before { - color: $menu-background; + color: variables.$menu-background; } .view-switch a:hover:before { - color: $menu-bubble-background; + color: variables.$menu-bubble-background; } @@ -250,28 +252,28 @@ textarea:focus { #adminmenuback, #adminmenuwrap, #adminmenu { - background: $menu-background; + background: variables.$menu-background; } #adminmenu a { - color: $menu-text; + color: variables.$menu-text; } #adminmenu div.wp-menu-image:before { - color: $menu-icon; + color: variables.$menu-icon; } #adminmenu a:hover, #adminmenu li.menu-top:hover, #adminmenu li.opensub > a.menu-top, #adminmenu li > a.menu-top:focus { - color: $menu-highlight-text; - background-color: $menu-highlight-background; + color: variables.$menu-highlight-text; + background-color: variables.$menu-highlight-background; } #adminmenu li.menu-top:hover div.wp-menu-image:before, #adminmenu li.opensub > a.menu-top div.wp-menu-image:before { - color: $menu-highlight-icon; + color: variables.$menu-highlight-icon; } @@ -280,8 +282,8 @@ textarea:focus { .about-wrap .nav-tab-active, .nav-tab-active, .nav-tab-active:hover { - background-color: $body-background; - border-bottom-color: $body-background; + background-color: variables.$body-background; + border-bottom-color: variables.$body-background; } @@ -291,26 +293,26 @@ textarea:focus { #adminmenu .wp-has-current-submenu .wp-submenu, #adminmenu .wp-has-current-submenu.opensub .wp-submenu, #adminmenu a.wp-has-current-submenu:focus + .wp-submenu { - background: $menu-submenu-background; + background: variables.$menu-submenu-background; } #adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after, #adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after { - border-right-color: $menu-submenu-background; + border-right-color: variables.$menu-submenu-background; } #adminmenu .wp-submenu .wp-submenu-head { - color: $menu-submenu-text; + color: variables.$menu-submenu-text; } #adminmenu .wp-submenu a, #adminmenu .wp-has-current-submenu .wp-submenu a, #adminmenu a.wp-has-current-submenu:focus + .wp-submenu a, #adminmenu .wp-has-current-submenu.opensub .wp-submenu a { - color: $menu-submenu-text; + color: variables.$menu-submenu-text; &:focus, &:hover { - color: $menu-submenu-focus-text; + color: variables.$menu-submenu-focus-text; } } @@ -320,24 +322,24 @@ textarea:focus { #adminmenu .wp-submenu li.current a, #adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a, #adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a { - color: $menu-submenu-current-text; + color: variables.$menu-submenu-current-text; &:hover, &:focus { - color: $menu-submenu-focus-text; + color: variables.$menu-submenu-focus-text; } } ul#adminmenu a.wp-has-current-submenu:after, ul#adminmenu > li.current > a.current:after { - border-right-color: $body-background; + border-right-color: variables.$body-background; } #adminmenu li.current a.menu-top, #adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, #adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head, .folded #adminmenu li.current.menu-top { - color: $menu-current-text; - background: $menu-current-background; + color: variables.$menu-current-text; + background: variables.$menu-current-background; } #adminmenu li.wp-has-current-submenu div.wp-menu-image:before, @@ -348,7 +350,7 @@ ul#adminmenu > li.current > a.current:after { #adminmenu li:hover div.wp-menu-image:before, #adminmenu li a:focus div.wp-menu-image:before, #adminmenu li.opensub div.wp-menu-image:before { - color: $menu-current-icon; + color: variables.$menu-current-icon; } @@ -357,49 +359,49 @@ ul#adminmenu > li.current > a.current:after { #adminmenu .menu-counter, #adminmenu .awaiting-mod, #adminmenu .update-plugins { - color: $menu-bubble-text; - background: $menu-bubble-background; + color: variables.$menu-bubble-text; + background: variables.$menu-bubble-background; } #adminmenu li.current a .awaiting-mod, #adminmenu li a.wp-has-current-submenu .update-plugins, #adminmenu li:hover a .awaiting-mod, #adminmenu li.menu-top:hover > a .update-plugins { - color: $menu-bubble-current-text; - background: $menu-bubble-current-background; + color: variables.$menu-bubble-current-text; + background: variables.$menu-bubble-current-background; } /* Admin Menu: collapse button */ #collapse-button { - color: $menu-collapse-text; + color: variables.$menu-collapse-text; } #collapse-button:hover, #collapse-button:focus { - color: $menu-submenu-focus-text; + color: variables.$menu-submenu-focus-text; } /* Admin Bar */ #wpadminbar { - color: $menu-text; - background: $menu-background; + color: variables.$menu-text; + background: variables.$menu-background; } #wpadminbar .ab-item, #wpadminbar a.ab-item, #wpadminbar > #wp-toolbar span.ab-label, #wpadminbar > #wp-toolbar span.noticon { - color: $menu-text; + color: variables.$menu-text; } #wpadminbar .ab-icon, #wpadminbar .ab-icon:before, #wpadminbar .ab-item:before, #wpadminbar .ab-item:after { - color: $menu-icon; + color: variables.$menu-icon; } #wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, @@ -407,45 +409,45 @@ ul#adminmenu > li.current > a.current:after { #wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, #wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item, #wpadminbar .ab-top-menu > li.menupop.hover > .ab-item { - color: $menu-submenu-focus-text; - background: $menu-submenu-background; + color: variables.$menu-submenu-focus-text; + background: variables.$menu-submenu-background; } #wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, #wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label, #wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { - color: $menu-submenu-focus-text; + color: variables.$menu-submenu-focus-text; } #wpadminbar:not(.mobile) li:hover .ab-icon:before, #wpadminbar:not(.mobile) li:hover .ab-item:before, #wpadminbar:not(.mobile) li:hover .ab-item:after, #wpadminbar:not(.mobile) li:hover #adminbarsearch:before { - color: $menu-submenu-focus-text; + color: variables.$menu-submenu-focus-text; } /* Admin Bar: submenu */ #wpadminbar .menupop .ab-sub-wrapper { - background: $menu-submenu-background; + background: variables.$menu-submenu-background; } #wpadminbar .quicklinks .menupop ul.ab-sub-secondary, #wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { - background: $menu-submenu-background-alt; + background: variables.$menu-submenu-background-alt; } #wpadminbar .ab-submenu .ab-item, #wpadminbar .quicklinks .menupop ul li a, #wpadminbar .quicklinks .menupop.hover ul li a, #wpadminbar.nojs .quicklinks .menupop:hover ul li a { - color: $menu-submenu-text; + color: variables.$menu-submenu-text; } #wpadminbar .quicklinks li .blavatar, #wpadminbar .menupop .menupop > .ab-item:before { - color: $menu-icon; + color: variables.$menu-icon; } #wpadminbar .quicklinks .menupop ul li a:hover, @@ -466,7 +468,7 @@ ul#adminmenu > li.current > a.current:after { #wpadminbar li.hover .ab-item:before, #wpadminbar li:hover #adminbarsearch:before, #wpadminbar li #adminbarsearch.adminbar-focused:before { - color: $menu-submenu-focus-text; + color: variables.$menu-submenu-focus-text; } #wpadminbar .quicklinks li a:hover .blavatar, @@ -475,82 +477,82 @@ ul#adminmenu > li.current > a.current:after { #wpadminbar .menupop .menupop > .ab-item:hover:before, #wpadminbar.mobile .quicklinks .ab-icon:before, #wpadminbar.mobile .quicklinks .ab-item:before { - color: $menu-submenu-focus-text; + color: variables.$menu-submenu-focus-text; } #wpadminbar.mobile .quicklinks .hover .ab-icon:before, #wpadminbar.mobile .quicklinks .hover .ab-item:before { - color: $menu-icon; + color: variables.$menu-icon; } /* Admin Bar: search */ #wpadminbar #adminbarsearch:before { - color: $menu-icon; + color: variables.$menu-icon; } #wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { - color: $menu-text; - background: $adminbar-input-background; + color: variables.$menu-text; + background: variables.$adminbar-input-background; } /* Admin Bar: recovery mode */ #wpadminbar #wp-admin-bar-recovery-mode { - color: $adminbar-recovery-exit-text; - background-color: $adminbar-recovery-exit-background; + color: variables.$adminbar-recovery-exit-text; + background-color: variables.$adminbar-recovery-exit-background; } #wpadminbar #wp-admin-bar-recovery-mode .ab-item, #wpadminbar #wp-admin-bar-recovery-mode a.ab-item { - color: $adminbar-recovery-exit-text; + color: variables.$adminbar-recovery-exit-text; } #wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover >.ab-item, #wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus, #wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item, #wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus { - color: $adminbar-recovery-exit-text; - background-color: $adminbar-recovery-exit-background-alt; + color: variables.$adminbar-recovery-exit-text; + background-color: variables.$adminbar-recovery-exit-background-alt; } /* Admin Bar: my account */ #wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { - border-color: $adminbar-avatar-frame; - background-color: $adminbar-avatar-frame; + border-color: variables.$adminbar-avatar-frame; + background-color: variables.$adminbar-avatar-frame; } #wpadminbar #wp-admin-bar-user-info .display-name { - color: $menu-text; + color: variables.$menu-text; } #wpadminbar #wp-admin-bar-user-info a:hover .display-name { - color: $menu-submenu-focus-text; + color: variables.$menu-submenu-focus-text; } #wpadminbar #wp-admin-bar-user-info .username { - color: $menu-submenu-text; + color: variables.$menu-submenu-text; } /* Pointers */ .wp-pointer .wp-pointer-content h3 { - background-color: $highlight-color; - border-color: color.adjust($highlight-color, $lightness: -5%); + background-color: variables.$highlight-color; + border-color: color.adjust(variables.$highlight-color, $lightness: -5%); } .wp-pointer .wp-pointer-content h3:before { - color: $highlight-color; + color: variables.$highlight-color; } .wp-pointer.wp-pointer-top .wp-pointer-arrow, .wp-pointer.wp-pointer-top .wp-pointer-arrow-inner, .wp-pointer.wp-pointer-undefined .wp-pointer-arrow, .wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner { - border-bottom-color: $highlight-color; + border-bottom-color: variables.$highlight-color; } @@ -558,22 +560,22 @@ ul#adminmenu > li.current > a.current:after { .media-item .bar, .media-progress-bar div { - background-color: $highlight-color; + background-color: variables.$highlight-color; } .details.attachment { box-shadow: inset 0 0 0 3px #fff, - inset 0 0 0 7px $highlight-color; + inset 0 0 0 7px variables.$highlight-color; } .attachment.details .check { - background-color: $highlight-color; - box-shadow: 0 0 0 1px #fff, 0 0 0 2px $highlight-color; + background-color: variables.$highlight-color; + box-shadow: 0 0 0 1px #fff, 0 0 0 2px variables.$highlight-color; } .media-selection .attachment.selection.details .thumbnail { - box-shadow: 0 0 0 1px #fff, 0 0 0 3px $highlight-color; + box-shadow: 0 0 0 1px #fff, 0 0 0 3px variables.$highlight-color; } @@ -582,49 +584,49 @@ ul#adminmenu > li.current > a.current:after { .theme-browser .theme.active .theme-name, .theme-browser .theme.add-new-theme a:hover:after, .theme-browser .theme.add-new-theme a:focus:after { - background: $highlight-color; + background: variables.$highlight-color; } .theme-browser .theme.add-new-theme a:hover span:after, .theme-browser .theme.add-new-theme a:focus span:after { - color: $highlight-color; + color: variables.$highlight-color; } .theme-section.current, .theme-filter.current { - border-bottom-color: $menu-background; + border-bottom-color: variables.$menu-background; } body.more-filters-opened .more-filters { - color: $menu-text; - background-color: $menu-background; + color: variables.$menu-text; + background-color: variables.$menu-background; } body.more-filters-opened .more-filters:before { - color: $menu-text; + color: variables.$menu-text; } body.more-filters-opened .more-filters:hover, body.more-filters-opened .more-filters:focus { - background-color: $menu-highlight-background; - color: $menu-highlight-text; + background-color: variables.$menu-highlight-background; + color: variables.$menu-highlight-text; } body.more-filters-opened .more-filters:hover:before, body.more-filters-opened .more-filters:focus:before { - color: $menu-highlight-text; + color: variables.$menu-highlight-text; } /* Widgets */ .widgets-chooser li.widgets-chooser-selected { - background-color: $menu-highlight-background; - color: $menu-highlight-text; + background-color: variables.$menu-highlight-background; + color: variables.$menu-highlight-text; } .widgets-chooser li.widgets-chooser-selected:before, .widgets-chooser li.widgets-chooser-selected:focus:before { - color: $menu-highlight-text; + color: variables.$menu-highlight-text; } @@ -632,29 +634,29 @@ body.more-filters-opened .more-filters:focus:before { .nav-menus-php .item-edit:focus:before { box-shadow: - 0 0 0 1px color.adjust($button-color, $lightness: 10%), - 0 0 2px 1px $button-color; + 0 0 0 1px color.adjust(variables.$button-color, $lightness: 10%), + 0 0 2px 1px variables.$button-color; } /* Responsive Component */ div#wp-responsive-toggle a:before { - color: $menu-icon; + color: variables.$menu-icon; } .wp-responsive-open div#wp-responsive-toggle a { // ToDo: make inset border border-color: transparent; - background: $menu-highlight-background; + background: variables.$menu-highlight-background; } .wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a { - background: $menu-submenu-background; + background: variables.$menu-submenu-background; } .wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { - color: $menu-icon; + color: variables.$menu-icon; } /* TinyMCE */ @@ -664,7 +666,7 @@ div#wp-responsive-toggle a:before { .mce-container.mce-menu .mce-menu-item:focus, .mce-container.mce-menu .mce-menu-item-normal.mce-active, .mce-container.mce-menu .mce-menu-item-preview.mce-active { - background: $highlight-color; + background: variables.$highlight-color; } /* Customizer */ @@ -673,24 +675,24 @@ div#wp-responsive-toggle a:before { #customize-controls .control-section .accordion-section-title:hover, #customize-controls .control-section.open .accordion-section-title, #customize-controls .control-section .accordion-section-title:focus { - color: $link; - border-left-color: $button-color; + color: variables.$link; + border-left-color: variables.$button-color; } .customize-controls-close:focus, .customize-controls-close:hover, .customize-controls-preview-toggle:focus, .customize-controls-preview-toggle:hover { - color: $link; - border-top-color: $button-color; + color: variables.$link; + border-top-color: variables.$button-color; } .customize-panel-back:hover, .customize-panel-back:focus, .customize-section-back:hover, .customize-section-back:focus { - color: $link; - border-left-color: $button-color; + color: variables.$link; + border-left-color: variables.$button-color; } .customize-screen-options-toggle:hover, @@ -700,7 +702,7 @@ div#wp-responsive-toggle a:before { #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover, #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active, #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus { - color: $link; + color: variables.$link; } .customize-screen-options-toggle:focus:before, @@ -711,28 +713,28 @@ div#wp-responsive-toggle a:before { #customize-save-button-wrapper .save:focus, #publish-settings:focus { box-shadow: - 0 0 0 1px color.adjust($button-color, $lightness: 10%), - 0 0 2px 1px $button-color; + 0 0 0 1px color.adjust(variables.$button-color, $lightness: 10%), + 0 0 2px 1px variables.$button-color; } #customize-controls .customize-info.open .customize-help-toggle, #customize-controls .customize-info .customize-help-toggle:focus, #customize-controls .customize-info .customize-help-toggle:hover { - color: $link; + color: variables.$link; } .control-panel-themes .customize-themes-section-title:focus, .control-panel-themes .customize-themes-section-title:hover { - border-left-color: $button-color; - color: $link; + border-left-color: variables.$button-color; + color: variables.$link; } .control-panel-themes .theme-section .customize-themes-section-title.selected:after { - background: $button-color; + background: variables.$button-color; } .control-panel-themes .customize-themes-section-title.selected { - color: $link; + color: variables.$link; } #customize-theme-controls .control-section:hover > .accordion-section-title:after, @@ -743,37 +745,37 @@ div#wp-responsive-toggle a:before { #customize-outer-theme-controls .control-section .accordion-section-title:hover:after, #customize-outer-theme-controls .control-section.open .accordion-section-title:after, #customize-outer-theme-controls .control-section .accordion-section-title:focus:after { - color: $link; + color: variables.$link; } .customize-control .attachment-media-view .button-add-media:focus { background-color: #fbfbfc; - border-color: $button-color; + border-color: variables.$button-color; border-style: solid; - box-shadow: 0 0 0 1px $button-color; + box-shadow: 0 0 0 1px variables.$button-color; outline: 2px solid transparent; } .wp-full-overlay-footer .devices button:focus, .wp-full-overlay-footer .devices button.active:hover { - border-bottom-color: $button-color; + border-bottom-color: variables.$button-color; } .wp-full-overlay-footer .devices button:hover:before, .wp-full-overlay-footer .devices button:focus:before { - color: $button-color; + color: variables.$button-color; } .wp-full-overlay .collapse-sidebar:hover, .wp-full-overlay .collapse-sidebar:focus { - color: $button-color; + color: variables.$button-color; } .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow, .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow { box-shadow: - 0 0 0 1px color.adjust($button-color, $lightness: 10%), - 0 0 2px 1px $button-color; + 0 0 0 1px color.adjust(variables.$button-color, $lightness: 10%), + 0 0 2px 1px variables.$button-color; } &.wp-customizer .theme-overlay .theme-header .close:focus, @@ -782,7 +784,7 @@ div#wp-responsive-toggle a:before { &.wp-customizer .theme-overlay .theme-header .right:hover, &.wp-customizer .theme-overlay .theme-header .left:focus, &.wp-customizer .theme-overlay .theme-header .left:hover { - border-bottom-color: $button-color; - color: $link; + border-bottom-color: variables.$button-color; + color: variables.$link; } } diff --git a/src/wp-admin/css/colors/_mixins.scss b/src/wp-admin/css/colors/_mixins.scss index a84d7d58abcf3..d33cf3bb2d854 100644 --- a/src/wp-admin/css/colors/_mixins.scss +++ b/src/wp-admin/css/colors/_mixins.scss @@ -1,3 +1,5 @@ +@use 'sass:color'; + /* * Button mixin- creates a button effect with correct * highlights/shadows, based on a base color. diff --git a/src/wp-admin/css/colors/_variables.scss b/src/wp-admin/css/colors/_variables.scss index b16601657be02..8a073f830e4b6 100644 --- a/src/wp-admin/css/colors/_variables.scss +++ b/src/wp-admin/css/colors/_variables.scss @@ -1,3 +1,5 @@ +@use "sass:color"; + // assign default value to all undefined variables $scheme-name: "default" !default; @@ -37,7 +39,7 @@ $menu-current-text: $menu-highlight-text !default; $menu-current-icon: $menu-highlight-icon !default; $menu-current-background: $menu-highlight-background !default; -$menu-submenu-text: mix( $base-color, $text-color, 30% ) !default; +$menu-submenu-text: color.mix( $base-color, $text-color, 30% ) !default; $menu-submenu-background: color.adjust($base-color, $lightness: -7%) !default; $menu-submenu-background-alt: color.adjust(color.adjust($menu-background, $lightness: 7%), $saturation: -7%) !default; @@ -59,9 +61,9 @@ $adminbar-input-background: color.adjust($menu-background, $lightness: 7%) !defa $adminbar-recovery-exit-text: $menu-bubble-text !default; $adminbar-recovery-exit-background: $menu-bubble-background !default; -$adminbar-recovery-exit-background-alt: mix(black, $adminbar-recovery-exit-background, 10%) !default; +$adminbar-recovery-exit-background-alt: color.mix(black, $adminbar-recovery-exit-background, 10%) !default; -$menu-customizer-text: mix( $base-color, $text-color, 40% ) !default; +$menu-customizer-text: color.mix( $base-color, $text-color, 40% ) !default; // Dashboard Colors diff --git a/src/wp-admin/css/colors/blue/colors.scss b/src/wp-admin/css/colors/blue/colors.scss index 805338d0f0097..1fca84c12bbc3 100644 --- a/src/wp-admin/css/colors/blue/colors.scss +++ b/src/wp-admin/css/colors/blue/colors.scss @@ -1,16 +1,16 @@ -@use "sass:color"; - -$scheme-name: "blue"; -$base-color: #52accc; -$icon-color: #e5f8ff; $highlight-color: #096484; -$notification-color: #e1a948; -$button-color: #e1a948; -$menu-submenu-text: #e2ecf1; -$menu-submenu-focus-text: #fff; -$menu-submenu-background: #4796b3; +@use "../_admin.scss" with ( + $scheme-name: "blue", + $base-color: #52accc, + $icon-color: #e5f8ff, + $highlight-color: $highlight-color, + $notification-color: #e1a948, + $button-color: #e1a948, -$dashboard-icon-background: $highlight-color; + $menu-submenu-text: #e2ecf1, + $menu-submenu-focus-text: #fff, + $menu-submenu-background: #4796b3, -@import "../_admin.scss"; + $dashboard-icon-background: $highlight-color +); diff --git a/src/wp-admin/css/colors/coffee/colors.scss b/src/wp-admin/css/colors/coffee/colors.scss index ff6fb162bd960..80f846ae67195 100644 --- a/src/wp-admin/css/colors/coffee/colors.scss +++ b/src/wp-admin/css/colors/coffee/colors.scss @@ -1,11 +1,11 @@ -@use "sass:color"; - -$scheme-name: "coffee"; $base-color: #59524c; -$highlight-color: #c7a589; -$notification-color: #9ea476; -$low-contrast-theme: "true"; -$form-checked: $base-color; +@use "../_admin.scss" with ( + $scheme-name: "coffee", + $base-color: $base-color, + $highlight-color: #c7a589, + $notification-color: #9ea476, + $form-checked: $base-color, -@import "../_admin.scss"; + $low-contrast-theme: "true" +); diff --git a/src/wp-admin/css/colors/ectoplasm/colors.scss b/src/wp-admin/css/colors/ectoplasm/colors.scss index 9c54d7bfd0ae4..a38736a9a24d5 100644 --- a/src/wp-admin/css/colors/ectoplasm/colors.scss +++ b/src/wp-admin/css/colors/ectoplasm/colors.scss @@ -1,11 +1,11 @@ -@use "sass:color"; - -$scheme-name: "ectoplasm"; $base-color: #523f6d; -$icon-color: #ece6f6; -$highlight-color: #a3b745; -$notification-color: #d46f15; -$form-checked: $base-color; +@use "../_admin.scss" with ( + $scheme-name: "ectoplasm", + $base-color: $base-color, + $icon-color: #ece6f6, + $highlight-color: #a3b745, + $notification-color: #d46f15, -@import "../_admin.scss"; + $form-checked: $base-color, +); diff --git a/src/wp-admin/css/colors/light/colors.scss b/src/wp-admin/css/colors/light/colors.scss index 3dc2e67b04a9a..e9fde92e32a7b 100644 --- a/src/wp-admin/css/colors/light/colors.scss +++ b/src/wp-admin/css/colors/light/colors.scss @@ -1,33 +1,36 @@ @use "sass:color"; -$scheme-name: "light"; -$base-color: #e5e5e5; -$icon-color: #999; -$text-color: #333; $highlight-color: #04a4cc; -$notification-color: #d64e07; +$text-color: #333; +$menu-avatar-frame: #aaa; -$body-background: #f5f5f5; +@use "../_admin.scss" with ( + $scheme-name: "light", + $base-color: #e5e5e5, + $icon-color: #999, + $text-color: $text-color, + $highlight-color: $highlight-color, + $notification-color: #d64e07, -$menu-highlight-text: #fff; -$menu-highlight-icon: #ccc; -$menu-highlight-background: #888; + $body-background: #f5f5f5, -$menu-bubble-text: #fff; -$menu-avatar-frame: #aaa; -$menu-submenu-background: #fff; + $menu-highlight-text: #fff, + $menu-highlight-icon: #ccc, + $menu-highlight-background: #888, -$menu-collapse-text: #777; -$menu-collapse-focus-icon: #555; + $menu-bubble-text: #fff, + $menu-submenu-background: #fff, -$dashboard-accent-1: $highlight-color; -$dashboard-accent-2: color.adjust(color.adjust($highlight-color, $lightness: 7%), $saturation: -15%); -$dashboard-icon-background: $text-color; + $menu-collapse-text: #777, + $menu-collapse-focus-icon: #555, -@import "../_admin.scss"; + $dashboard-accent-1: $highlight-color, + $dashboard-accent-2: color.adjust(color.adjust($highlight-color, $lightness: 7%), $saturation: -15%), + $dashboard-icon-background: $text-color +); /* Override the theme filter highlight color for this scheme */ .theme-section.current, .theme-filter.current { - border-bottom-color: $highlight-color; + border-bottom-color: admin.$highlight-color; } diff --git a/src/wp-admin/css/colors/midnight/colors.scss b/src/wp-admin/css/colors/midnight/colors.scss index 529598ac5046e..21e9f2364020a 100644 --- a/src/wp-admin/css/colors/midnight/colors.scss +++ b/src/wp-admin/css/colors/midnight/colors.scss @@ -1,10 +1,14 @@ @use "sass:color"; -$scheme-name: "midnight"; $base-color: #363b3f; $highlight-color: #e14d43; $notification-color: #69a8bb; -$dashboard-accent-2: mix($base-color, $notification-color, 90%); +@use "../_admin.scss" with ( + $scheme-name: "midnight", + $base-color: $base-color, + $highlight-color: $highlight-color, + $notification-color: $notification-color, -@import "../_admin.scss"; + $dashboard-accent-2: color.mix($base-color, $notification-color, 90%), +); diff --git a/src/wp-admin/css/colors/modern/colors.scss b/src/wp-admin/css/colors/modern/colors.scss index a66855729fbd4..45c750c0f583a 100644 --- a/src/wp-admin/css/colors/modern/colors.scss +++ b/src/wp-admin/css/colors/modern/colors.scss @@ -1,14 +1,16 @@ @use "sass:color"; -$scheme-name: "modern"; -$base-color: #1e1e1e; $highlight-color: #3858e9; -$menu-submenu-focus-text: #7b90ff; -$notification-color: $highlight-color; -$link: $highlight-color; -$link-focus: color.adjust($highlight-color, $lightness: -10%); +@use "../_admin.scss" with ( + $scheme-name: "modern", + $base-color: #1e1e1e, + $highlight-color: #3858e9, + $menu-submenu-focus-text: #7b90ff, + $notification-color: $highlight-color, -$custom-welcome-panel: "false"; + $link: $highlight-color, + $link-focus: color.adjust($highlight-color, $lightness: -10%), -@import "../_admin.scss"; + $custom-welcome-panel: "false" +); diff --git a/src/wp-admin/css/colors/ocean/colors.scss b/src/wp-admin/css/colors/ocean/colors.scss index e9bd47689c36e..d0ad861c94524 100644 --- a/src/wp-admin/css/colors/ocean/colors.scss +++ b/src/wp-admin/css/colors/ocean/colors.scss @@ -1,12 +1,12 @@ -@use "sass:color"; - -$scheme-name: "ocean"; $base-color: #738e96; -$icon-color: #f2fcff; -$highlight-color: #9ebaa0; -$notification-color: #aa9d88; -$low-contrast-theme: "true"; -$form-checked: $base-color; +@use "../_admin.scss" with ( + $scheme-name: "ocean", + $base-color: $base-color, + $icon-color: #f2fcff, + $highlight-color: #9ebaa0, + $notification-color: #aa9d88, + $form-checked: $base-color, -@import "../_admin.scss"; + $low-contrast-theme: "true" +); diff --git a/src/wp-admin/css/colors/sunrise/colors.scss b/src/wp-admin/css/colors/sunrise/colors.scss index 4094eb26be1f3..146fd1196028b 100644 --- a/src/wp-admin/css/colors/sunrise/colors.scss +++ b/src/wp-admin/css/colors/sunrise/colors.scss @@ -1,9 +1,11 @@ @use "sass:color"; -$scheme-name: "sunrise"; -$base-color: #cf4944; $highlight-color: #dd823b; -$notification-color: #ccaf0b; -$menu-submenu-focus-text: color.adjust($highlight-color, $lightness: 35%); -@import "../_admin.scss"; +@use "../_admin.scss" with ( + $scheme-name: "sunrise", + $base-color: #cf4944, + $highlight-color: $highlight-color, + $notification-color: #ccaf0b, + $menu-submenu-focus-text: color.adjust($highlight-color, $lightness: 35%) +); From bc3fdb4648d850b03d9a2e12cffdbe43cd91741b Mon Sep 17 00:00:00 2001 From: Peter Wilson <peterwilsoncc@git.wordpress.org> Date: Fri, 17 Jan 2025 00:10:08 +0000 Subject: [PATCH 193/323] Options/Meta APIs: Document type juggling of meta data. Document that unserialised data types are stored as strings in the database and returned as such by the meta data functions. For example, setting meta data to the integer value `1` will be returned as `"1"` when subsequently queried via `get_metadata()` and the related functions. Props sukhendu2002, azaozz, jrf, rodrigosprimo. Fixes ticket:61950. git-svn-id: https://develop.svn.wordpress.org/trunk@59657 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/comment.php | 13 ++++++++++++- src/wp-includes/meta.php | 13 ++++++++++++- src/wp-includes/ms-site.php | 13 ++++++++++++- src/wp-includes/post.php | 13 ++++++++++++- src/wp-includes/taxonomy.php | 13 ++++++++++++- src/wp-includes/user.php | 13 ++++++++++++- 6 files changed, 72 insertions(+), 6 deletions(-) diff --git a/src/wp-includes/comment.php b/src/wp-includes/comment.php index 2762b77593308..00bda2615d930 100644 --- a/src/wp-includes/comment.php +++ b/src/wp-includes/comment.php @@ -432,7 +432,13 @@ function get_comment_count( $post_id = 0 ) { * * @param int $comment_id Comment ID. * @param string $meta_key Metadata name. - * @param mixed $meta_value Metadata value. Must be serializable if non-scalar. + * @param mixed $meta_value Metadata value. Arrays and objects are stored as serialized data and + * will be returned as the same type when retrieved. Other data types will + * be stored as strings in the database: + * - false is stored and retrieved as an empty string ('') + * - true is stored and retrieved as '1' + * - numbers (both integer and float) are stored and retrieved as strings + * Must be serializable if non-scalar. * @param bool $unique Optional. Whether the same key should not be added. * Default false. * @return int|false Meta ID on success, false on failure. @@ -481,6 +487,11 @@ function delete_comment_meta( $comment_id, $meta_key, $meta_value = '' ) { * False for an invalid `$comment_id` (non-numeric, zero, or negative value). * An empty array if a valid but non-existing comment ID is passed and `$single` is false. * An empty string if a valid but non-existing comment ID is passed and `$single` is true. + * Note: Non-serialized values are returned as strings: + * - false values are returned as empty strings ('') + * - true values are returned as '1' + * - numbers are returned as strings + * Arrays and objects retain their original type. */ function get_comment_meta( $comment_id, $key = '', $single = false ) { return get_metadata( 'comment', $comment_id, $key, $single ); diff --git a/src/wp-includes/meta.php b/src/wp-includes/meta.php index 6f6dd928e0498..4d8c49bfd11dd 100644 --- a/src/wp-includes/meta.php +++ b/src/wp-includes/meta.php @@ -23,7 +23,13 @@ * or any other object type with an associated meta table. * @param int $object_id ID of the object metadata is for. * @param string $meta_key Metadata key. - * @param mixed $meta_value Metadata value. Must be serializable if non-scalar. + * @param mixed $meta_value Metadata value. Arrays and objects are stored as serialized data and + * will be returned as the same type when retrieved. Other data types will + * be stored as strings in the database: + * - false is stored and retrieved as an empty string ('') + * - true is stored and retrieved as '1' + * - numbers (both integer and float) are stored and retrieved as strings + * Must be serializable if non-scalar. * @param bool $unique Optional. Whether the specified metadata key should be unique for the object. * If true, and the object already has a value for the specified metadata key, * no change will be made. Default false. @@ -570,6 +576,11 @@ function delete_metadata( $meta_type, $object_id, $meta_key, $meta_value = '', $ * or if `$meta_type` is not specified. * An empty array if a valid but non-existing object ID is passed and `$single` is false. * An empty string if a valid but non-existing object ID is passed and `$single` is true. + * Note: Non-serialized values are returned as strings: + * - false values are returned as empty strings ('') + * - true values are returned as '1' + * - numbers (both integer and float) are returned as strings + * Arrays and objects retain their original type. */ function get_metadata( $meta_type, $object_id, $meta_key = '', $single = false ) { $value = get_metadata_raw( $meta_type, $object_id, $meta_key, $single ); diff --git a/src/wp-includes/ms-site.php b/src/wp-includes/ms-site.php index b1d50940a245b..2a2b1474c5d61 100644 --- a/src/wp-includes/ms-site.php +++ b/src/wp-includes/ms-site.php @@ -1026,7 +1026,13 @@ function clean_blog_cache( $blog ) { * * @param int $site_id Site ID. * @param string $meta_key Metadata name. - * @param mixed $meta_value Metadata value. Must be serializable if non-scalar. + * @param mixed $meta_value Metadata value. Arrays and objects are stored as serialized data and + * will be returned as the same type when retrieved. Other data types will + * be stored as strings in the database: + * - false is stored and retrieved as an empty string ('') + * - true is stored and retrieved as '1' + * - numbers (both integer and float) are stored and retrieved as strings + * Must be serializable if non-scalar. * @param bool $unique Optional. Whether the same key should not be added. * Default false. * @return int|false Meta ID on success, false on failure. @@ -1071,6 +1077,11 @@ function delete_site_meta( $site_id, $meta_key, $meta_value = '' ) { * False for an invalid `$site_id` (non-numeric, zero, or negative value). * An empty array if a valid but non-existing site ID is passed and `$single` is false. * An empty string if a valid but non-existing site ID is passed and `$single` is true. + * Note: Non-serialized values are returned as strings: + * - false values are returned as empty strings ('') + * - true values are returned as '1' + * - numbers (both integer and float) are returned as strings + * Arrays and objects retain their original type. */ function get_site_meta( $site_id, $key = '', $single = false ) { return get_metadata( 'blog', $site_id, $key, $single ); diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index 98b9092f16f1f..009287916d7bb 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -2558,7 +2558,13 @@ function get_posts( $args = null ) { * * @param int $post_id Post ID. * @param string $meta_key Metadata name. - * @param mixed $meta_value Metadata value. Must be serializable if non-scalar. + * @param mixed $meta_value Metadata value. Arrays and objects are stored as serialized data and + * will be returned as the same type when retrieved. Other data types will + * be stored as strings in the database: + * - false is stored and retrieved as an empty string ('') + * - true is stored and retrieved as '1' + * - numbers (both integer and float) are stored and retrieved as strings + * Must be serializable if non-scalar. * @param bool $unique Optional. Whether the same key should not be added. * Default false. * @return int|false Meta ID on success, false on failure. @@ -2615,6 +2621,11 @@ function delete_post_meta( $post_id, $meta_key, $meta_value = '' ) { * False for an invalid `$post_id` (non-numeric, zero, or negative value). * An empty array if a valid but non-existing post ID is passed and `$single` is false. * An empty string if a valid but non-existing post ID is passed and `$single` is true. + * Note: Non-serialized values are returned as strings: + * - false values are returned as empty strings ('') + * - true values are returned as '1' + * - numbers (both integer and float) are returned as strings + * Arrays and objects retain their original type. */ function get_post_meta( $post_id, $key = '', $single = false ) { return get_metadata( 'post', $post_id, $key, $single ); diff --git a/src/wp-includes/taxonomy.php b/src/wp-includes/taxonomy.php index bebf55ec79bfa..1af1b5a76b70d 100644 --- a/src/wp-includes/taxonomy.php +++ b/src/wp-includes/taxonomy.php @@ -1386,7 +1386,13 @@ function get_terms( $args = array(), $deprecated = '' ) { * * @param int $term_id Term ID. * @param string $meta_key Metadata name. - * @param mixed $meta_value Metadata value. Must be serializable if non-scalar. + * @param mixed $meta_value Metadata value. Arrays and objects are stored as serialized data and + * will be returned as the same type when retrieved. Other data types will + * be stored as strings in the database: + * - false is stored and retrieved as an empty string ('') + * - true is stored and retrieved as '1' + * - numbers (both integer and float) are stored and retrieved as strings + * Must be serializable if non-scalar. * @param bool $unique Optional. Whether the same key should not be added. * Default false. * @return int|false|WP_Error Meta ID on success, false on failure. @@ -1432,6 +1438,11 @@ function delete_term_meta( $term_id, $meta_key, $meta_value = '' ) { * False for an invalid `$term_id` (non-numeric, zero, or negative value). * An empty array if a valid but non-existing term ID is passed and `$single` is false. * An empty string if a valid but non-existing term ID is passed and `$single` is true. + * Note: Non-serialized values are returned as strings: + * - false values are returned as empty strings ('') + * - true values are returned as '1' + * - numbers are returned as strings + * Arrays and objects retain their original type. */ function get_term_meta( $term_id, $key = '', $single = false ) { return get_metadata( 'term', $term_id, $key, $single ); diff --git a/src/wp-includes/user.php b/src/wp-includes/user.php index 635f82c5ed353..e4e6f5b652744 100644 --- a/src/wp-includes/user.php +++ b/src/wp-includes/user.php @@ -1151,7 +1151,13 @@ function is_user_member_of_blog( $user_id = 0, $blog_id = 0 ) { * * @param int $user_id User ID. * @param string $meta_key Metadata name. - * @param mixed $meta_value Metadata value. Must be serializable if non-scalar. + * @param mixed $meta_value Metadata value. Arrays and objects are stored as serialized data and + * will be returned as the same type when retrieved. Other data types will + * be stored as strings in the database: + * - false is stored and retrieved as an empty string ('') + * - true is stored and retrieved as '1' + * - numbers (both integer and float) are stored and retrieved as strings + * Must be serializable if non-scalar. * @param bool $unique Optional. Whether the same key should not be added. * Default false. * @return int|false Meta ID on success, false on failure. @@ -1200,6 +1206,11 @@ function delete_user_meta( $user_id, $meta_key, $meta_value = '' ) { * False for an invalid `$user_id` (non-numeric, zero, or negative value). * An empty array if a valid but non-existing user ID is passed and `$single` is false. * An empty string if a valid but non-existing user ID is passed and `$single` is true. + * Note: Non-serialized values are returned as strings: + * - false values are returned as empty strings ('') + * - true values are returned as '1' + * - numbers (both integer and float) are returned as strings + * Arrays and objects retain their original type. */ function get_user_meta( $user_id, $key = '', $single = false ) { return get_metadata( 'user', $user_id, $key, $single ); From e8fc0d6ae5d936557f38d4187db5d47df0f1c835 Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Fri, 17 Jan 2025 10:32:22 +0000 Subject: [PATCH 194/323] Build/Test Tools: Use quiet pulls during local environment installation and WP-CLI commands. This reduces the noise of the output -- both locally and on CI -- when first pulling containers during local environment installation and the first time the cli container is pulled for WP-CLI commands. See #62280 git-svn-id: https://develop.svn.wordpress.org/trunk@59658 602fd350-edb4-49c9-b593-d223f7449a82 --- tools/local-env/scripts/install.js | 2 +- tools/local-env/scripts/start.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/local-env/scripts/install.js b/tools/local-env/scripts/install.js index 519fc37a0d258..d924ffc30deba 100644 --- a/tools/local-env/scripts/install.js +++ b/tools/local-env/scripts/install.js @@ -55,7 +55,7 @@ wait_on( { resources: [ `tcp:localhost:${process.env.LOCAL_PORT}`] } ) function wp_cli( cmd ) { const composeFiles = local_env_utils.get_compose_files(); - execSync( `docker compose ${composeFiles} run --rm cli ${cmd}`, { stdio: 'inherit' } ); + execSync( `docker compose ${composeFiles} run --quiet-pull --rm cli ${cmd}`, { stdio: 'inherit' } ); } /** diff --git a/tools/local-env/scripts/start.js b/tools/local-env/scripts/start.js index ef7fb7b7d4360..0dc8b9570063d 100644 --- a/tools/local-env/scripts/start.js +++ b/tools/local-env/scripts/start.js @@ -31,7 +31,7 @@ try { const containers = ( process.env.LOCAL_PHP_MEMCACHED === 'true' ) ? 'wordpress-develop memcached' : 'wordpress-develop'; -execSync( `docker compose ${composeFiles} up -d ${containers}`, { stdio: 'inherit' } ); +execSync( `docker compose ${composeFiles} up --quiet-pull -d ${containers}`, { stdio: 'inherit' } ); // If Docker Toolbox is being used, we need to manually forward LOCAL_PORT to the Docker VM. if ( process.env.DOCKER_TOOLBOX_INSTALL_PATH ) { From f1dc1916a0a3b13a9ace369e8bf850cc03c8690c Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Fri, 17 Jan 2025 10:35:41 +0000 Subject: [PATCH 195/323] Build/Test Tools: Hide the Node.js error message when a Docker command produces a non-zero exit code. When running a command that goes via docker.js and produces a non-zero exit code, the error message and stack trace from node an safely be hidden because the stack trace only points to the `execSync()` call and is of no use. Fixes #62814 git-svn-id: https://develop.svn.wordpress.org/trunk@59659 602fd350-edb4-49c9-b593-d223f7449a82 --- tools/local-env/scripts/docker.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tools/local-env/scripts/docker.js b/tools/local-env/scripts/docker.js index daa6b8826237a..c1dc2b27e1673 100644 --- a/tools/local-env/scripts/docker.js +++ b/tools/local-env/scripts/docker.js @@ -12,5 +12,10 @@ if (process.argv.includes('--coverage-html')) { process.env.LOCAL_PHP_XDEBUG_MODE = 'coverage'; } -// Execute any docker compose command passed to this script. -execSync( 'docker compose ' + composeFiles + ' ' + process.argv.slice( 2 ).join( ' ' ), { stdio: 'inherit' } ); +// This try-catch prevents the superfluous Node.js debugging information from being shown if the command fails. +try { + // Execute any Docker compose command passed to this script. + execSync( 'docker compose ' + composeFiles + ' ' + process.argv.slice( 2 ).join( ' ' ), { stdio: 'inherit' } ); +} catch ( error ) { + process.exit( 1 ); +} From 6677425622ca570c0fb190295dd610150de33d17 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Fri, 17 Jan 2025 10:36:41 +0000 Subject: [PATCH 196/323] Coding Standards: Use strict comparison in `wp_xmlrpc_server::wp_deleteCategory()`. Follow-up to [20157], [32733]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59660 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-xmlrpc-server.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index 527bf23966be2..84f64967a45ce 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -3504,7 +3504,7 @@ public function wp_deleteCategory( $args ) { $status = wp_delete_term( $category_id, 'category' ); - if ( true == $status ) { + if ( true === $status ) { /** * Fires after a category has been successfully deleted via XML-RPC. * @@ -3754,7 +3754,7 @@ public function wp_deleteComment( $args ) { $status = wp_delete_comment( $comment_id ); - if ( $status ) { + if ( true === $status ) { /** * Fires after a comment has been successfully deleted via XML-RPC. * From 5e74d3416f6ca7f204ab772cd0b836923bf1ad41 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Fri, 17 Jan 2025 14:01:37 +0000 Subject: [PATCH 197/323] Build/Test Tools: Auto-close linked PRs on GitHub. There are currently ~2,000 open pull requests on GitHub for `wordpress-develop`. Many of these were for testing changes that have already been merged. To help prevent orphaned pull requests, this new workflow will search for any pull requests referencing the `Fixed` Trac tickets as noted in the commit message and close them out. For now, this only happens for `push` events. Props peterwilsoncc, swissspidy, johnbillion, davidbaumwald. Fixes #62817. git-svn-id: https://develop.svn.wordpress.org/trunk@59661 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/cleanup-pull-requests.yml | 28 ++++++ .../reusable-cleanup-pull-requests.yml | 98 +++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 .github/workflows/cleanup-pull-requests.yml create mode 100644 .github/workflows/reusable-cleanup-pull-requests.yml diff --git a/.github/workflows/cleanup-pull-requests.yml b/.github/workflows/cleanup-pull-requests.yml new file mode 100644 index 0000000000000..578710dcf56ac --- /dev/null +++ b/.github/workflows/cleanup-pull-requests.yml @@ -0,0 +1,28 @@ +name: Cleanup Pull Requests + +on: + push: + branches: + - trunk + - '4.[1-9]' + - '[5-9].[0-9]' + +# Cancels all previous workflow runs for pull requests that have not completed. +concurrency: + # The concurrency group contains the workflow name and the branch name for pull requests + # or the commit hash for any other events. + group: ${{ github.workflow }}-${{ github.sha }} + cancel-in-progress: true + +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + +jobs: + # Runs pull request cleanup. + close-prs: + name: Clean up pull requests + permissions: + pull-requests: write + if: ${{ github.repository == 'WordPress/wordpress-develop' }} + uses: ./.github/workflows/reusable-cleanup-pull-requests.yml diff --git a/.github/workflows/reusable-cleanup-pull-requests.yml b/.github/workflows/reusable-cleanup-pull-requests.yml new file mode 100644 index 0000000000000..c63bab2d67751 --- /dev/null +++ b/.github/workflows/reusable-cleanup-pull-requests.yml @@ -0,0 +1,98 @@ +## +# A reusable workflow that finds and closes any pull requests that are linked to Trac +# tickets that are referenced as fixed in commit messages. +# +# More info about using GitHub pull requests for contributing to WordPress can be found in the handbook: https://make.wordpress.org/core/handbook/contribute/git/github-pull-requests-for-code-review/. +## +name: Run pull request cleanup + +on: + workflow_call: + +jobs: + # Finds and closes pull requests referencing fixed Trac tickets in commit messages using the + # documented expected format + # + # Commit message format is documented in the Core handbook: https://make.wordpress.org/core/handbook/best-practices/commit-messages/. + # + # Performs the following steps: + # - Parse fixed ticket numbers from the commit message. + # - Parse the SVN revision from the commit message. + # - Searches for pull requests referencing any fixed tickets. + # - Leaves a comment on each PR before closing. + close-prs: + name: Find and close PRs + runs-on: ubuntu-latest + permissions: + pull-requests: write + + steps: + - name: Find fixed ticket numbers + id: trac-tickets + run: | + COMMIT_MESSAGE=$(cat <<'EOF' | sed -n '/^Fixes #/,/\./p' + ${{ github.event.head_commit.message }} + EOF + ) + echo "fixed_list=$(echo \"$COMMIT_MESSAGE\" | sed -n 's/.*Fixes #\([0-9]\+\).*/\1/p' | tr '\n' ' ')" >> $GITHUB_OUTPUT + + - name: Get the SVN revision + id: git-svn-id + run: | + COMMIT_MESSAGE=$(cat <<'EOF' | sed -n '$p' + ${{ github.event.head_commit.message }} + EOF + ) + echo "svn_revision_number=$(echo \"$COMMIT_MESSAGE\" | sed -n 's/.*git-svn-id: https:\/\/develop.svn.wordpress.org\/[^@]*@\([0-9]*\) .*/\1/p')" >> $GITHUB_OUTPUT + + - name: Find pull requests + id: linked-prs + if: ${{ steps.trac-tickets.outputs.fixed_list != '' && steps.git-svn-id.outputs.svn_revision_number != '' }} + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + const fixedList = "${{ steps.trac-tickets.outputs.fixed_list }}".split(' ').filter(Boolean); + + let prNumbers = []; + + for (const ticket of fixedList) { + const query = 'is:pr is:open repo:' + context.repo.owner + '/' + context.repo.repo + ' in:body https://core.trac.wordpress.org/ticket/' + ticket; + const result = await github.rest.search.issuesAndPullRequests({ q: query }); + + prNumbers = prNumbers.concat(result.data.items.map(pr => pr.number)); + } + + return prNumbers; + + - name: Comment and close pull requests + if: ${{ steps.trac-tickets.outputs.fixed_list != '' && steps.git-svn-id.outputs.svn_revision_number != '' }} + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + const prNumbers = ${{ steps.linked-prs.outputs.result }}; + + const commentBody = `A commit was made that fixes the Trac ticket referenced in the description of this pull request. + + SVN changeset: [${{ steps.git-svn-id.outputs.svn_revision_number }}](https://core.trac.wordpress.org/changeset/${{ steps.git-svn-id.outputs.svn_revision_number }}) + GitHub commit: https://github.com/WordPress/wordpress-develop/commit/${{ github.sha }} + + This PR will be closed, but please confirm the accuracy of this and reopen if there is more work to be done.`; + + // Update all matched pull requests. + for (const prNumber of prNumbers) { + // Comment on the pull request with details. + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + body: commentBody + }); + + // Close the pull request. + await github.rest.pulls.update({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: prNumber, + state: 'closed' + }); + } From 2f654881e494424634d5821d1ef37c06edb8923a Mon Sep 17 00:00:00 2001 From: Joe McGill <joemcgill@git.wordpress.org> Date: Fri, 17 Jan 2025 21:35:50 +0000 Subject: [PATCH 198/323] Editor: Improve consistency of `render_block_context` filter. This ensures that when block context is filtered via `render_block_context`, the filtered value is provided as available context to inner blocks. For backwards compatibility reasons, filtered context is added to inner block context regardless of whether that block has declared support via the `uses_context` property. Props mukesh27, flixos90, gziolo, dlh, joemcgill, santosguillamot. Fixes #62046. git-svn-id: https://develop.svn.wordpress.org/trunk@59662 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-block.php | 65 +++++++++-- tests/phpunit/tests/blocks/renderBlock.php | 128 +++++++++++++++++++++ 2 files changed, 185 insertions(+), 8 deletions(-) diff --git a/src/wp-includes/class-wp-block.php b/src/wp-includes/class-wp-block.php index a1c52019c29a5..2533379fcdf7a 100644 --- a/src/wp-includes/class-wp-block.php +++ b/src/wp-includes/class-wp-block.php @@ -56,7 +56,7 @@ class WP_Block { * @var array * @access protected */ - protected $available_context; + protected $available_context = array(); /** * Block type registry. @@ -140,6 +140,28 @@ public function __construct( $block, $available_context = array(), $registry = n $this->available_context = $available_context; + $this->refresh_context_dependents(); + } + + /** + * Updates the context for the current block and its inner blocks. + * + * The method updates the context of inner blocks, if any, by passing down + * any context values the block provides (`provides_context`). + * + * If the block has inner blocks, the method recursively processes them by creating new instances of `WP_Block` + * for each inner block and updating their context based on the block's `provides_context` property. + * + * @since 6.8.0 + */ + public function refresh_context_dependents() { + /* + * Merging the `$context` property here is not ideal, but for now needs to happen because of backward compatibility. + * Ideally, the `$context` property itself would not be filterable directly and only the `$available_context` would be filterable. + * However, this needs to be separately explored whether it's possible without breakage. + */ + $this->available_context = array_merge( $this->available_context, $this->context ); + if ( ! empty( $this->block_type->uses_context ) ) { foreach ( $this->block_type->uses_context as $context_name ) { if ( array_key_exists( $context_name, $this->available_context ) ) { @@ -148,7 +170,23 @@ public function __construct( $block, $available_context = array(), $registry = n } } - if ( ! empty( $block['innerBlocks'] ) ) { + $this->refresh_parsed_block_dependents(); + } + + /** + * Updates the parsed block content for the current block and its inner blocks. + * + * This method sets the `inner_html` and `inner_content` properties of the block based on the parsed + * block content provided during initialization. It ensures that the block instance reflects the + * most up-to-date content for both the inner HTML and any string fragments around inner blocks. + * + * If the block has inner blocks, this method initializes a new `WP_Block_List` for them, ensuring the + * correct content and context are updated for each nested block. + * + * @since 6.8.0 + */ + public function refresh_parsed_block_dependents() { + if ( ! empty( $this->parsed_block['innerBlocks'] ) ) { $child_context = $this->available_context; if ( ! empty( $this->block_type->provides_context ) ) { @@ -159,15 +197,15 @@ public function __construct( $block, $available_context = array(), $registry = n } } - $this->inner_blocks = new WP_Block_List( $block['innerBlocks'], $child_context, $registry ); + $this->inner_blocks = new WP_Block_List( $this->parsed_block['innerBlocks'], $child_context, $this->registry ); } - if ( ! empty( $block['innerHTML'] ) ) { - $this->inner_html = $block['innerHTML']; + if ( ! empty( $this->parsed_block['innerHTML'] ) ) { + $this->inner_html = $this->parsed_block['innerHTML']; } - if ( ! empty( $block['innerContent'] ) ) { - $this->inner_content = $block['innerContent']; + if ( ! empty( $this->parsed_block['innerContent'] ) ) { + $this->inner_content = $this->parsed_block['innerContent']; } } @@ -506,7 +544,8 @@ public function render( $options = array() ) { if ( ! is_null( $pre_render ) ) { $block_content .= $pre_render; } else { - $source_block = $inner_block->parsed_block; + $source_block = $inner_block->parsed_block; + $inner_block_context = $inner_block->context; /** This filter is documented in wp-includes/blocks.php */ $inner_block->parsed_block = apply_filters( 'render_block_data', $inner_block->parsed_block, $source_block, $parent_block ); @@ -514,6 +553,16 @@ public function render( $options = array() ) { /** This filter is documented in wp-includes/blocks.php */ $inner_block->context = apply_filters( 'render_block_context', $inner_block->context, $inner_block->parsed_block, $parent_block ); + /* + * The `refresh_context_dependents()` method already calls `refresh_parsed_block_dependents()`. + * Therefore the second condition is irrelevant if the first one is satisfied. + */ + if ( $inner_block->context !== $inner_block_context ) { + $inner_block->refresh_context_dependents(); + } elseif ( $inner_block->parsed_block !== $source_block ) { + $inner_block->refresh_parsed_block_dependents(); + } + $block_content .= $inner_block->render(); } diff --git a/tests/phpunit/tests/blocks/renderBlock.php b/tests/phpunit/tests/blocks/renderBlock.php index 0c1c4ce10a1ee..be251692c5c62 100644 --- a/tests/phpunit/tests/blocks/renderBlock.php +++ b/tests/phpunit/tests/blocks/renderBlock.php @@ -192,4 +192,132 @@ public function test_default_context_is_filterable() { $this->assertSame( array( 'example' => 'ok' ), $provided_context[0] ); } + + /** + * Tests the behavior of the 'render_block_context' filter based on the location of the filtered block. + * + * @ticket 62046 + */ + public function test_render_block_context_inner_blocks() { + $provided_context = array(); + + register_block_type( + 'tests/context-provider', + array( + 'provides_context' => array( 'example' ), + ) + ); + + register_block_type( + 'tests/context-consumer', + array( + 'uses_context' => array( 'example' ), + 'render_callback' => static function ( $attributes, $content, $block ) use ( &$provided_context ) { + $provided_context = $block->context; + + return ''; + }, + ) + ); + + // Filter the context provided by the test block. + add_filter( + 'render_block_context', + function ( $context, $parsed_block ) { + if ( isset( $parsed_block['blockName'] ) && 'tests/context-provider' === $parsed_block['blockName'] ) { + $context['example'] = 'ok'; + } + + return $context; + }, + 10, + 2 + ); + + // Test inner block context when the provider block is a top-level block. + do_blocks( + <<<HTML +<!-- wp:tests/context-provider --> +<!-- wp:tests/context-consumer /--> +<!-- /wp:tests/context-provider --> +HTML + ); + $this->assertArrayHasKey( 'example', $provided_context, 'Test block is top-level block: Context should include "example"' ); + $this->assertSame( 'ok', $provided_context['example'], 'Test block is top-level block: "example" in context should be "ok"' ); + + // Test inner block context when the provider block is an inner block. + do_blocks( + <<<HTML +<!-- wp:group {"layout":{"type":"constrained"}} --> +<!-- wp:tests/context-provider --> +<!-- wp:tests/context-consumer /--> +<!-- /wp:tests/context-provider --> +<!-- /wp:group --> +HTML + ); + $this->assertArrayHasKey( 'example', $provided_context, 'Test block is inner block: Block context should include "example"' ); + $this->assertSame( 'ok', $provided_context['example'], 'Test block is inner block: "example" in context should be "ok"' ); + } + + /** + * Tests that the 'render_block_context' filter arbitrary context. + * + * @ticket 62046 + */ + public function test_render_block_context_allowed_context() { + $provided_context = array(); + + register_block_type( + 'tests/context-consumer', + array( + 'uses_context' => array( 'example' ), + 'render_callback' => static function ( $attributes, $content, $block ) use ( &$provided_context ) { + $provided_context = $block->context; + + return ''; + }, + ) + ); + + // Filter the context provided to the test block. + add_filter( + 'render_block_context', + function ( $context, $parsed_block ) { + if ( isset( $parsed_block['blockName'] ) && 'tests/context-consumer' === $parsed_block['blockName'] ) { + $context['arbitrary'] = 'ok'; + } + + return $context; + }, + 10, + 2 + ); + + do_blocks( + <<<HTML +<!-- wp:tests/context-consumer /--> +HTML + ); + $this->assertArrayNotHasKey( 'arbitrary', $provided_context, 'Test block is top-level block: Block context should not include "arbitrary"' ); + + do_blocks( + <<<HTML +<!-- wp:group {"layout":{"type":"constrained"}} --> +<!-- wp:tests/context-consumer /--> +<!-- /wp:group --> +HTML + ); + + /* + * These assertions assert something that ideally should not be the case: Inner blocks should respect the + * `uses_context` value just like top-level blocks do. However, due to logic in `WP_Block::render()`, the + * `context` property value itself is filterable when it should rather only apply to the `available_context` + * property. + * However, changing this behavior now would be a backward compatibility break, hence the assertion here. + * Potentially it can be reconsidered in the future, so that these two assertions could be replaced with an + * `assertArrayNotHasKey( 'arbitrary', $provided_context )`. + */ + $this->assertArrayHasKey( 'arbitrary', $provided_context, 'Test block is inner block: Block context should include "arbitrary"' ); + $this->assertSame( 'ok', $provided_context['arbitrary'], 'Test block is inner block: "arbitrary" in context should be "ok"' ); + } } From f33ee44c8c51b8f7a8d9cd8c647f9a85d2bebcd4 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sat, 18 Jan 2025 23:41:46 +0000 Subject: [PATCH 199/323] Coding Standards: Use strict comparison in `wp_xmlrpc_server::pingback_ping()`. Follow-up to [2983], [55365]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59663 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-xmlrpc-server.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index 84f64967a45ce..cbcf0a9b52fdc 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -6885,6 +6885,7 @@ public function pingback_ping( $args ) { */ $urltest = parse_url( $pagelinkedto ); $post_id = url_to_postid( $pagelinkedto ); + if ( $post_id ) { // $way } elseif ( isset( $urltest['path'] ) && preg_match( '#p/[0-9]{1,}#', $urltest['path'], $match ) ) { @@ -6917,15 +6918,15 @@ public function pingback_ping( $args ) { // TODO: Attempt to extract a post ID from the given URL. return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either does not exist, or it is not a pingback-enabled resource.' ) ); } - $post_id = (int) $post_id; - $post = get_post( $post_id ); + $post_id = (int) $post_id; + $post = get_post( $post_id ); if ( ! $post ) { // Post not found. return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either does not exist, or it is not a pingback-enabled resource.' ) ); } - if ( url_to_postid( $pagelinkedfrom ) == $post_id ) { + if ( url_to_postid( $pagelinkedfrom ) === $post_id ) { return $this->pingback_error( 0, __( 'The source URL and the target URL cannot both point to the same resource.' ) ); } From 7fe8f1cc6f2722d773c738bbe0811bef2a07756e Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sun, 19 Jan 2025 16:55:20 +0000 Subject: [PATCH 200/323] Coding Standards: Rename the `$dateCreated` variable in `wp_xmlrpc_server` methods. This resolves a few WPCS warnings: {{{ Variable "$dateCreated" is not in valid snake_case format, try "$date_created" }}} Follow-up to [1563], [1659], [5888], [6691], [8543], [19848]. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59664 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-xmlrpc-server.php | 37 +++++++++++----------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index cbcf0a9b52fdc..458ffbb0a59f7 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -1513,17 +1513,17 @@ protected function _insert_post( $user, $content_struct ) { // Do some timestamp voodoo. if ( ! empty( $post_data['post_date_gmt'] ) ) { // We know this is supposed to be GMT, so we're going to slap that Z on there by force. - $dateCreated = rtrim( $post_data['post_date_gmt']->getIso(), 'Z' ) . 'Z'; + $date_created = rtrim( $post_data['post_date_gmt']->getIso(), 'Z' ) . 'Z'; } elseif ( ! empty( $post_data['post_date'] ) ) { - $dateCreated = $post_data['post_date']->getIso(); + $date_created = $post_data['post_date']->getIso(); } // Default to not flagging the post date to be edited unless it's intentional. $post_data['edit_date'] = false; - if ( ! empty( $dateCreated ) ) { - $post_data['post_date'] = iso8601_to_datetime( $dateCreated ); - $post_data['post_date_gmt'] = iso8601_to_datetime( $dateCreated, 'gmt' ); + if ( ! empty( $date_created ) ) { + $post_data['post_date'] = iso8601_to_datetime( $date_created ); + $post_data['post_date_gmt'] = iso8601_to_datetime( $date_created, 'gmt' ); // Flag the post date to be edited. $post_data['edit_date'] = true; @@ -3837,9 +3837,10 @@ public function wp_editComment( $args ) { // Do some timestamp voodoo. if ( ! empty( $content_struct['date_created_gmt'] ) ) { // We know this is supposed to be GMT, so we're going to slap that Z on there by force. - $dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; - $comment['comment_date'] = get_date_from_gmt( $dateCreated ); - $comment['comment_date_gmt'] = iso8601_to_datetime( $dateCreated, 'gmt' ); + $date_created = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; + + $comment['comment_date'] = get_date_from_gmt( $date_created ); + $comment['comment_date_gmt'] = iso8601_to_datetime( $date_created, 'gmt' ); } if ( isset( $content_struct['content'] ) ) { @@ -5571,16 +5572,16 @@ public function mw_newPost( $args ) { // Do some timestamp voodoo. if ( ! empty( $content_struct['date_created_gmt'] ) ) { // We know this is supposed to be GMT, so we're going to slap that Z on there by force. - $dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; + $date_created = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; } elseif ( ! empty( $content_struct['dateCreated'] ) ) { - $dateCreated = $content_struct['dateCreated']->getIso(); + $date_created = $content_struct['dateCreated']->getIso(); } $post_date = ''; $post_date_gmt = ''; - if ( ! empty( $dateCreated ) ) { - $post_date = iso8601_to_datetime( $dateCreated ); - $post_date_gmt = iso8601_to_datetime( $dateCreated, 'gmt' ); + if ( ! empty( $date_created ) ) { + $post_date = iso8601_to_datetime( $date_created ); + $post_date_gmt = iso8601_to_datetime( $date_created, 'gmt' ); } $post_category = array(); @@ -5958,17 +5959,17 @@ public function mw_editPost( $args ) { // Do some timestamp voodoo. if ( ! empty( $content_struct['date_created_gmt'] ) ) { // We know this is supposed to be GMT, so we're going to slap that Z on there by force. - $dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; + $date_created = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; } elseif ( ! empty( $content_struct['dateCreated'] ) ) { - $dateCreated = $content_struct['dateCreated']->getIso(); + $date_created = $content_struct['dateCreated']->getIso(); } // Default to not flagging the post date to be edited unless it's intentional. $edit_date = false; - if ( ! empty( $dateCreated ) ) { - $post_date = iso8601_to_datetime( $dateCreated ); - $post_date_gmt = iso8601_to_datetime( $dateCreated, 'gmt' ); + if ( ! empty( $date_created ) ) { + $post_date = iso8601_to_datetime( $date_created ); + $post_date_gmt = iso8601_to_datetime( $date_created, 'gmt' ); // Flag the post date to be edited. $edit_date = true; From 29df2d591f7783b94582f3f76dc7f6cad2fb1398 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Mon, 20 Jan 2025 14:30:02 +0000 Subject: [PATCH 201/323] Coding Standards: Rename the `$isPrimary` variable in `wp_xmlrpc_server` methods. This resolves a few WPCS warnings: {{{ Variable "$isPrimary" is not in valid snake_case format, try "$is_primary" }}} Additionally, this commit renames `$catids` to `$cat_ids` for consistency. Follow-up to [1671]. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59665 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-xmlrpc-server.php | 32 +++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index 458ffbb0a59f7..14a8843e4fc0f 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -6087,9 +6087,9 @@ public function mw_getPost( $args ) { $post_modified_gmt = $this->_convert_date_gmt( $postdata['post_modified_gmt'], $postdata['post_modified'] ); $categories = array(); - $catids = wp_get_post_categories( $post_id ); - foreach ( $catids as $catid ) { - $categories[] = get_cat_name( $catid ); + $cat_ids = wp_get_post_categories( $post_id ); + foreach ( $cat_ids as $cat_id ) { + $categories[] = get_cat_name( $cat_id ); } $tagnames = array(); @@ -6239,9 +6239,9 @@ public function mw_getRecentPosts( $args ) { $post_modified_gmt = $this->_convert_date_gmt( $entry['post_modified_gmt'], $entry['post_modified'] ); $categories = array(); - $catids = wp_get_post_categories( $entry['ID'] ); - foreach ( $catids as $catid ) { - $categories[] = get_cat_name( $catid ); + $cat_ids = wp_get_post_categories( $entry['ID'] ); + foreach ( $cat_ids as $cat_id ) { + $categories[] = get_cat_name( $cat_id ); } $tagnames = array(); @@ -6639,16 +6639,16 @@ public function mt_getPostCategories( $args ) { do_action( 'xmlrpc_call', 'mt.getPostCategories', $args, $this ); $categories = array(); - $catids = wp_get_post_categories( (int) $post_id ); + $cat_ids = wp_get_post_categories( (int) $post_id ); // First listed category will be the primary category. - $isPrimary = true; - foreach ( $catids as $catid ) { + $is_primary = true; + foreach ( $cat_ids as $cat_id ) { $categories[] = array( - 'categoryName' => get_cat_name( $catid ), - 'categoryId' => (string) $catid, - 'isPrimary' => $isPrimary, + 'categoryName' => get_cat_name( $cat_id ), + 'categoryId' => (string) $cat_id, + 'isPrimary' => $is_primary, ); - $isPrimary = false; + $is_primary = false; } return $categories; @@ -6693,12 +6693,12 @@ public function mt_setPostCategories( $args ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); } - $catids = array(); + $cat_ids = array(); foreach ( $categories as $cat ) { - $catids[] = $cat['categoryId']; + $cat_ids[] = $cat['categoryId']; } - wp_set_post_categories( $post_id, $catids ); + wp_set_post_categories( $post_id, $cat_ids ); return true; } From 2dd8ce2f0af7c93e290a12b032390b9a3139bae7 Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Mon, 20 Jan 2025 21:49:44 +0000 Subject: [PATCH 202/323] Build/Test Tools: Instruct git and svn to ignore SQLite files This prevents users of the SQLite Database Integration plugin from seeing untracked files in the `src/wp-content/database` directory. Props sukhendu2002, johnbillion Fixes #62813 git-svn-id: https://develop.svn.wordpress.org/trunk@59666 602fd350-edb4-49c9-b593-d223f7449a82 --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 229b3a269394b..648c711b21f26 100644 --- a/.gitignore +++ b/.gitignore @@ -46,6 +46,7 @@ wp-tests-config.php # Files and folders that get created in wp-content /src/wp-content/blogs.dir +/src/wp-content/database /src/wp-content/fonts /src/wp-content/languages /src/wp-content/mu-plugins From 313e12323a16c46b8c4ef050168508603ff0f588 Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Mon, 20 Jan 2025 22:02:56 +0000 Subject: [PATCH 203/323] Administration: Clarify some references to "we" and "our" in the administration area. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This changes some text to better match the guidelines and recommendations set forth in the make/core handbook, specifically: > the word “we” should be avoided (...) unless its made very clear which group is speaking Fixes #62295 git-svn-id: https://develop.svn.wordpress.org/trunk@59667 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/freedoms.php | 2 +- src/wp-admin/includes/class-wp-privacy-policy-content.php | 2 +- src/wp-admin/options-privacy.php | 2 +- src/wp-admin/privacy.php | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/wp-admin/freedoms.php b/src/wp-admin/freedoms.php index 4846b9b9bab65..5b9564ecfd81f 100644 --- a/src/wp-admin/freedoms.php +++ b/src/wp-admin/freedoms.php @@ -85,7 +85,7 @@ <?php printf( /* translators: %s: https://wordpressfoundation.org/trademark-policy/ */ - __( 'WordPress grows when people like you tell their friends about it, and the thousands of businesses and services that are built on and around WordPress share that fact with their users. We are flattered every time someone spreads the good word, just make sure to <a href="%s">check out our trademark guidelines</a> first.' ), + __( 'WordPress grows when people like you tell their friends about it, and the thousands of businesses and services that are built on and around WordPress share that fact with their users. The WordPress community is flattered every time someone spreads the good word, just make sure to <a href="%s">check out the WordPress Foundation trademark guidelines</a> first.' ), 'https://wordpressfoundation.org/trademark-policy/' ); ?> diff --git a/src/wp-admin/includes/class-wp-privacy-policy-content.php b/src/wp-admin/includes/class-wp-privacy-policy-content.php index 04aee97aac67c..724a0dcf64a99 100644 --- a/src/wp-admin/includes/class-wp-privacy-policy-content.php +++ b/src/wp-admin/includes/class-wp-privacy-policy-content.php @@ -333,7 +333,7 @@ public static function notice( $post = null ) { return; } - $message = __( 'Need help putting together your new Privacy Policy page? Check out our guide for recommendations on what content to include, along with policies suggested by your plugins and theme.' ); + $message = __( 'Need help putting together your new Privacy Policy page? Check out the guide for recommendations on what content to include, along with policies suggested by your plugins and theme.' ); $url = esc_url( admin_url( 'options-privacy.php?tab=policyguide' ) ); $label = __( 'View Privacy Policy Guide.' ); diff --git a/src/wp-admin/options-privacy.php b/src/wp-admin/options-privacy.php index 92de2ca9b9b68..33e59b4601175 100644 --- a/src/wp-admin/options-privacy.php +++ b/src/wp-admin/options-privacy.php @@ -236,7 +236,7 @@ static function ( $body_class ) { } printf( /* translators: 1: Privacy Policy guide URL, 2: Additional link attributes, 3: Accessibility text. */ - __( 'Need help putting together your new Privacy Policy page? <a href="%1$s" %2$s>Check out our privacy policy guide%3$s</a> for recommendations on what content to include, along with policies suggested by your plugins and theme.' ), + __( 'Need help putting together your new Privacy Policy page? <a href="%1$s" %2$s>Check out the privacy policy guide%3$s</a> for recommendations on what content to include, along with policies suggested by your plugins and theme.' ), esc_url( admin_url( 'options-privacy.php?tab=policyguide' ) ), '', '' diff --git a/src/wp-admin/privacy.php b/src/wp-admin/privacy.php index 88d2975f17c1a..813cea213de73 100644 --- a/src/wp-admin/privacy.php +++ b/src/wp-admin/privacy.php @@ -26,7 +26,7 @@ </div> <div class="about__header-text"> - <?php _e( 'We take privacy and transparency very seriously' ); ?> + <?php _e( 'WordPress.org takes privacy and transparency very seriously' ); ?> </div> </div> @@ -59,7 +59,7 @@ <?php printf( /* translators: %s: https://wordpress.org/about/privacy/ */ - __( 'We take privacy and transparency very seriously. To learn more about what data we collect, and how we use it, please visit <a href="%s">our Privacy Policy</a>.' ), + __( 'WordPress.org takes privacy and transparency very seriously. To learn more about what data is collected, and how it is used, please visit <a href="%s">the WordPress.org Privacy Policy</a>.' ), __( 'https://wordpress.org/about/privacy/' ) ); ?> From 0bb851ec95fdbc7e8dbc0abb0ee137cbf81f077b Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Mon, 20 Jan 2025 22:06:53 +0000 Subject: [PATCH 204/323] Build/Test Tools: Pass the working directory path from the host to the dev environment containers. This allows development tools to read the host path information from the `HOST_PATH` environment variable in order to, for example, map a path in a stack trace from the path in the container to the path on the host machine. Fixes #62833 git-svn-id: https://develop.svn.wordpress.org/trunk@59668 602fd350-edb4-49c9-b593-d223f7449a82 --- docker-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index ec462c8a24c5c..7465f022e1299 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -45,6 +45,7 @@ services: - PHP_FPM_GID=${PHP_FPM_GID-1000} - GITHUB_REF=${GITHUB_REF-false} - GITHUB_EVENT_NAME=${GITHUB_EVENT_NAME-false} + - HOST_PATH=${PWD-}/${LOCAL_DIR-src} volumes: - ./tools/local-env/php-config.ini:/usr/local/etc/php/conf.d/php-config.ini @@ -101,6 +102,7 @@ services: - LOCAL_PHP_MEMCACHED=${LOCAL_PHP_MEMCACHED-false} - PHP_FPM_UID=${PHP_FPM_UID-1000} - PHP_FPM_GID=${PHP_FPM_GID-1000} + - HOST_PATH=${PWD-}/${LOCAL_DIR-src} volumes: - ./:/var/www From 7be10747eab7562acee25005952012f5f4e07f10 Mon Sep 17 00:00:00 2001 From: Pascal Birchler <swissspidy@git.wordpress.org> Date: Tue, 21 Jan 2025 08:32:24 +0000 Subject: [PATCH 205/323] Build/Test Tools: Do not download extra browsers in performance tests. Props euthelup, johnbillion, mukesh27. Fixes #62822. git-svn-id: https://develop.svn.wordpress.org/trunk@59669 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-performance.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/reusable-performance.yml b/.github/workflows/reusable-performance.yml index f75cb6b3e4969..0c2c61aafc7a5 100644 --- a/.github/workflows/reusable-performance.yml +++ b/.github/workflows/reusable-performance.yml @@ -39,6 +39,10 @@ on: env: PUPPETEER_SKIP_DOWNLOAD: ${{ true }} + # Prevent wp-scripts from downloading extra Playwright browsers, + # since Chromium will be installed in its dedicated step already. + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: true + # Performance testing should be performed in an environment reflecting a standard production environment. LOCAL_WP_DEBUG: false LOCAL_SCRIPT_DEBUG: false From 4b89ebe5be312334220feb9fc051b9aa44e9b73e Mon Sep 17 00:00:00 2001 From: Pascal Birchler <swissspidy@git.wordpress.org> Date: Tue, 21 Jan 2025 11:42:19 +0000 Subject: [PATCH 206/323] I18N: Set textdomain registry information before loading plugins/theme. This way, warnings for early translation calls can be emitted that aren't attached to any hook. Follow-up to [59461]. Props swissspidy. Fixes #62244.See #44937. git-svn-id: https://develop.svn.wordpress.org/trunk@59670 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-settings.php | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/wp-settings.php b/src/wp-settings.php index 635f6de248dd5..ec08ff11498f3 100644 --- a/src/wp-settings.php +++ b/src/wp-settings.php @@ -525,6 +525,17 @@ foreach ( wp_get_active_and_valid_plugins() as $plugin ) { wp_register_plugin_realpath( $plugin ); + $plugin_data = get_plugin_data( $plugin, false, false ); + + $textdomain = $plugin_data['TextDomain']; + if ( $textdomain ) { + if ( $plugin_data['DomainPath'] ) { + $GLOBALS['wp_textdomain_registry']->set_custom_path( $textdomain, dirname( $plugin ) . $plugin_data['DomainPath'] ); + } else { + $GLOBALS['wp_textdomain_registry']->set_custom_path( $textdomain, dirname( $plugin ) ); + } + } + $_wp_plugin_file = $plugin; include_once $plugin; $plugin = $_wp_plugin_file; // Avoid stomping of the $plugin variable in a plugin. @@ -537,17 +548,6 @@ * @param string $plugin Full path to the plugin's main file. */ do_action( 'plugin_loaded', $plugin ); - - $plugin_data = get_plugin_data( $plugin, false, false ); - - $textdomain = $plugin_data['TextDomain']; - if ( $textdomain ) { - if ( $plugin_data['DomainPath'] ) { - $GLOBALS['wp_textdomain_registry']->set_custom_path( $textdomain, dirname( $plugin ) . $plugin_data['DomainPath'] ); - } else { - $GLOBALS['wp_textdomain_registry']->set_custom_path( $textdomain, dirname( $plugin ) ); - } - } } unset( $plugin, $_wp_plugin_file, $plugin_data, $textdomain ); @@ -684,11 +684,11 @@ foreach ( wp_get_active_and_valid_themes() as $theme ) { $wp_theme = wp_get_theme( basename( $theme ) ); + $wp_theme->load_textdomain(); + if ( file_exists( $theme . '/functions.php' ) ) { include $theme . '/functions.php'; } - - $wp_theme->load_textdomain(); } unset( $theme, $wp_theme ); From 2adec312efcec461cc3b329bd440617382faeb52 Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Tue, 21 Jan 2025 13:17:32 +0000 Subject: [PATCH 207/323] Security: Set the HttpOnly flag for the test cookie and the `wp_lang` cookie on the login screen. These cookies are only accessed server-side and don't need to be exposed to JavaScript in the browser. Props earthman100, kevinlearynet Fixes #61322 git-svn-id: https://develop.svn.wordpress.org/trunk@59671 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-login.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wp-login.php b/src/wp-login.php index fb419ac4454ab..c1b06bbc3bac7 100644 --- a/src/wp-login.php +++ b/src/wp-login.php @@ -528,14 +528,14 @@ function wp_login_viewport_meta() { // Set a cookie now to see if they are supported by the browser. $secure = ( 'https' === parse_url( wp_login_url(), PHP_URL_SCHEME ) ); -setcookie( TEST_COOKIE, 'WP Cookie check', 0, COOKIEPATH, COOKIE_DOMAIN, $secure ); +setcookie( TEST_COOKIE, 'WP Cookie check', 0, COOKIEPATH, COOKIE_DOMAIN, $secure, true ); if ( SITECOOKIEPATH !== COOKIEPATH ) { - setcookie( TEST_COOKIE, 'WP Cookie check', 0, SITECOOKIEPATH, COOKIE_DOMAIN, $secure ); + setcookie( TEST_COOKIE, 'WP Cookie check', 0, SITECOOKIEPATH, COOKIE_DOMAIN, $secure, true ); } if ( isset( $_GET['wp_lang'] ) ) { - setcookie( 'wp_lang', sanitize_text_field( $_GET['wp_lang'] ), 0, COOKIEPATH, COOKIE_DOMAIN, $secure ); + setcookie( 'wp_lang', sanitize_text_field( $_GET['wp_lang'] ), 0, COOKIEPATH, COOKIE_DOMAIN, $secure, true ); } /** From 41e124ad55b3c6e9d93c7a71b1dea903a174aafc Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Tue, 21 Jan 2025 15:32:31 +0000 Subject: [PATCH 208/323] Coding Standards: Rename the `$errorString` variable in `wp_xmlrpc_server` methods. This resolves a WPCS warning: {{{ Variable "$errorString" is not in valid snake_case format, try "$error_string" }}} Follow-up to [5054]. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59672 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-xmlrpc-server.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index 14a8843e4fc0f..601717e7e8ce9 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -6434,9 +6434,10 @@ public function mw_newMediaObject( $args ) { $upload = wp_upload_bits( $name, null, $bits ); if ( ! empty( $upload['error'] ) ) { /* translators: 1: File name, 2: Error message. */ - $errorString = sprintf( __( 'Could not write file %1$s (%2$s).' ), $name, $upload['error'] ); - return new IXR_Error( 500, $errorString ); + $error_string = sprintf( __( 'Could not write file %1$s (%2$s).' ), $name, $upload['error'] ); + return new IXR_Error( 500, $error_string ); } + // Construct the attachment array. $post_id = 0; if ( ! empty( $data['post_id'] ) ) { @@ -6446,6 +6447,7 @@ public function mw_newMediaObject( $args ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); } } + $attachment = array( 'post_title' => $name, 'post_content' => '', From f2f13cbff083e2dd7973565bdb9523f10746085e Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Tue, 21 Jan 2025 15:40:51 +0000 Subject: [PATCH 209/323] Build/Test Tools: Switch to using local references for reusable workflows. The benefit of this is that when PRs are made to make changes to a reusable workflow, the references doesn't need to be updated to point to the fork in order for the changed workflow to run. A `npm run grunt replace:workflow-references-local-to-remote` command has also been introduced in order to convert these local references back to remote ones. This command can be used to switch release branches over to using remote workflows, as they are currently, so they continue to benefit from workflow changes in trunk without the need for continual backporting to all the branches. Props desrosj, johnbillion Fixes #62416 git-svn-id: https://develop.svn.wordpress.org/trunk@59673 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/coding-standards.yml | 6 ++-- .github/workflows/end-to-end-tests.yml | 4 +-- .github/workflows/install-testing.yml | 4 +-- .github/workflows/javascript-tests.yml | 4 +-- .../workflows/local-docker-environment.yml | 6 ++-- .github/workflows/performance.yml | 4 +-- .github/workflows/php-compatibility.yml | 4 +-- .github/workflows/phpunit-tests.yml | 10 +++---- .../workflows/test-and-zip-default-themes.yml | 2 +- .github/workflows/test-build-processes.yml | 10 +++---- .github/workflows/test-coverage.yml | 4 +-- .github/workflows/test-old-branches.yml | 2 +- .github/workflows/upgrade-testing.yml | 16 +++++----- Gruntfile.js | 30 +++++++++++++++++++ 14 files changed, 68 insertions(+), 38 deletions(-) diff --git a/.github/workflows/coding-standards.yml b/.github/workflows/coding-standards.yml index 3c9854dc9e16b..9d68d091e91ac 100644 --- a/.github/workflows/coding-standards.yml +++ b/.github/workflows/coding-standards.yml @@ -49,7 +49,7 @@ jobs: # Runs the PHP coding standards checks. phpcs: name: PHP coding standards - uses: WordPress/wordpress-develop/.github/workflows/reusable-coding-standards-php.yml@trunk + uses: ./.github/workflows/reusable-coding-standards-php.yml permissions: contents: read if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} @@ -57,14 +57,14 @@ jobs: # Runs the JavaScript coding standards checks. jshint: name: JavaScript coding standards - uses: WordPress/wordpress-develop/.github/workflows/reusable-coding-standards-javascript.yml@trunk + uses: ./.github/workflows/reusable-coding-standards-javascript.yml permissions: contents: read if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} slack-notifications: name: Slack Notifications - uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk + uses: ./.github/workflows/slack-notifications.yml permissions: actions: read contents: read diff --git a/.github/workflows/end-to-end-tests.yml b/.github/workflows/end-to-end-tests.yml index d77e439b2964c..fe516381eb5c1 100644 --- a/.github/workflows/end-to-end-tests.yml +++ b/.github/workflows/end-to-end-tests.yml @@ -38,7 +38,7 @@ jobs: # Runs the end-to-end test suite. e2e-tests: name: Test with SCRIPT_DEBUG ${{ matrix.LOCAL_SCRIPT_DEBUG && 'enabled' || 'disabled' }} - uses: WordPress/wordpress-develop/.github/workflows/reusable-end-to-end-tests.yml@trunk + uses: ./.github/workflows/reusable-end-to-end-tests.yml permissions: contents: read if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} @@ -51,7 +51,7 @@ jobs: slack-notifications: name: Slack Notifications - uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk + uses: ./.github/workflows/slack-notifications.yml permissions: actions: read contents: read diff --git a/.github/workflows/install-testing.yml b/.github/workflows/install-testing.yml index f347958e8b4ae..4f3a79aa8fe1f 100644 --- a/.github/workflows/install-testing.yml +++ b/.github/workflows/install-testing.yml @@ -43,7 +43,7 @@ jobs: # Determines the supported values for PHP and database versions based on the WordPress version being tested. build-test-matrix: name: Build Test Matrix - uses: WordPress/wordpress-develop/.github/workflows/reusable-support-json-reader-v1.yml@trunk + uses: ./.github/workflows/reusable-support-json-reader-v1.yml permissions: contents: read secrets: inherit @@ -132,7 +132,7 @@ jobs: slack-notifications: name: Slack Notifications - uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk + uses: ./.github/workflows/slack-notifications.yml permissions: actions: read contents: read diff --git a/.github/workflows/javascript-tests.yml b/.github/workflows/javascript-tests.yml index 5872bc5b166c0..e2766e6fa83d1 100644 --- a/.github/workflows/javascript-tests.yml +++ b/.github/workflows/javascript-tests.yml @@ -47,14 +47,14 @@ jobs: # Runs the WordPress Core JavaScript tests. test-js: name: QUnit Tests - uses: WordPress/wordpress-develop/.github/workflows/reusable-javascript-tests.yml@trunk + uses: ./.github/workflows/reusable-javascript-tests.yml permissions: contents: read if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} slack-notifications: name: Slack Notifications - uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk + uses: ./.github/workflows/slack-notifications.yml permissions: actions: read contents: read diff --git a/.github/workflows/local-docker-environment.yml b/.github/workflows/local-docker-environment.yml index 09b212e90ead5..61676269b170c 100644 --- a/.github/workflows/local-docker-environment.yml +++ b/.github/workflows/local-docker-environment.yml @@ -63,7 +63,7 @@ jobs: # build-test-matrix: name: Build Test Matrix - uses: WordPress/wordpress-develop/.github/workflows/reusable-support-json-reader-v1.yml@trunk + uses: ./.github/workflows/reusable-support-json-reader-v1.yml permissions: contents: read secrets: inherit @@ -74,7 +74,7 @@ jobs: # Tests the local Docker environment. environment-tests-mysql: name: PHP ${{ matrix.php }} - uses: WordPress/wordpress-develop/.github/workflows/reusable-test-local-docker-environment-v1.yml@trunk + uses: ./.github/workflows/reusable-test-local-docker-environment-v1.yml permissions: contents: read if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} @@ -108,7 +108,7 @@ jobs: slack-notifications: name: Slack Notifications - uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk + uses: ./.github/workflows/slack-notifications.yml permissions: actions: read contents: read diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index dbb672a30da39..731d1719178df 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -33,7 +33,7 @@ jobs: # Runs the performance test suite. performance: name: ${{ matrix.multisite && 'Multisite' || 'Single site' }} - uses: WordPress/wordpress-develop/.github/workflows/reusable-performance.yml@trunk + uses: ./.github/workflows/reusable-performance.yml permissions: contents: read if: ${{ ( github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' ) }} @@ -50,7 +50,7 @@ jobs: slack-notifications: name: Slack Notifications - uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk + uses: ./.github/workflows/slack-notifications.yml permissions: actions: read contents: read diff --git a/.github/workflows/php-compatibility.yml b/.github/workflows/php-compatibility.yml index eb4163edf38d5..3dbd97b7be732 100644 --- a/.github/workflows/php-compatibility.yml +++ b/.github/workflows/php-compatibility.yml @@ -44,14 +44,14 @@ jobs: # Runs PHP compatibility testing. php-compatibility: name: Check PHP compatibility - uses: WordPress/wordpress-develop/.github/workflows/reusable-php-compatibility.yml@trunk + uses: ./.github/workflows/reusable-php-compatibility.yml permissions: contents: read if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} slack-notifications: name: Slack Notifications - uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk + uses: ./.github/workflows/slack-notifications.yml permissions: actions: read contents: read diff --git a/.github/workflows/phpunit-tests.yml b/.github/workflows/phpunit-tests.yml index 3fe069b709fea..8c5e3257222bf 100644 --- a/.github/workflows/phpunit-tests.yml +++ b/.github/workflows/phpunit-tests.yml @@ -36,7 +36,7 @@ jobs: # test-with-mysql: name: PHP ${{ matrix.php }} - uses: WordPress/wordpress-develop/.github/workflows/reusable-phpunit-tests-v3.yml@trunk + uses: ./.github/workflows/reusable-phpunit-tests-v3.yml permissions: contents: read secrets: inherit @@ -107,7 +107,7 @@ jobs: # test-with-mariadb: name: PHP ${{ matrix.php }} - uses: WordPress/wordpress-develop/.github/workflows/reusable-phpunit-tests-v3.yml@trunk + uses: ./.github/workflows/reusable-phpunit-tests-v3.yml permissions: contents: read secrets: inherit @@ -157,7 +157,7 @@ jobs: # test-innovation-releases: name: PHP ${{ matrix.php }} - uses: WordPress/wordpress-develop/.github/workflows/reusable-phpunit-tests-v3.yml@trunk + uses: ./.github/workflows/reusable-phpunit-tests-v3.yml permissions: contents: read secrets: inherit @@ -200,7 +200,7 @@ jobs: # specific-test-groups: name: ${{ matrix.phpunit-test-groups }} - uses: WordPress/wordpress-develop/.github/workflows/reusable-phpunit-tests-v3.yml@trunk + uses: ./.github/workflows/reusable-phpunit-tests-v3.yml permissions: contents: read secrets: inherit @@ -220,7 +220,7 @@ jobs: slack-notifications: name: Slack Notifications - uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk + uses: ./.github/workflows/slack-notifications.yml permissions: actions: read contents: read diff --git a/.github/workflows/test-and-zip-default-themes.yml b/.github/workflows/test-and-zip-default-themes.yml index c7e7b3012f8f9..8a68016a3156b 100644 --- a/.github/workflows/test-and-zip-default-themes.yml +++ b/.github/workflows/test-and-zip-default-themes.yml @@ -198,7 +198,7 @@ jobs: slack-notifications: name: Slack Notifications - uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk + uses: ./.github/workflows/slack-notifications.yml permissions: actions: read contents: read diff --git a/.github/workflows/test-build-processes.yml b/.github/workflows/test-build-processes.yml index a7b6e2f924650..bd0acbb4567b3 100644 --- a/.github/workflows/test-build-processes.yml +++ b/.github/workflows/test-build-processes.yml @@ -31,7 +31,7 @@ jobs: # Tests the WordPress Core build process on multiple operating systems. test-core-build-process: name: Core running from ${{ matrix.directory }} - uses: WordPress/wordpress-develop/.github/workflows/reusable-test-core-build-process.yml@trunk + uses: ./.github/workflows/reusable-test-core-build-process.yml permissions: contents: read if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} @@ -63,7 +63,7 @@ jobs: # See https://docs.github.com/en/actions/learn-github-actions/contexts#context-availability. test-core-build-process-macos: name: Core running from ${{ matrix.directory }} - uses: WordPress/wordpress-develop/.github/workflows/reusable-test-core-build-process.yml@trunk + uses: ./.github/workflows/reusable-test-core-build-process.yml permissions: contents: read if: ${{ github.repository == 'WordPress/wordpress-develop' }} @@ -79,7 +79,7 @@ jobs: # Tests the Gutenberg plugin build process on multiple operating systems when run within a wordpress-develop checkout. test-gutenberg-build-process: name: Gutenberg running from ${{ matrix.directory }} - uses: WordPress/wordpress-develop/.github/workflows/reusable-test-gutenberg-build-process.yml@trunk + uses: ./.github/workflows/reusable-test-gutenberg-build-process.yml permissions: contents: read if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} @@ -102,7 +102,7 @@ jobs: # See https://docs.github.com/en/actions/learn-github-actions/contexts#context-availability. test-gutenberg-build-process-macos: name: Gutenberg running from ${{ matrix.directory }} - uses: WordPress/wordpress-develop/.github/workflows/reusable-test-gutenberg-build-process.yml@trunk + uses: ./.github/workflows/reusable-test-gutenberg-build-process.yml permissions: contents: read if: ${{ github.repository == 'WordPress/wordpress-develop' }} @@ -117,7 +117,7 @@ jobs: slack-notifications: name: Slack Notifications - uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk + uses: ./.github/workflows/slack-notifications.yml permissions: actions: read contents: read diff --git a/.github/workflows/test-coverage.yml b/.github/workflows/test-coverage.yml index 3240671b8a29e..4ddfdeae80882 100644 --- a/.github/workflows/test-coverage.yml +++ b/.github/workflows/test-coverage.yml @@ -49,7 +49,7 @@ jobs: # test-coverage-report: name: ${{ matrix.multisite && 'Multisite' || 'Single site' }} report - uses: WordPress/wordpress-develop/.github/workflows/reusable-phpunit-tests-v3.yml@trunk + uses: ./.github/workflows/reusable-phpunit-tests-v3.yml permissions: contents: read if: ${{ github.repository == 'WordPress/wordpress-develop' }} @@ -67,7 +67,7 @@ jobs: slack-notifications: name: Slack Notifications - uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk + uses: ./.github/workflows/slack-notifications.yml permissions: actions: read contents: read diff --git a/.github/workflows/test-old-branches.yml b/.github/workflows/test-old-branches.yml index 85a7000bcfc8f..29c7aeac25eee 100644 --- a/.github/workflows/test-old-branches.yml +++ b/.github/workflows/test-old-branches.yml @@ -132,7 +132,7 @@ jobs: slack-notifications: name: Slack Notifications - uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk + uses: ./.github/workflows/slack-notifications.yml permissions: actions: read contents: read diff --git a/.github/workflows/upgrade-testing.yml b/.github/workflows/upgrade-testing.yml index 9ee2665b0bd6b..81037ba371c1b 100644 --- a/.github/workflows/upgrade-testing.yml +++ b/.github/workflows/upgrade-testing.yml @@ -57,7 +57,7 @@ jobs: # Tests the full list of PHP/MySQL combinations for the last two versions of WordPress. upgrade-tests-last-two-releases: name: ${{ matrix.wp }} to ${{ inputs.new-version && inputs.new-version || 'latest' }} - uses: WordPress/wordpress-develop/.github/workflows/reusable-upgrade-testing.yml@trunk + uses: ./.github/workflows/reusable-upgrade-testing.yml if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} permissions: contents: read @@ -94,7 +94,7 @@ jobs: # Tests the remaining 6.x releases on the oldest and newest supported versions of PHP 7 & 8. upgrade-tests-wp-6x-mysql: name: ${{ matrix.wp }} to ${{ inputs.new-version && inputs.new-version || 'latest' }} - uses: WordPress/wordpress-develop/.github/workflows/reusable-upgrade-testing.yml@trunk + uses: ./.github/workflows/reusable-upgrade-testing.yml if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} permissions: contents: read @@ -126,7 +126,7 @@ jobs: # Tests 5.x releases where the WordPress database version changed on the oldest and newest supported versions of PHP 7. upgrade-tests-wp-5x-php-7x-mysql: name: ${{ matrix.wp }} to ${{ inputs.new-version && inputs.new-version || 'latest' }} - uses: WordPress/wordpress-develop/.github/workflows/reusable-upgrade-testing.yml@trunk + uses: ./.github/workflows/reusable-upgrade-testing.yml if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} strategy: fail-fast: false @@ -160,7 +160,7 @@ jobs: # - array/string offset with curly braces. upgrade-tests-wp-5x-php-8x-mysql: name: ${{ matrix.wp }} to ${{ inputs.new-version && inputs.new-version || 'latest' }} - uses: WordPress/wordpress-develop/.github/workflows/reusable-upgrade-testing.yml@trunk + uses: ./.github/workflows/reusable-upgrade-testing.yml if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} strategy: fail-fast: false @@ -185,7 +185,7 @@ jobs: # The oldest version of WordPress receiving security updates should always be tested. upgrade-tests-wp-4x-php-7x-mysql: name: ${{ matrix.wp }} to ${{ inputs.new-version && inputs.new-version || 'latest' }} - uses: WordPress/wordpress-develop/.github/workflows/reusable-upgrade-testing.yml@trunk + uses: ./.github/workflows/reusable-upgrade-testing.yml if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} strategy: fail-fast: false @@ -221,7 +221,7 @@ jobs: # - array/string offset with curly braces. upgrade-tests-wp-4x-php-8x-mysql: name: ${{ matrix.wp }} to ${{ inputs.new-version && inputs.new-version || 'latest' }} - uses: WordPress/wordpress-develop/.github/workflows/reusable-upgrade-testing.yml@trunk + uses: ./.github/workflows/reusable-upgrade-testing.yml if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} strategy: fail-fast: false @@ -245,7 +245,7 @@ jobs: # the full list of PHP/MySQL combinations. upgrade-tests-oldest-wp-mysql: name: ${{ matrix.wp }} to ${{ inputs.new-version && inputs.new-version || 'latest' }} - uses: WordPress/wordpress-develop/.github/workflows/reusable-upgrade-testing.yml@trunk + uses: ./.github/workflows/reusable-upgrade-testing.yml if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} strategy: fail-fast: false @@ -279,7 +279,7 @@ jobs: slack-notifications: name: Slack Notifications - uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk + uses: ./.github/workflows/slack-notifications.yml permissions: actions: read contents: read diff --git a/Gruntfile.js b/Gruntfile.js index 4f8a3d6aa2e76..10b3bcfbabb8d 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -456,6 +456,28 @@ module.exports = function(grunt) { } ); } } + }, + 'workflow-references-local-to-remote': { + options: { + processContent: function( src ) { + return src.replace( /uses: \.\/\.github\/workflows\/([^\.]+)\.yml/g, function( match, $1 ) { + return 'uses: WordPress/wordpress-develop/.github/workflows/' + $1 + '.yml@trunk'; + } ); + } + }, + src: '.github/workflows/*.yml', + dest: './' + }, + 'workflow-references-remote-to-local': { + options: { + processContent: function( src ) { + return src.replace( /uses: WordPress\/wordpress-develop\/\.github\/workflows\/([^\.]+)\.yml@trunk/g, function( match, $1 ) { + return 'uses: ./.github/workflows/' + $1 + '.yml'; + } ); + } + }, + src: '.github/workflows/*.yml', + dest: './' } }, sass: { @@ -1513,6 +1535,14 @@ module.exports = function(grunt) { 'copy:version', ] ); + grunt.registerTask( 'replace:workflow-references-local-to-remote', [ + 'copy:workflow-references-local-to-remote', + ]); + + grunt.registerTask( 'replace:workflow-references-remote-to-local', [ + 'copy:workflow-references-remote-to-local', + ]); + /** * Build verification tasks. */ From 396f6fbe4371affe13ba0eea4b88fb1e79d90902 Mon Sep 17 00:00:00 2001 From: Weston Ruter <westonruter@git.wordpress.org> Date: Tue, 21 Jan 2025 21:24:59 +0000 Subject: [PATCH 210/323] Menus: Improve performance by calling `get_privacy_policy_url()` once per `Walker_Nav_Menu` instance rather than for every nav menu item. The `start_el()` method in `Walker_Nav_Menu` was calling `get_privacy_policy_url()` for every menu item when building menus. This resulted in redundant queries, particularly for menus with many items. This obtains the `get_privacy_policy_url()` value in the constructor for reuse in the `start_el()` method to improve performance. Redundant code to construct the privacy policy page is also refactored into the `set_up()` method during tests. Props arzola, swissspidy, westonruter, mukesh27. Fixes #62818. git-svn-id: https://develop.svn.wordpress.org/trunk@59674 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-walker-nav-menu.php | 19 +++++- tests/phpunit/tests/menu/walker-nav-menu.php | 64 ++++++++------------ 2 files changed, 44 insertions(+), 39 deletions(-) diff --git a/src/wp-includes/class-walker-nav-menu.php b/src/wp-includes/class-walker-nav-menu.php index 2b06d54b4460a..3d9f442bb8e87 100644 --- a/src/wp-includes/class-walker-nav-menu.php +++ b/src/wp-includes/class-walker-nav-menu.php @@ -39,6 +39,23 @@ class Walker_Nav_Menu extends Walker { 'id' => 'db_id', ); + /** + * The URL to the privacy policy page. + * + * @since 6.8.0 + * @var string + */ + private $privacy_policy_url; + + /** + * Constructor. + * + * @since 6.8.0 + */ + public function __construct() { + $this->privacy_policy_url = get_privacy_policy_url(); + } + /** * Starts the list before the elements are added. * @@ -236,7 +253,7 @@ public function start_el( &$output, $data_object, $depth = 0, $args = null, $cur $atts['rel'] = ! empty( $menu_item->xfn ) ? $menu_item->xfn : ''; if ( ! empty( $menu_item->url ) ) { - if ( get_privacy_policy_url() === $menu_item->url ) { + if ( $this->privacy_policy_url === $menu_item->url ) { $atts['rel'] = empty( $atts['rel'] ) ? 'privacy-policy' : $atts['rel'] . ' privacy-policy'; } diff --git a/tests/phpunit/tests/menu/walker-nav-menu.php b/tests/phpunit/tests/menu/walker-nav-menu.php index 053ab715486ec..3ff725cbb0228 100644 --- a/tests/phpunit/tests/menu/walker-nav-menu.php +++ b/tests/phpunit/tests/menu/walker-nav-menu.php @@ -17,6 +17,13 @@ class Tests_Menu_Walker_Nav_Menu extends WP_UnitTestCase { */ private $orig_wp_nav_menu_max_depth; + /** + * The ID of the privacy policy page. + * + * @var int + */ + private $privacy_policy_id; + /** * Setup. */ @@ -27,6 +34,19 @@ public function set_up() { /** Walker_Nav_Menu class */ require_once ABSPATH . 'wp-includes/class-walker-nav-menu.php'; + + $post_id = self::factory()->post->create( + array( + 'post_type' => 'page', + 'post_title' => 'Test Privacy Policy', + 'post_status' => 'publish', + ) + ); + + // Set the privacy policy page. + update_option( 'wp_page_for_privacy_policy', $post_id ); + $this->privacy_policy_id = (int) get_option( 'wp_page_for_privacy_policy' ); + $this->walker = new Walker_Nav_Menu(); $this->orig_wp_nav_menu_max_depth = $_wp_nav_menu_max_depth; @@ -39,6 +59,7 @@ public function tear_down() { global $_wp_nav_menu_max_depth; $_wp_nav_menu_max_depth = $this->orig_wp_nav_menu_max_depth; + delete_option( 'wp_page_for_privacy_policy' ); parent::tear_down(); } @@ -136,23 +157,12 @@ public function data_start_el_with_empty_attributes() { * @param string $target Optional. The target value. Default empty string. */ public function test_walker_nav_menu_start_el_should_add_rel_privacy_policy_to_privacy_policy_url( $expected, $xfn = '', $target = '' ) { - $post_id = self::factory()->post->create( - array( - 'post_type' => 'page', - 'post_title' => 'Test Privacy Policy', - 'post_status' => 'publish', - ) - ); - - // Set the privacy policy page. - update_option( 'wp_page_for_privacy_policy', $post_id ); - $privacy_policy_id = (int) get_option( 'wp_page_for_privacy_policy' ); $output = ''; $item = array( - 'ID' => $privacy_policy_id, - 'object_id' => $privacy_policy_id, + 'ID' => $this->privacy_policy_id, + 'object_id' => $this->privacy_policy_id, 'title' => 'Privacy Policy', 'target' => $target, 'xfn' => $xfn, @@ -251,23 +261,12 @@ public function test_walker_nav_menu_start_el_should_not_add_rel_privacy_policy_ * @covers Walker_Nav_Menu::start_el */ public function test_walker_nav_menu_start_el_should_not_add_rel_privacy_policy_when_no_url_is_passed() { - $post_id = self::factory()->post->create( - array( - 'post_type' => 'page', - 'post_title' => 'Test Privacy Policy', - 'post_status' => 'publish', - ) - ); - - // Set the privacy policy page. - update_option( 'wp_page_for_privacy_policy', $post_id ); - $privacy_policy_id = (int) get_option( 'wp_page_for_privacy_policy' ); $output = ''; $item = array( - 'ID' => $privacy_policy_id, - 'object_id' => $privacy_policy_id, + 'ID' => $this->privacy_policy_id, + 'object_id' => $this->privacy_policy_id, 'title' => 'Privacy Policy', 'target' => '', 'xfn' => '', @@ -296,22 +295,11 @@ public function test_walker_nav_menu_start_el_should_not_add_rel_privacy_policy_ * @covers Walker_Nav_Menu::start_el */ public function test_walker_nav_menu_start_el_should_add_rel_privacy_policy_when_id_does_not_match_but_url_does() { - $post_id = self::factory()->post->create( - array( - 'post_type' => 'page', - 'post_title' => 'Test Privacy Policy', - 'post_status' => 'publish', - ) - ); - - // Set the privacy policy page. - update_option( 'wp_page_for_privacy_policy', $post_id ); - $privacy_policy_id = (int) get_option( 'wp_page_for_privacy_policy' ); $output = ''; // Ensure the ID does not match the privacy policy. - $not_privacy_policy_id = $privacy_policy_id - 1; + $not_privacy_policy_id = $this->privacy_policy_id - 1; $item = array( 'ID' => $not_privacy_policy_id, From 61b7b9713ef6a71126c3739a929ce604762de1bf Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Tue, 21 Jan 2025 21:47:27 +0000 Subject: [PATCH 211/323] Themes: Remove title attributes from theme list tables. This changeset updates the old list tables for themes and theme installation to remove `title` attributes or replace them with a more acessible implementation: - Removes `title` attributes from `span` elements - Replaces `title` with `aria-label` for links whose visible text starts with the same word, consistently with links on the "Add Plugins" screen - Reuses the `$preview_title` variable to keep ARIA labels consistent for both Preview links Follow-up to [22439], [27548], [31513], [32991], [50804], [53414]. Props karlgroves, sabernhardt, audrasjb, alh0319. Fixes #62834. See #24766. git-svn-id: https://develop.svn.wordpress.org/trunk@59675 602fd350-edb4-49c9-b593-d223f7449a82 --- .../class-wp-theme-install-list-table.php | 19 ++++++++----------- .../includes/class-wp-themes-list-table.php | 2 +- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/wp-admin/includes/class-wp-theme-install-list-table.php b/src/wp-admin/includes/class-wp-theme-install-list-table.php index bf2d2fb34d36a..7e00005ba4372 100644 --- a/src/wp-admin/includes/class-wp-theme-install-list-table.php +++ b/src/wp-admin/includes/class-wp-theme-install-list-table.php @@ -315,7 +315,7 @@ public function single_row( $theme ) { switch ( $status ) { case 'update_available': $actions[] = sprintf( - '<a class="install-now" href="%s" title="%s">%s</a>', + '<a class="install-now" href="%s" aria-label="%s">%s</a>', esc_url( wp_nonce_url( $update_url, 'upgrade-theme_' . $theme->slug ) ), /* translators: %s: Theme version. */ esc_attr( sprintf( __( 'Update to version %s' ), $theme->version ) ), @@ -325,15 +325,14 @@ public function single_row( $theme ) { case 'newer_installed': case 'latest_installed': $actions[] = sprintf( - '<span class="install-now" title="%s">%s</span>', - esc_attr__( 'This theme is already installed and is up to date' ), + '<span class="install-now">%s</span>', _x( 'Installed', 'theme' ) ); break; case 'install': default: $actions[] = sprintf( - '<a class="install-now" href="%s" title="%s">%s</a>', + '<a class="install-now" href="%s" aria-label="%s">%s</a>', esc_url( wp_nonce_url( $install_url, 'install-theme_' . $theme->slug ) ), /* translators: %s: Theme name. */ esc_attr( sprintf( _x( 'Install %s', 'theme' ), $name ) ), @@ -343,10 +342,9 @@ public function single_row( $theme ) { } $actions[] = sprintf( - '<a class="install-theme-preview" href="%s" title="%s">%s</a>', + '<a class="install-theme-preview" href="%s" aria-label="%s">%s</a>', esc_url( $preview_url ), - /* translators: %s: Theme name. */ - esc_attr( sprintf( __( 'Preview %s' ), $name ) ), + esc_attr( $preview_title ), __( 'Preview' ) ); @@ -363,7 +361,7 @@ public function single_row( $theme ) { $actions = apply_filters( 'theme_install_actions', $actions, $theme ); ?> - <a class="screenshot install-theme-preview" href="<?php echo esc_url( $preview_url ); ?>" title="<?php echo esc_attr( $preview_title ); ?>"> + <a class="screenshot install-theme-preview" href="<?php echo esc_url( $preview_url ); ?>" aria-label="<?php echo esc_attr( $preview_title ); ?>"> <img src="<?php echo esc_url( $theme->screenshot_url . '?ver=' . $theme->version ); ?>" width="150" alt="" /> </a> @@ -474,7 +472,7 @@ public function install_theme_info( $theme ) { switch ( $status ) { case 'update_available': printf( - '<a class="theme-install button button-primary" href="%s" title="%s">%s</a>', + '<a class="theme-install button button-primary" href="%s" aria-label="%s">%s</a>', esc_url( wp_nonce_url( $update_url, 'upgrade-theme_' . $theme->slug ) ), /* translators: %s: Theme version. */ esc_attr( sprintf( __( 'Update to version %s' ), $theme->version ) ), @@ -484,8 +482,7 @@ public function install_theme_info( $theme ) { case 'newer_installed': case 'latest_installed': printf( - '<span class="theme-install" title="%s">%s</span>', - esc_attr__( 'This theme is already installed and is up to date' ), + '<span class="theme-install">%s</span>', _x( 'Installed', 'theme' ) ); break; diff --git a/src/wp-admin/includes/class-wp-themes-list-table.php b/src/wp-admin/includes/class-wp-themes-list-table.php index 53b34e93f99b7..b17fb912d26dc 100644 --- a/src/wp-admin/includes/class-wp-themes-list-table.php +++ b/src/wp-admin/includes/class-wp-themes-list-table.php @@ -211,7 +211,7 @@ public function display_rows() { $actions = array(); $actions['activate'] = sprintf( - '<a href="%s" class="activatelink" title="%s">%s</a>', + '<a href="%s" class="activatelink" aria-label="%s">%s</a>', $activate_link, /* translators: %s: Theme name. */ esc_attr( sprintf( _x( 'Activate &#8220;%s&#8221;', 'theme' ), $title ) ), From eb50dd7cbf8bcbeda7521e1c152103d9d0c82009 Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Tue, 21 Jan 2025 22:36:50 +0000 Subject: [PATCH 212/323] Customize: Show sidebar's description below its name in Customizer Widgets sidebar list. This is part of an effort to reduce `title` attribute usage in WordPress Admin. This changeset updates the Customizer Widgets sidebar list to show sidebar name and description (as these informations may benefit to everyone), and remove the `title` attribute. Follow-up to [22439], [27548], [31513], [32991], [50804], [53414], [59675]. Props karlgroves, sabernhardt, mukesh27, joedolson. Fixes #62836. See #24766. git-svn-id: https://develop.svn.wordpress.org/trunk@59676 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-customize-widgets.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/class-wp-customize-widgets.php b/src/wp-includes/class-wp-customize-widgets.php index 98c6944478804..3db46ad088758 100644 --- a/src/wp-includes/class-wp-customize-widgets.php +++ b/src/wp-includes/class-wp-customize-widgets.php @@ -733,7 +733,10 @@ public function enqueue_scripts() { <p class="description">{description}</p> <ul class="widget-area-select"> <% _.each( sidebars, function ( sidebar ){ %> - <li class="" data-id="<%- sidebar.id %>" title="<%- sidebar.description %>" tabindex="0"><%- sidebar.name %></li> + <li class="" data-id="<%- sidebar.id %>" tabindex="0"> + <div><strong><%- sidebar.name %></strong></div> + <div><%- sidebar.description %></div> + </li> <% }); %> </ul> <div class="move-widget-actions"> From 0f2334da8111913a2a78c5000f27f791bb405f0f Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Tue, 21 Jan 2025 22:57:04 +0000 Subject: [PATCH 213/323] Formatting: Preserve `target="_blank"` in Biographical Info and Category Description. This changeset ensures the `target="_blank"` attribute is preserved when adding links in the Biographical Info and Category Description fields. Previously, this attribute was being stripped by the KSES sanitization process. Additionally, new unit tests have been added to verify the preservation of the `target="_blank"` attribute in these specific contexts. Props lovewpmu, miqrogroove, bsutcliffe, sjefen6, nofearinc, nacin, harmr, blogitsolutions, stefahn, nirajgirixd, martinkrcho, spacedmonkey, sukhendu2002, audrasjb, gaellebesson, nuryko, guillaumeturpin, maximemeganck, ranafge, azaozz, joedolson, rinkalpagdar, mikinc860. Fixes #12056. git-svn-id: https://develop.svn.wordpress.org/trunk@59677 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/kses.php | 6 ++- tests/phpunit/tests/kses.php | 72 ++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/kses.php b/src/wp-includes/kses.php index cd30d845f83af..ebb4a761b1150 100644 --- a/src/wp-includes/kses.php +++ b/src/wp-includes/kses.php @@ -895,9 +895,11 @@ function wp_kses_allowed_html( $context = '' ) { return $tags; case 'user_description': + case 'pre_term_description': case 'pre_user_description': - $tags = $allowedtags; - $tags['a']['rel'] = true; + $tags = $allowedtags; + $tags['a']['rel'] = true; + $tags['a']['target'] = true; /** This filter is documented in wp-includes/kses.php */ return apply_filters( 'wp_kses_allowed_html', $tags, $context ); diff --git a/tests/phpunit/tests/kses.php b/tests/phpunit/tests/kses.php index b5cca81047172..16d447fd4cfab 100644 --- a/tests/phpunit/tests/kses.php +++ b/tests/phpunit/tests/kses.php @@ -2244,4 +2244,76 @@ public function data_kses_globals_are_defined() { return $this->text_array_to_dataprovider( $required_kses_globals ); } + + /** + * Tests that the target attribute is preserved in various contexts. + * + * @dataProvider data_target_attribute_preserved_in_descriptions + * + * @ticket 12056 + * + * @param string $context The context to test ('user_description' or 'pre_term_description'). + * @param string $input The input HTML string. + * @param string $expected The expected output HTML string. + */ + public function test_target_attribute_preserved_in_context( $context, $input, $expected ) { + $allowed = wp_kses_allowed_html( $context ); + $this->assertTrue( isset( $allowed['a']['target'] ), "Target attribute not allowed in {$context}" ); + $this->assertEquals( $expected, wp_kses( $input, $context ) ); + } + + /** + * Data provider for test_target_attribute_preserved_in_context. + * + * @return array + */ + public function data_target_attribute_preserved_in_descriptions() { + return array( + array( + 'user_description', + '<a href="https://example.com" target="_blank">Example</a>', + '<a href="https://example.com" target="_blank">Example</a>', + ), + array( + 'pre_term_description', + '<a href="https://example.com" target="_blank">Example</a>', + '<a href="https://example.com" target="_blank">Example</a>', + ), + ); + } + + /** + * Tests that specific attributes are preserved in various contexts. + * + * @dataProvider data_allowed_attributes_in_descriptions + * + * @ticket 12056 + * + * @param string $context The context to test ('user_description' or 'pre_term_description'). + * @param array $attributes List of attributes to check for. + */ + public function test_specific_attributes_preserved_in_context( $context, $attributes ) { + $allowed = wp_kses_allowed_html( $context ); + foreach ( $attributes as $attribute ) { + $this->assertTrue( isset( $allowed['a'][ $attribute ] ), "{$attribute} attribute not allowed in {$context}" ); + } + } + + /** + * Data provider for test_specific_attributes_preserved_in_context. + * + * @return array + */ + public function data_allowed_attributes_in_descriptions() { + return array( + array( + 'user_description', + array( 'target', 'href', 'rel' ), + ), + array( + 'pre_term_description', + array( 'target', 'href', 'rel' ), + ), + ); + } } From c7cd04c7b708a9a122776325c0592c144063412f Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Wed, 22 Jan 2025 14:04:34 +0000 Subject: [PATCH 214/323] General: Stop direct loading of files in `/wp-admin` that should only be included. This changeset restricts direct access call in `/wp-admin` and its sub directories. Follow-up to [11768]. Props deepakrohilla. See #61314. git-svn-id: https://develop.svn.wordpress.org/trunk@59678 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/admin-functions.php | 5 +++++ src/wp-admin/admin-header.php | 5 +++++ src/wp-admin/custom-background.php | 5 +++++ src/wp-admin/custom-header.php | 5 +++++ src/wp-admin/menu-header.php | 5 +++++ src/wp-admin/menu.php | 5 +++++ src/wp-admin/network/menu.php | 5 +++++ src/wp-admin/options-head.php | 5 +++++ src/wp-admin/user/menu.php | 5 +++++ 9 files changed, 45 insertions(+) diff --git a/src/wp-admin/admin-functions.php b/src/wp-admin/admin-functions.php index a9ff3f44b99f7..6ce4e06c47007 100644 --- a/src/wp-admin/admin-functions.php +++ b/src/wp-admin/admin-functions.php @@ -9,6 +9,11 @@ * @subpackage Administration */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + _deprecated_file( basename( __FILE__ ), '2.5.0', 'wp-admin/includes/admin.php' ); /** WordPress Administration API: Includes all Administration functions. */ diff --git a/src/wp-admin/admin-header.php b/src/wp-admin/admin-header.php index 235468f1461c0..54bcc11ca55b3 100644 --- a/src/wp-admin/admin-header.php +++ b/src/wp-admin/admin-header.php @@ -6,6 +6,11 @@ * @subpackage Administration */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + header( 'Content-Type: ' . get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ) ); if ( ! defined( 'WP_ADMIN' ) ) { require_once __DIR__ . '/admin.php'; diff --git a/src/wp-admin/custom-background.php b/src/wp-admin/custom-background.php index 37b8c3d8b8403..bbd56bdb6cee2 100644 --- a/src/wp-admin/custom-background.php +++ b/src/wp-admin/custom-background.php @@ -9,6 +9,11 @@ * @subpackage Administration */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + _deprecated_file( basename( __FILE__ ), '5.3.0', 'wp-admin/includes/class-custom-background.php' ); /** Custom_Background class */ diff --git a/src/wp-admin/custom-header.php b/src/wp-admin/custom-header.php index d89f03bbaab2a..31c78dcb5b372 100644 --- a/src/wp-admin/custom-header.php +++ b/src/wp-admin/custom-header.php @@ -9,6 +9,11 @@ * @subpackage Administration */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + _deprecated_file( basename( __FILE__ ), '5.3.0', 'wp-admin/includes/class-custom-image-header.php' ); /** Custom_Image_Header class */ diff --git a/src/wp-admin/menu-header.php b/src/wp-admin/menu-header.php index 878779d325ec9..9887dcb9964c6 100644 --- a/src/wp-admin/menu-header.php +++ b/src/wp-admin/menu-header.php @@ -6,6 +6,11 @@ * @subpackage Administration */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + /** * The current page. * diff --git a/src/wp-admin/menu.php b/src/wp-admin/menu.php index 3f0a773414a1a..5726570da6b8a 100644 --- a/src/wp-admin/menu.php +++ b/src/wp-admin/menu.php @@ -6,6 +6,11 @@ * @subpackage Administration */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + /** * Constructs the admin menu. * diff --git a/src/wp-admin/network/menu.php b/src/wp-admin/network/menu.php index 73cc86b23484d..852c36004cbab 100644 --- a/src/wp-admin/network/menu.php +++ b/src/wp-admin/network/menu.php @@ -7,6 +7,11 @@ * @since 3.1.0 */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + /* translators: Network menu item. */ $menu[2] = array( __( 'Dashboard' ), 'manage_network', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'dashicons-dashboard' ); diff --git a/src/wp-admin/options-head.php b/src/wp-admin/options-head.php index 9dba3703c5ad7..c951b77419505 100644 --- a/src/wp-admin/options-head.php +++ b/src/wp-admin/options-head.php @@ -8,6 +8,11 @@ * @subpackage Administration */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + $action = ! empty( $_REQUEST['action'] ) ? sanitize_text_field( $_REQUEST['action'] ) : ''; if ( isset( $_GET['updated'] ) && isset( $_GET['page'] ) ) { diff --git a/src/wp-admin/user/menu.php b/src/wp-admin/user/menu.php index 23e81a892c273..587d0ec1762dc 100644 --- a/src/wp-admin/user/menu.php +++ b/src/wp-admin/user/menu.php @@ -7,6 +7,11 @@ * @since 3.1.0 */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + $menu[2] = array( __( 'Dashboard' ), 'exist', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'dashicons-dashboard' ); $menu[4] = array( '', 'exist', 'separator1', '', 'wp-menu-separator' ); From 8209135dfc327dc24a274efb0d3f01381e48c739 Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Wed, 22 Jan 2025 15:13:21 +0000 Subject: [PATCH 215/323] Build/Test Tools: Improve the security and correctness of the GitHub Actions workflows files. This includes removing use of dangerous inline GitHub Actions expressions, preventing word splitting, further tightening permissions, and generally improving many aspects of the workflows. This also introduces a new workflow that runs Actionlint to detect incorrect and insecure code and configuration in workflow files. Props johnbillion, swissspidy, flixos90, desrosj. See #62221 git-svn-id: https://develop.svn.wordpress.org/trunk@59679 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/coding-standards.yml | 2 +- .github/workflows/end-to-end-tests.yml | 2 +- .github/workflows/failed-workflow.yml | 6 +- .github/workflows/install-testing.yml | 14 +-- .github/workflows/javascript-tests.yml | 2 +- .../workflows/local-docker-environment.yml | 3 +- .github/workflows/performance.yml | 2 +- .github/workflows/php-compatibility.yml | 2 +- .github/workflows/phpunit-tests.yml | 6 +- .github/workflows/props-bot.yml | 4 +- .github/workflows/pull-request-comments.yml | 4 +- .../reusable-cleanup-pull-requests.yml | 18 ++-- .../reusable-coding-standards-javascript.yml | 5 ++ .../reusable-coding-standards-php.yml | 9 +- .../workflows/reusable-end-to-end-tests.yml | 22 +++-- .../workflows/reusable-javascript-tests.yml | 5 ++ .github/workflows/reusable-performance.yml | 88 ++++++++++--------- .../workflows/reusable-php-compatibility.yml | 9 +- .../workflows/reusable-phpunit-tests-v1.yml | 30 +++++-- .../workflows/reusable-phpunit-tests-v2.yml | 35 ++++---- .../workflows/reusable-phpunit-tests-v3.yml | 35 ++++++-- .../reusable-support-json-reader-v1.yml | 53 ++++++++--- .../reusable-test-core-build-process.yml | 15 +++- .../reusable-test-gutenberg-build-process.yml | 10 ++- ...sable-test-local-docker-environment-v1.yml | 13 ++- .../workflows/reusable-upgrade-testing.yml | 22 ++++- .github/workflows/reusable-workflow-lint.yml | 34 +++++++ .github/workflows/slack-notifications.yml | 45 ++++++---- .../workflows/test-and-zip-default-themes.yml | 7 +- .github/workflows/upgrade-testing.yml | 10 --- .github/workflows/workflow-lint.yml | 39 ++++++++ docker-compose.yml | 31 ++++--- 32 files changed, 407 insertions(+), 175 deletions(-) create mode 100644 .github/workflows/reusable-workflow-lint.yml create mode 100644 .github/workflows/workflow-lint.yml diff --git a/.github/workflows/coding-standards.yml b/.github/workflows/coding-standards.yml index 9d68d091e91ac..70c3cee09a3ad 100644 --- a/.github/workflows/coding-standards.yml +++ b/.github/workflows/coding-standards.yml @@ -107,6 +107,6 @@ jobs: workflow_id: 'failed-workflow.yml', ref: 'trunk', inputs: { - run_id: '${{ github.run_id }}' + run_id: context.runId, } }); diff --git a/.github/workflows/end-to-end-tests.yml b/.github/workflows/end-to-end-tests.yml index fe516381eb5c1..5ec1763193bfa 100644 --- a/.github/workflows/end-to-end-tests.yml +++ b/.github/workflows/end-to-end-tests.yml @@ -93,6 +93,6 @@ jobs: workflow_id: 'failed-workflow.yml', ref: 'trunk', inputs: { - run_id: '${{ github.run_id }}' + run_id: context.runId, } }); diff --git a/.github/workflows/failed-workflow.yml b/.github/workflows/failed-workflow.yml index 383800a3fc592..fb9b3e099809a 100644 --- a/.github/workflows/failed-workflow.yml +++ b/.github/workflows/failed-workflow.yml @@ -38,7 +38,7 @@ jobs: const workflow_run = await github.rest.actions.getWorkflowRun({ owner: context.repo.owner, repo: context.repo.repo, - run_id: ${{ inputs.run_id }}, + run_id: process.env.RUN_ID, }); // Only rerun after the first run attempt. @@ -49,6 +49,8 @@ jobs: const rerun = await github.rest.actions.reRunWorkflowFailedJobs({ owner: context.repo.owner, repo: context.repo.repo, - run_id: ${{ inputs.run_id }}, + run_id: process.env.RUN_ID, enable_debug_logging: true }); + env: + RUN_ID: ${{ inputs.run_id }} diff --git a/.github/workflows/install-testing.yml b/.github/workflows/install-testing.yml index 4f3a79aa8fe1f..8275b3851cb00 100644 --- a/.github/workflows/install-testing.yml +++ b/.github/workflows/install-testing.yml @@ -119,16 +119,20 @@ jobs: with: php-version: '${{ matrix.php }}' coverage: none - tools: wp-cli${{ contains( fromJSON('["5.4", "5.5"]'), matrix.php ) && ':2.4.0' || '' }} + tools: ${{ contains( fromJSON('["5.4", "5.5"]'), matrix.php ) && 'wp-cli:2.4.0' || 'wp-cli' }} - name: Download WordPress - run: wp core download ${{ inputs.wp-version && format( '--version={0}', inputs.wp-version ) || '--version=nightly' }} + run: wp core download --version="${WP_VERSION}" + env: + WP_VERSION: ${{ inputs.wp-version || 'nightly' }} - name: Create wp-config.php file - run: wp config create --dbname=test_db --dbuser=root --dbpass=root --dbhost=127.0.0.1:${{ job.services.database.ports['3306'] }} + run: wp config create --dbname=test_db --dbuser=root --dbpass=root --dbhost="127.0.0.1:${DB_PORT}" + env: + DB_PORT: ${{ job.services.database.ports['3306'] }} - name: Install WordPress - run: wp core ${{ matrix.multisite && 'multisite-' || '' }}install --url=http://localhost/ --title="Upgrade Test" --admin_user=admin --admin_password=password --admin_email=me@example.org --skip-email + run: wp core ${{ matrix.multisite && 'multisite-install' || 'install' }} --url=http://localhost/ --title="Upgrade Test" --admin_user=admin --admin_password=password --admin_email=me@example.org --skip-email slack-notifications: name: Slack Notifications @@ -175,6 +179,6 @@ jobs: workflow_id: 'failed-workflow.yml', ref: 'trunk', inputs: { - run_id: '${{ github.run_id }}' + run_id: context.runId, } }); diff --git a/.github/workflows/javascript-tests.yml b/.github/workflows/javascript-tests.yml index e2766e6fa83d1..db965045cfafb 100644 --- a/.github/workflows/javascript-tests.yml +++ b/.github/workflows/javascript-tests.yml @@ -97,6 +97,6 @@ jobs: workflow_id: 'failed-workflow.yml', ref: 'trunk', inputs: { - run_id: '${{ github.run_id }}' + run_id: context.runId, } }); diff --git a/.github/workflows/local-docker-environment.yml b/.github/workflows/local-docker-environment.yml index 61676269b170c..bed8d57cb0abe 100644 --- a/.github/workflows/local-docker-environment.yml +++ b/.github/workflows/local-docker-environment.yml @@ -104,7 +104,6 @@ jobs: db-type: 'mysql' db-version: ${{ matrix.db-version }} memcached: ${{ matrix.memcached }} - tests-domain: ${{ matrix.tests-domain }} slack-notifications: name: Slack Notifications @@ -151,6 +150,6 @@ jobs: workflow_id: 'failed-workflow.yml', ref: 'trunk', inputs: { - run_id: '${{ github.run_id }}' + run_id: context.runId, } }); diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index 731d1719178df..66188564e7f94 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -93,6 +93,6 @@ jobs: workflow_id: 'failed-workflow.yml', ref: 'trunk', inputs: { - run_id: '${{ github.run_id }}' + run_id: context.runId, } }); diff --git a/.github/workflows/php-compatibility.yml b/.github/workflows/php-compatibility.yml index 3dbd97b7be732..69815a55daab5 100644 --- a/.github/workflows/php-compatibility.yml +++ b/.github/workflows/php-compatibility.yml @@ -94,6 +94,6 @@ jobs: workflow_id: 'failed-workflow.yml', ref: 'trunk', inputs: { - run_id: '${{ github.run_id }}' + run_id: context.runId, } }); diff --git a/.github/workflows/phpunit-tests.yml b/.github/workflows/phpunit-tests.yml index 8c5e3257222bf..9dd2c0e9e4642 100644 --- a/.github/workflows/phpunit-tests.yml +++ b/.github/workflows/phpunit-tests.yml @@ -144,7 +144,7 @@ jobs: multisite: ${{ matrix.multisite }} memcached: ${{ matrix.memcached }} phpunit-config: ${{ matrix.multisite && 'tests/phpunit/multisite.xml' || 'phpunit.xml.dist' }} - report: ${{ matrix.report || false }} + report: ${{ false }} # # Creates PHPUnit test jobs to test MariaDB and MySQL innovation releases. @@ -193,7 +193,7 @@ jobs: multisite: ${{ matrix.multisite }} memcached: ${{ matrix.memcached }} phpunit-config: ${{ matrix.multisite && 'tests/phpunit/multisite.xml' || 'phpunit.xml.dist' }} - report: ${{ matrix.report || false }} + report: ${{ false }} # # Runs specific individual test groups. @@ -263,6 +263,6 @@ jobs: workflow_id: 'failed-workflow.yml', ref: 'trunk', inputs: { - run_id: '${{ github.run_id }}' + run_id: context.runId, } }); diff --git a/.github/workflows/props-bot.yml b/.github/workflows/props-bot.yml index 548f9023a92e2..474213062e44f 100644 --- a/.github/workflows/props-bot.yml +++ b/.github/workflows/props-bot.yml @@ -85,6 +85,8 @@ jobs: github.rest.issues.removeLabel({ owner: context.repo.owner, repo: context.repo.repo, - issue_number: '${{ github.event.number }}', + issue_number: process.env.ISSUE_NUMBER, name: 'props-bot' }); + env: + ISSUE_NUMBER: ${{ github.event.number }} diff --git a/.github/workflows/pull-request-comments.yml b/.github/workflows/pull-request-comments.yml index ab7eba9ceffaa..df060fc657f1b 100644 --- a/.github/workflows/pull-request-comments.yml +++ b/.github/workflows/pull-request-comments.yml @@ -96,7 +96,7 @@ jobs: const artifacts = await github.rest.actions.listWorkflowRunArtifacts( { owner: context.repo.owner, repo: context.repo.repo, - run_id: ${{ github.event.workflow_run.id }}, + run_id: process.env.RUN_ID, } ); const matchArtifact = artifacts.data.artifacts.filter( ( artifact ) => { @@ -117,6 +117,8 @@ jobs: const fs = require( 'fs' ); fs.writeFileSync( '${{github.workspace}}/pr-number.zip', Buffer.from( download.data ) ) + env: + RUN_ID: ${{ github.event.workflow_run.id }} - name: Unzip the artifact containing the PR number run: unzip pr-number.zip diff --git a/.github/workflows/reusable-cleanup-pull-requests.yml b/.github/workflows/reusable-cleanup-pull-requests.yml index c63bab2d67751..8c49236782dd2 100644 --- a/.github/workflows/reusable-cleanup-pull-requests.yml +++ b/.github/workflows/reusable-cleanup-pull-requests.yml @@ -29,21 +29,19 @@ jobs: steps: - name: Find fixed ticket numbers id: trac-tickets + env: + COMMIT_MSG_RAW: ${{ github.event.head_commit.message }} run: | - COMMIT_MESSAGE=$(cat <<'EOF' | sed -n '/^Fixes #/,/\./p' - ${{ github.event.head_commit.message }} - EOF - ) - echo "fixed_list=$(echo \"$COMMIT_MESSAGE\" | sed -n 's/.*Fixes #\([0-9]\+\).*/\1/p' | tr '\n' ' ')" >> $GITHUB_OUTPUT + COMMIT_MESSAGE="$(echo "$COMMIT_MSG_RAW" | sed -n '/^Fixes #/,/\./p')" + echo "fixed_list=$(echo "$COMMIT_MESSAGE" | sed -n 's/.*Fixes #\([0-9]\+\).*/\1/p' | tr '\n' ' ')" >> "$GITHUB_OUTPUT" - name: Get the SVN revision id: git-svn-id + env: + COMMIT_MSG_RAW: ${{ github.event.head_commit.message }} run: | - COMMIT_MESSAGE=$(cat <<'EOF' | sed -n '$p' - ${{ github.event.head_commit.message }} - EOF - ) - echo "svn_revision_number=$(echo \"$COMMIT_MESSAGE\" | sed -n 's/.*git-svn-id: https:\/\/develop.svn.wordpress.org\/[^@]*@\([0-9]*\) .*/\1/p')" >> $GITHUB_OUTPUT + COMMIT_MESSAGE="$(echo "$COMMIT_MSG_RAW" | sed -n '$p')" + echo "svn_revision_number=$(echo "$COMMIT_MESSAGE" | sed -n 's/.*git-svn-id: https:\/\/develop.svn.wordpress.org\/[^@]*@\([0-9]*\) .*/\1/p')" >> "$GITHUB_OUTPUT" - name: Find pull requests id: linked-prs diff --git a/.github/workflows/reusable-coding-standards-javascript.yml b/.github/workflows/reusable-coding-standards-javascript.yml index 156c201bc8f48..23c0be570bac7 100644 --- a/.github/workflows/reusable-coding-standards-javascript.yml +++ b/.github/workflows/reusable-coding-standards-javascript.yml @@ -9,6 +9,10 @@ on: env: PUPPETEER_SKIP_DOWNLOAD: ${{ true }} +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + jobs: # Runs the JavaScript coding standards checks. # @@ -33,6 +37,7 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + persist-credentials: false - name: Set up Node.js uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 diff --git a/.github/workflows/reusable-coding-standards-php.yml b/.github/workflows/reusable-coding-standards-php.yml index b07203797eb3e..28c09a42d1121 100644 --- a/.github/workflows/reusable-coding-standards-php.yml +++ b/.github/workflows/reusable-coding-standards-php.yml @@ -17,6 +17,10 @@ on: type: 'boolean' default: false +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + jobs: # Runs the PHP coding standards checks. # @@ -45,6 +49,7 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + persist-credentials: false - name: Set up PHP uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1 @@ -57,7 +62,7 @@ jobs: # http://man7.org/linux/man-pages/man1/date.1.html - name: "Get last Monday's date" id: get-date - run: echo "date=$(/bin/date -u --date='last Mon' "+%F")" >> $GITHUB_OUTPUT + run: echo "date=$(/bin/date -u --date='last Mon' "+%F")" >> "$GITHUB_OUTPUT" - name: Cache PHPCS scan cache uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 @@ -75,7 +80,7 @@ jobs: custom-cache-suffix: ${{ steps.get-date.outputs.date }} - name: Make Composer packages available globally - run: echo "${PWD}/vendor/bin" >> $GITHUB_PATH + run: echo "${PWD}/vendor/bin" >> "$GITHUB_PATH" - name: Run PHPCS on all Core files id: phpcs-core diff --git a/.github/workflows/reusable-end-to-end-tests.yml b/.github/workflows/reusable-end-to-end-tests.yml index 1d2273bd588d7..38c8e93af7202 100644 --- a/.github/workflows/reusable-end-to-end-tests.yml +++ b/.github/workflows/reusable-end-to-end-tests.yml @@ -33,6 +33,10 @@ env: LOCAL_DIR: build LOCAL_PHP: ${{ inputs.php-version }}${{ 'latest' != inputs.php-version && '-fpm' || '' }} +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + jobs: # Runs the end-to-end test suite. # @@ -63,13 +67,14 @@ jobs: steps: - name: Configure environment variables run: | - echo "PHP_FPM_UID=$(id -u)" >> $GITHUB_ENV - echo "PHP_FPM_GID=$(id -g)" >> $GITHUB_ENV + echo "PHP_FPM_UID=$(id -u)" >> "$GITHUB_ENV" + echo "PHP_FPM_GID=$(id -g)" >> "$GITHUB_ENV" - name: Checkout repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + persist-credentials: false - name: Set up Node.js uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 @@ -117,13 +122,18 @@ jobs: - name: Install Gutenberg if: ${{ inputs.install-gutenberg }} - run: npm run env:cli -- plugin install gutenberg${{ inputs.gutenberg-version && format( ' --version={0}', inputs.gutenberg-version ) || '' }} --path=/var/www/${{ env.LOCAL_DIR }} + run: | + npm run env:cli -- plugin install gutenberg \ + ${{ inputs.gutenberg-version && '--version="${GUTENBERG_VERSION}"' || '' }} \ + --path="/var/www/${LOCAL_DIR}" + env: + GUTENBERG_VERSION: ${{ inputs.gutenberg-version }} - name: Install additional languages run: | - npm run env:cli -- language core install de_DE --path=/var/www/${{ env.LOCAL_DIR }} - npm run env:cli -- language plugin install de_DE --all --path=/var/www/${{ env.LOCAL_DIR }} - npm run env:cli -- language theme install de_DE --all --path=/var/www/${{ env.LOCAL_DIR }} + npm run env:cli -- language core install de_DE --path="/var/www/${LOCAL_DIR}" + npm run env:cli -- language plugin install de_DE --all --path="/var/www/${LOCAL_DIR}" + npm run env:cli -- language theme install de_DE --all --path="/var/www/${LOCAL_DIR}" - name: Run E2E tests run: npm run test:e2e diff --git a/.github/workflows/reusable-javascript-tests.yml b/.github/workflows/reusable-javascript-tests.yml index e88f510cdfdf3..944833d8ff550 100644 --- a/.github/workflows/reusable-javascript-tests.yml +++ b/.github/workflows/reusable-javascript-tests.yml @@ -12,6 +12,10 @@ on: type: 'boolean' default: false +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + jobs: # Runs the QUnit test suite. # @@ -34,6 +38,7 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + persist-credentials: false - name: Set up Node.js uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 diff --git a/.github/workflows/reusable-performance.yml b/.github/workflows/reusable-performance.yml index 0c2c61aafc7a5..e467d9ce850fe 100644 --- a/.github/workflows/reusable-performance.yml +++ b/.github/workflows/reusable-performance.yml @@ -64,6 +64,10 @@ env: LOCAL_PHP: ${{ inputs.php-version }}${{ 'latest' != inputs.php-version && '-fpm' || '' }} LOCAL_MULTISITE: ${{ inputs.multisite }} +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + jobs: # Performs the following steps: # - Configure environment variables. @@ -119,19 +123,20 @@ jobs: steps: - name: Configure environment variables run: | - echo "PHP_FPM_UID=$(id -u)" >> $GITHUB_ENV - echo "PHP_FPM_GID=$(id -g)" >> $GITHUB_ENV + echo "PHP_FPM_UID=$(id -u)" >> "$GITHUB_ENV" + echo "PHP_FPM_GID=$(id -g)" >> "$GITHUB_ENV" - name: Checkout repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} fetch-depth: ${{ github.event_name == 'workflow_dispatch' && '2' || '1' }} + persist-credentials: false # The `workflow_dispatch` event is the only one missing the needed SHA to target. - name: Retrieve previous commit SHA (if necessary) if: ${{ github.event_name == 'workflow_dispatch' }} - run: echo "TARGET_SHA=$(git rev-parse HEAD^1)" >> $GITHUB_ENV + run: echo "TARGET_SHA=$(git rev-parse HEAD^1)" >> "$GITHUB_ENV" - name: Set up Node.js uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 @@ -181,47 +186,47 @@ jobs: - name: Enable themes on Multisite if: ${{ inputs.multisite }} run: | - npm run env:cli -- theme enable twentytwentyone --network --path=/var/www/${{ env.LOCAL_DIR }} - npm run env:cli -- theme enable twentytwentythree --network --path=/var/www/${{ env.LOCAL_DIR }} - npm run env:cli -- theme enable twentytwentyfour --network --path=/var/www/${{ env.LOCAL_DIR }} - npm run env:cli -- theme enable twentytwentyfive --network --path=/var/www/${{ env.LOCAL_DIR }} + npm run env:cli -- theme enable twentytwentyone --network --path="/var/www/${LOCAL_DIR}" + npm run env:cli -- theme enable twentytwentythree --network --path="/var/www/${LOCAL_DIR}" + npm run env:cli -- theme enable twentytwentyfour --network --path="/var/www/${LOCAL_DIR}" + npm run env:cli -- theme enable twentytwentyfive --network --path="/var/www/${LOCAL_DIR}" - name: Install WordPress Importer plugin - run: npm run env:cli -- plugin install wordpress-importer --activate --path=/var/www/${{ env.LOCAL_DIR }} + run: npm run env:cli -- plugin install wordpress-importer --activate --path="/var/www/${LOCAL_DIR}" - name: Import mock data run: | curl -O https://raw.githubusercontent.com/WordPress/theme-test-data/b9752e0533a5acbb876951a8cbb5bcc69a56474c/themeunittestdata.wordpress.xml - npm run env:cli -- import themeunittestdata.wordpress.xml --authors=create --path=/var/www/${{ env.LOCAL_DIR }} + npm run env:cli -- import themeunittestdata.wordpress.xml --authors=create --path="/var/www/${LOCAL_DIR}" rm themeunittestdata.wordpress.xml - name: Deactivate WordPress Importer plugin - run: npm run env:cli -- plugin deactivate wordpress-importer --path=/var/www/${{ env.LOCAL_DIR }} + run: npm run env:cli -- plugin deactivate wordpress-importer --path="/var/www/${LOCAL_DIR}" - name: Update permalink structure - run: npm run env:cli -- rewrite structure '/%year%/%monthnum%/%postname%/' --path=/var/www/${{ env.LOCAL_DIR }} + run: npm run env:cli -- rewrite structure '/%year%/%monthnum%/%postname%/' --path="/var/www/${LOCAL_DIR}" - name: Install additional languages run: | - npm run env:cli -- language core install de_DE --path=/var/www/${{ env.LOCAL_DIR }} - npm run env:cli -- language plugin install de_DE --all --path=/var/www/${{ env.LOCAL_DIR }} - npm run env:cli -- language theme install de_DE --all --path=/var/www/${{ env.LOCAL_DIR }} + npm run env:cli -- language core install de_DE --path="/var/www/${LOCAL_DIR}" + npm run env:cli -- language plugin install de_DE --all --path="/var/www/${LOCAL_DIR}" + npm run env:cli -- language theme install de_DE --all --path="/var/www/${LOCAL_DIR}" # Prevent background update checks from impacting test stability. - name: Disable external HTTP requests - run: npm run env:cli -- config set WP_HTTP_BLOCK_EXTERNAL true --raw --type=constant --path=/var/www/${{ env.LOCAL_DIR }} + run: npm run env:cli -- config set WP_HTTP_BLOCK_EXTERNAL true --raw --type=constant --path="/var/www/${LOCAL_DIR}" # Prevent background tasks from impacting test stability. - name: Disable cron - run: npm run env:cli -- config set DISABLE_WP_CRON true --raw --type=constant --path=/var/www/${{ env.LOCAL_DIR }} + run: npm run env:cli -- config set DISABLE_WP_CRON true --raw --type=constant --path="/var/www/${LOCAL_DIR}" - name: List defined constants - run: npm run env:cli -- config list --path=/var/www/${{ env.LOCAL_DIR }} + run: npm run env:cli -- config list --path="/var/www/${LOCAL_DIR}" - name: Install MU plugin run: | - mkdir ./${{ env.LOCAL_DIR }}/wp-content/mu-plugins - cp ./tests/performance/wp-content/mu-plugins/server-timing.php ./${{ env.LOCAL_DIR }}/wp-content/mu-plugins/server-timing.php + mkdir "./${LOCAL_DIR}/wp-content/mu-plugins" + cp ./tests/performance/wp-content/mu-plugins/server-timing.php "./${LOCAL_DIR}/wp-content/mu-plugins/server-timing.php" - name: Run performance tests (current commit) run: npm run test:performance @@ -252,27 +257,27 @@ jobs: } ); const fs = require( 'fs' ); - fs.writeFileSync( '${{ github.workspace }}/before.zip', Buffer.from( download.data ) ) + fs.writeFileSync( process.env.GITHUB_WORKSPACE + '/before.zip', Buffer.from( download.data ) ) return true; - name: Unzip the build if: ${{ steps.get-previous-build.outputs.result }} run: | - unzip ${{ github.workspace }}/before.zip - unzip -o ${{ github.workspace }}/wordpress.zip + unzip "${GITHUB_WORKSPACE}/before.zip" + unzip -o "${GITHUB_WORKSPACE}/wordpress.zip" - name: Run any database upgrades if: ${{ steps.get-previous-build.outputs.result }} - run: npm run env:cli -- core update-db --path=/var/www/${{ env.LOCAL_DIR }} + run: npm run env:cli -- core update-db --path="/var/www/${LOCAL_DIR}" - name: Flush cache if: ${{ steps.get-previous-build.outputs.result }} - run: npm run env:cli -- cache flush --path=/var/www/${{ env.LOCAL_DIR }} + run: npm run env:cli -- cache flush --path="/var/www/${LOCAL_DIR}" - name: Delete expired transients if: ${{ steps.get-previous-build.outputs.result }} - run: npm run env:cli -- transient delete --expired --path=/var/www/${{ env.LOCAL_DIR }} + run: npm run env:cli -- transient delete --expired --path="/var/www/${LOCAL_DIR}" - name: Run target performance tests (previous/target commit) if: ${{ steps.get-previous-build.outputs.result }} @@ -283,22 +288,22 @@ jobs: - name: Set the environment to the baseline version if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' }} run: | - VERSION="${{ env.BASE_TAG }}" + VERSION="${BASE_TAG}" VERSION="${VERSION%.0}" - npm run env:cli -- core update --version=$VERSION --force --path=/var/www/${{ env.LOCAL_DIR }} - npm run env:cli -- core version --path=/var/www/${{ env.LOCAL_DIR }} + npm run env:cli -- core update --version="$VERSION" --force --path="/var/www/${LOCAL_DIR}" + npm run env:cli -- core version --path="/var/www/${LOCAL_DIR}" - name: Run any database upgrades if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' }} - run: npm run env:cli -- core update-db --path=/var/www/${{ env.LOCAL_DIR }} + run: npm run env:cli -- core update-db --path="/var/www/${LOCAL_DIR}" - name: Flush cache if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' }} - run: npm run env:cli -- cache flush --path=/var/www/${{ env.LOCAL_DIR }} + run: npm run env:cli -- cache flush --path="/var/www/${LOCAL_DIR}" - name: Delete expired transients if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' }} - run: npm run env:cli -- transient delete --expired --path=/var/www/${{ env.LOCAL_DIR }} + run: npm run env:cli -- transient delete --expired --path="/var/www/${LOCAL_DIR}" - name: Run baseline performance tests if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' }} @@ -316,10 +321,10 @@ jobs: include-hidden-files: true - name: Compare results - run: node ./tests/performance/compare-results.js ${{ runner.temp }}/summary.md + run: node ./tests/performance/compare-results.js "${RUNNER_TEMP}/summary.md" - name: Add workflow summary - run: cat ${{ runner.temp }}/summary.md >> $GITHUB_STEP_SUMMARY + run: cat "${RUNNER_TEMP}/summary.md" >> "$GITHUB_STEP_SUMMARY" - name: Set the base sha # Only needed when publishing results. @@ -329,15 +334,13 @@ jobs: with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | - const baseRef = await github.rest.git.getRef({ owner: context.repo.owner, repo: context.repo.repo, ref: 'tags/${{ env.BASE_TAG }}' }); + const baseRef = await github.rest.git.getRef({ + owner: context.repo.owner, + repo: context.repo.repo, + ref: 'tags/' + process.env.BASE_TAG, + }); return baseRef.data.object.sha; - - name: Set commit details - # Only needed when publishing results. - if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached && ! inputs.multisite }} - # Write to an environment variable to have the output available in later steps of the job. - run: echo "COMMITTED_AT=$(git show -s $GITHUB_SHA --format='%cI')" >> $GITHUB_ENV - - name: Publish performance results # Only publish results on pushes to trunk. if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached && ! inputs.multisite }} @@ -347,10 +350,11 @@ jobs: HOST_NAME: "www.codevitals.run" run: | if [ -z "$CODEVITALS_PROJECT_TOKEN" ]; then - echo "Performance results could not be published. 'CODEVITALS_PROJECT_TOKEN' is not set" >> $GITHUB_OUTPUT + echo "Performance results could not be published. 'CODEVITALS_PROJECT_TOKEN' is not set" exit 1 fi - node ./tests/performance/log-results.js $CODEVITALS_PROJECT_TOKEN trunk $GITHUB_SHA $BASE_SHA $COMMITTED_AT $HOST_NAME + COMMITTED_AT="$(git show -s "$GITHUB_SHA" --format='%cI')" + node ./tests/performance/log-results.js "$CODEVITALS_PROJECT_TOKEN" trunk "$GITHUB_SHA" "$BASE_SHA" "$COMMITTED_AT" "$HOST_NAME" - name: Ensure version-controlled files are not modified or deleted run: git diff --exit-code diff --git a/.github/workflows/reusable-php-compatibility.yml b/.github/workflows/reusable-php-compatibility.yml index b68db051bf417..f07e68cf5e32c 100644 --- a/.github/workflows/reusable-php-compatibility.yml +++ b/.github/workflows/reusable-php-compatibility.yml @@ -12,6 +12,10 @@ on: type: 'string' default: 'latest' +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + jobs: # Runs PHP compatibility tests. # @@ -39,6 +43,7 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + persist-credentials: false - name: Set up PHP uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1 @@ -55,7 +60,7 @@ jobs: # http://man7.org/linux/man-pages/man1/date.1.html - name: "Get last Monday's date" id: get-date - run: echo "date=$(/bin/date -u --date='last Mon' "+%F")" >> $GITHUB_OUTPUT + run: echo "date=$(/bin/date -u --date='last Mon' "+%F")" >> "$GITHUB_OUTPUT" - name: Cache PHP compatibility scan cache uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 @@ -71,7 +76,7 @@ jobs: custom-cache-suffix: ${{ steps.get-date.outputs.date }} - name: Make Composer packages available globally - run: echo "${PWD}/vendor/bin" >> $GITHUB_PATH + run: echo "${PWD}/vendor/bin" >> "$GITHUB_PATH" - name: Run PHP compatibility tests id: phpcs diff --git a/.github/workflows/reusable-phpunit-tests-v1.yml b/.github/workflows/reusable-phpunit-tests-v1.yml index e02a890a6debf..1b08f69c15069 100644 --- a/.github/workflows/reusable-phpunit-tests-v1.yml +++ b/.github/workflows/reusable-phpunit-tests-v1.yml @@ -50,6 +50,7 @@ on: type: boolean default: false env: + COMPOSER_INSTALL: ${{ false }} LOCAL_PHP: ${{ inputs.php }}-fpm LOCAL_PHPUNIT: ${{ inputs.phpunit && inputs.phpunit || inputs.php }}-fpm LOCAL_PHP_MEMCACHED: ${{ inputs.memcached }} @@ -58,6 +59,10 @@ env: PUPPETEER_SKIP_DOWNLOAD: ${{ true }} SLOW_TESTS: 'external-http,media' +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + jobs: # Runs the PHPUnit tests for WordPress. # @@ -86,13 +91,14 @@ jobs: steps: - name: Configure environment variables run: | - echo "PHP_FPM_UID=$(id -u)" >> $GITHUB_ENV - echo "PHP_FPM_GID=$(id -g)" >> $GITHUB_ENV + echo "PHP_FPM_UID=$(id -u)" >> "$GITHUB_ENV" + echo "PHP_FPM_GID=$(id -g)" >> "$GITHUB_ENV" - name: Checkout repository uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + persist-credentials: false - name: Set up Node.js uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 @@ -106,6 +112,11 @@ jobs: - name: Build WordPress run: npm run build + - name: Get composer cache directory + if: ${{ env.COMPOSER_INSTALL == true }} + id: composer-cache + run: echo "composer_dir=$(composer config cache-files-dir)" >> "$GITHUB_OUTPUT" + - name: Cache Composer dependencies if: ${{ env.COMPOSER_INSTALL == true }} uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 @@ -135,7 +146,8 @@ jobs: if: ${{ inputs.memcached }} run: | cp tests/phpunit/includes/object-cache.php build/wp-content/object-cache.php - docker run --name memcached --net $(basename "$PWD")_wpdevnet -d memcached + BASE=$(basename "$PWD") + docker run --name memcached --net "${BASE}_wpdevnet" -d memcached - name: General debug information run: | @@ -160,24 +172,24 @@ jobs: - name: Run slow PHPUnit tests if: ${{ inputs.split_slow }} - run: npm run test:${{ env.PHPUNIT_SCRIPT }} -- --verbose -c ${{ env.PHPUNIT_CONFIG }} --group ${{ env.SLOW_TESTS }} + run: npm run "test:${PHPUNIT_SCRIPT}" -- --verbose -c "${PHPUNIT_CONFIG}" --group "${SLOW_TESTS}" - name: Run PHPUnit tests for single site excluding slow tests if: ${{ inputs.php < '7.0' && ! inputs.split_slow && ! inputs.multisite }} - run: npm run test:${{ env.PHPUNIT_SCRIPT }} -- --verbose -c ${{ env.PHPUNIT_CONFIG }} --exclude-group ${{ env.SLOW_TESTS }},ajax,ms-files,ms-required + run: npm run "test:${PHPUNIT_SCRIPT}" -- --verbose -c "${PHPUNIT_CONFIG}" --exclude-group "${SLOW_TESTS},ajax,ms-files,ms-required" - name: Run PHPUnit tests for Multisite excluding slow tests if: ${{ inputs.php < '7.0' && ! inputs.split_slow && inputs.multisite }} - run: npm run test:${{ env.PHPUNIT_SCRIPT }} -- --verbose -c ${{ env.PHPUNIT_CONFIG }} --exclude-group ${{ env.SLOW_TESTS }},ajax,ms-files,ms-excluded,oembed-headers + run: npm run "test:${PHPUNIT_SCRIPT}" -- --verbose -c "${PHPUNIT_CONFIG}" --exclude-group "${SLOW_TESTS},ajax,ms-files,ms-excluded,oembed-headers" - name: Run PHPUnit tests if: ${{ inputs.php >= '7.0' }} - run: npm run test:${{ env.PHPUNIT_SCRIPT }} -- --verbose -c ${{ env.PHPUNIT_CONFIG }} + run: npm run "test:${PHPUNIT_SCRIPT}" -- --verbose -c "${PHPUNIT_CONFIG}" - name: Run AJAX tests if: ${{ ! inputs.multisite && ! inputs.split_slow }} - run: npm run test:${{ env.PHPUNIT_SCRIPT }} -- --verbose -c ${{ env.PHPUNIT_CONFIG }} --group ajax + run: npm run "test:${PHPUNIT_SCRIPT}" -- --verbose -c "${PHPUNIT_CONFIG}" --group ajax - name: Run external HTTP tests if: ${{ ! inputs.multisite && ! inputs.split_slow }} - run: npm run test:${{ env.PHPUNIT_SCRIPT }} -- --verbose -c phpunit.xml.dist --group external-http + run: npm run "test:${PHPUNIT_SCRIPT}" -- --verbose -c phpunit.xml.dist --group external-http diff --git a/.github/workflows/reusable-phpunit-tests-v2.yml b/.github/workflows/reusable-phpunit-tests-v2.yml index d96928e3f1a07..eea607c3f45b8 100644 --- a/.github/workflows/reusable-phpunit-tests-v2.yml +++ b/.github/workflows/reusable-phpunit-tests-v2.yml @@ -63,6 +63,10 @@ env: PHPUNIT_SCRIPT: php SLOW_TESTS: 'external-http,media' +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + jobs: # Runs the PHPUnit tests for WordPress. # @@ -89,13 +93,14 @@ jobs: steps: - name: Configure environment variables run: | - echo "PHP_FPM_UID=$(id -u)" >> $GITHUB_ENV - echo "PHP_FPM_GID=$(id -g)" >> $GITHUB_ENV + echo "PHP_FPM_UID=$(id -u)" >> "$GITHUB_ENV" + echo "PHP_FPM_GID=$(id -g)" >> "$GITHUB_ENV" - name: Checkout repository uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + persist-credentials: false - name: Install Node.js uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 @@ -108,7 +113,7 @@ jobs: - name: Get composer cache directory id: composer-cache - run: echo "composer_dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT + run: echo "composer_dir=$(composer config cache-files-dir)" >> "$GITHUB_OUTPUT" - name: Cache Composer dependencies uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 @@ -125,13 +130,13 @@ jobs: # The PHPUnit 7.x phar is not compatible with PHP 8 and won't be updated, # as PHPUnit 7 is no longer supported. The Composer-installed PHPUnit should be # used for PHP 8 testing instead. - if [ ${{ env.LOCAL_PHP }} == '8.0-fpm' ]; then + if [ "${LOCAL_PHP}" == '8.0-fpm' ]; then docker compose run --rm php composer install --ignore-platform-reqs - echo "PHPUNIT_SCRIPT=php-composer" >> $GITHUB_ENV - elif [ ${{ env.LOCAL_PHP }} == '7.1-fpm' ]; then + echo "PHPUNIT_SCRIPT=php-composer" >> "$GITHUB_ENV" + elif [ "${LOCAL_PHP}" == '7.1-fpm' ]; then docker compose run --rm php composer update git checkout -- composer.lock - elif [[ ${{ env.LOCAL_PHP }} == '5.6-fpm' || ${{ env.LOCAL_PHP }} == '7.0-fpm' ]]; then + elif [[ "${LOCAL_PHP}" == '5.6-fpm' || "${LOCAL_PHP}" == '7.0-fpm' ]]; then docker compose run --rm php composer require --dev phpunit/phpunit:"^5.7" --update-with-dependencies git checkout -- composer.lock composer.json else @@ -170,36 +175,36 @@ jobs: - name: Run slow PHPUnit tests if: ${{ inputs.split_slow }} - run: npm run test:${{ env.PHPUNIT_SCRIPT }} -- --verbose -c ${{ env.PHPUNIT_CONFIG }} --group ${{ env.SLOW_TESTS }} + run: npm run "test:${PHPUNIT_SCRIPT}" -- --verbose -c "${PHPUNIT_CONFIG}" --group "${SLOW_TESTS}" - name: Run PHPUnit tests for single site excluding slow tests if: ${{ inputs.php < '7.0' && ! inputs.split_slow && ! inputs.multisite }} - run: npm run test:${{ env.PHPUNIT_SCRIPT }} -- --verbose -c ${{ env.PHPUNIT_CONFIG }} --exclude-group ${{ env.SLOW_TESTS }},ajax,ms-files,ms-required + run: npm run "test:${PHPUNIT_SCRIPT}" -- --verbose -c "${PHPUNIT_CONFIG}" --exclude-group "${SLOW_TESTS},ajax,ms-files,ms-required" - name: Run PHPUnit tests for Multisite excluding slow tests if: ${{ inputs.php < '7.0' && ! inputs.split_slow && inputs.multisite }} - run: npm run test:${{ env.PHPUNIT_SCRIPT }} -- --verbose -c ${{ env.PHPUNIT_CONFIG }} --exclude-group ${{ env.SLOW_TESTS }},ajax,ms-files,ms-excluded,oembed-headers + run: npm run "test:${PHPUNIT_SCRIPT}" -- --verbose -c "${PHPUNIT_CONFIG}" --exclude-group "${SLOW_TESTS},ajax,ms-files,ms-excluded,oembed-headers" - name: Run PHPUnit tests if: ${{ inputs.php >= '7.0' }} - run: npm run test:${{ env.PHPUNIT_SCRIPT }} -- --verbose -c ${{ env.PHPUNIT_CONFIG }} + run: npm run "test:${PHPUNIT_SCRIPT}" -- --verbose -c "${PHPUNIT_CONFIG}" - name: Run AJAX tests if: ${{ ! inputs.split_slow&& inputs.test_ajax }} - run: npm run test:${{ env.PHPUNIT_SCRIPT }} -- --verbose -c ${{ env.PHPUNIT_CONFIG }} --group ajax + run: npm run "test:${PHPUNIT_SCRIPT}" -- --verbose -c "${PHPUNIT_CONFIG}" --group ajax - name: Run ms-files tests as a multisite install if: ${{ inputs.multisite && ! inputs.split_slow }} - run: npm run test:${{ env.PHPUNIT_SCRIPT }} -- --verbose -c ${{ env.PHPUNIT_CONFIG }} --group ms-files + run: npm run "test:${PHPUNIT_SCRIPT}" -- --verbose -c "${PHPUNIT_CONFIG}" --group ms-files - name: Run external HTTP tests if: ${{ ! inputs.multisite && ! inputs.split_slow }} - run: npm run test:${{ env.PHPUNIT_SCRIPT }} -- --verbose -c phpunit.xml.dist --group external-http + run: npm run "test:${PHPUNIT_SCRIPT}" -- --verbose -c phpunit.xml.dist --group external-http # __fakegroup__ is excluded to force PHPUnit to ignore the <exclude> settings in phpunit.xml.dist. - name: Run (xDebug) tests if: ${{ ! inputs.split_slow }} - run: LOCAL_PHP_XDEBUG=true npm run test:${{ env.PHPUNIT_SCRIPT }} -- -v --group xdebug --exclude-group __fakegroup__ + run: LOCAL_PHP_XDEBUG=true npm run "test:${PHPUNIT_SCRIPT}" -- -v --group xdebug --exclude-group __fakegroup__ - name: Ensure version-controlled files are not modified or deleted run: git diff --exit-code diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index 3d26efa7026b2..d889eacb26eb2 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -76,6 +76,10 @@ on: CODECOV_TOKEN: description: 'The Codecov token required for uploading reports.' required: false + WPT_REPORT_API_KEY: + description: 'The WordPress.org Hosting Tests API key.' + required: false + env: LOCAL_PHP: ${{ inputs.php }}-fpm LOCAL_PHP_XDEBUG: ${{ inputs.coverage-report || false }} @@ -87,6 +91,10 @@ env: PHPUNIT_CONFIG: ${{ inputs.phpunit-config }} PUPPETEER_SKIP_DOWNLOAD: ${{ true }} +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + jobs: # Runs the PHPUnit tests for WordPress. # @@ -117,13 +125,14 @@ jobs: steps: - name: Configure environment variables run: | - echo "PHP_FPM_UID=$(id -u)" >> $GITHUB_ENV - echo "PHP_FPM_GID=$(id -g)" >> $GITHUB_ENV + echo "PHP_FPM_UID=$(id -u)" >> "$GITHUB_ENV" + echo "PHP_FPM_GID=$(id -g)" >> "$GITHUB_ENV" - name: Checkout repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + persist-credentials: false - name: Set up Node.js uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 @@ -176,33 +185,44 @@ jobs: - name: WordPress Docker container debug information run: | - docker compose run --rm mysql ${{ env.LOCAL_DB_TYPE == 'mariadb' && contains( fromJSON('["5.5", "10.0", "10.1", "10.2", "10.3"]'), env.LOCAL_DB_VERSION ) && 'mysql' || env.LOCAL_DB_TYPE }} --version + docker compose run --rm mysql "${LOCAL_DB_CMD}" --version docker compose run --rm php php --version docker compose run --rm php php -m docker compose run --rm php php -i docker compose run --rm php locale -a + env: + LOCAL_DB_CMD: ${{ env.LOCAL_DB_TYPE == 'mariadb' && contains( fromJSON('["5.5", "10.0", "10.1", "10.2", "10.3"]'), env.LOCAL_DB_VERSION ) && 'mysql' || env.LOCAL_DB_TYPE }} - name: Install WordPress run: npm run env:install - name: Run PHPUnit tests${{ inputs.phpunit-test-groups && format( ' ({0} groups)', inputs.phpunit-test-groups ) || '' }}${{ inputs.coverage-report && ' with coverage report' || '' }} continue-on-error: ${{ inputs.allow-errors }} - run: node ./tools/local-env/scripts/docker.js run php ./vendor/bin/phpunit --verbose -c ${{ env.PHPUNIT_CONFIG }}${{ inputs.phpunit-test-groups && format( ' --group {0}', inputs.phpunit-test-groups ) || '' }}${{ inputs.coverage-report && format( ' --coverage-clover wp-code-coverage-{0}-{1}.xml --coverage-html wp-code-coverage-{0}-{1}', ( inputs.multisite && 'multisite' || 'single' ), github.sha ) || '' }} + run: | + node ./tools/local-env/scripts/docker.js run \ + php ./vendor/bin/phpunit \ + --verbose \ + -c "${PHPUNIT_CONFIG}" \ + ${{ inputs.phpunit-test-groups && '--group "${TEST_GROUPS}"' || '' }} \ + ${{ inputs.coverage-report && '--coverage-clover "wp-code-coverage-${MULTISITE_FLAG}-${GITHUB_SHA}.xml" --coverage-html "wp-code-coverage-${MULTISITE_FLAG}-${GITHUB_SHA}"' || '' }} + env: + TEST_GROUPS: ${{ inputs.phpunit-test-groups }} + MULTISITE_FLAG: ${{ inputs.multisite && 'multisite' || 'single' }} - name: Run AJAX tests if: ${{ ! inputs.phpunit-test-groups && ! inputs.coverage-report }} continue-on-error: ${{ inputs.allow-errors }} - run: node ./tools/local-env/scripts/docker.js run php ./vendor/bin/phpunit --verbose -c ${{ env.PHPUNIT_CONFIG }} --group ajax + run: node ./tools/local-env/scripts/docker.js run php ./vendor/bin/phpunit --verbose -c "${PHPUNIT_CONFIG}" --group ajax - name: Run ms-files tests as a multisite install if: ${{ inputs.multisite && ! inputs.phpunit-test-groups && ! inputs.coverage-report }} continue-on-error: ${{ inputs.allow-errors }} - run: node ./tools/local-env/scripts/docker.js run php ./vendor/bin/phpunit --verbose -c ${{ env.PHPUNIT_CONFIG }} --group ms-files + run: node ./tools/local-env/scripts/docker.js run php ./vendor/bin/phpunit --verbose -c "${PHPUNIT_CONFIG}" --group ms-files - name: Run external HTTP tests if: ${{ ! inputs.multisite && ! inputs.phpunit-test-groups && ! inputs.coverage-report }} continue-on-error: ${{ inputs.allow-errors }} - run: node ./tools/local-env/scripts/docker.js run php ./vendor/bin/phpunit --verbose -c ${{ env.PHPUNIT_CONFIG }} --group external-http + run: node ./tools/local-env/scripts/docker.js run php ./vendor/bin/phpunit --verbose -c "${PHPUNIT_CONFIG}" --group external-http # __fakegroup__ is excluded to force PHPUnit to ignore the <exclude> settings in phpunit.xml.dist. - name: Run (Xdebug) tests @@ -237,6 +257,7 @@ jobs: repository: 'WordPress/phpunit-test-runner' path: 'test-runner' show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + persist-credentials: false - name: Submit test results to the WordPress.org host test results if: ${{ github.ref == 'refs/heads/trunk' && inputs.report }} diff --git a/.github/workflows/reusable-support-json-reader-v1.yml b/.github/workflows/reusable-support-json-reader-v1.yml index f351b716fadb6..02adfb07e70bd 100644 --- a/.github/workflows/reusable-support-json-reader-v1.yml +++ b/.github/workflows/reusable-support-json-reader-v1.yml @@ -26,6 +26,10 @@ on: description: "The MySQL versions to test for the given wp-version" value: ${{ jobs.mysql-versions.outputs.versions }} +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + jobs: # Determines the major version of WordPress being tested. # @@ -36,6 +40,8 @@ jobs: # - Returns the major WordPress version as an output based on the value passed to the wp-version input. major-wp-version: name: Determine major WordPress version + permissions: + contents: read runs-on: ubuntu-latest timeout-minutes: 5 outputs: @@ -47,17 +53,20 @@ jobs: with: repository: ${{ inputs.repository }} show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + persist-credentials: false - name: Determine the major WordPress version id: major-wp-version run: | - if [ "${{ inputs.wp-version }}" ] && [ "${{ inputs.wp-version }}" != "nightly" ] && [ "${{ inputs.wp-version }}" != "latest" ] && [ "${{ inputs.wp-version }}" != "trunk" ]; then - echo "version=$(echo "${{ inputs.wp-version }}" | tr '.' '-' | cut -d '-' -f1-2)" >> $GITHUB_OUTPUT - elif [ "${{ inputs.wp-version }}" ] && [ "${{ inputs.wp-version }}" != "trunk" ]; then - echo "version=$(echo "${{ inputs.wp-version }}")" >> $GITHUB_OUTPUT + if [ "${WP_VERSION}" ] && [ "${WP_VERSION}" != "nightly" ] && [ "${WP_VERSION}" != "latest" ] && [ "${WP_VERSION}" != "trunk" ]; then + echo "version=$(echo "${WP_VERSION}" | tr '.' '-' | cut -d '-' -f1-2)" >> "$GITHUB_OUTPUT" + elif [ "${WP_VERSION}" ] && [ "${WP_VERSION}" != "trunk" ]; then + echo "version=${WP_VERSION}" >> "$GITHUB_OUTPUT" else - echo "version=nightly" >> $GITHUB_OUTPUT + echo "version=nightly" >> "$GITHUB_OUTPUT" fi + env: + WP_VERSION: ${{ inputs.wp-version }} # Determines the versions of PHP supported for a version of WordPress. # @@ -67,6 +76,8 @@ jobs: # .version-support-php.json file and returning the values in that version's index. php-versions: name: Determine PHP versions + permissions: + contents: read runs-on: ubuntu-latest needs: [ major-wp-version ] timeout-minutes: 5 @@ -79,17 +90,26 @@ jobs: with: repository: ${{ inputs.repository }} show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + persist-credentials: false # Look up the major version's specific PHP support policy when a version is provided. # Otherwise, use the current PHP support policy. - name: Get supported PHP versions id: php-versions run: | - if [ "${{ needs.major-wp-version.outputs.version }}" != "latest" ] && [ "${{ needs.major-wp-version.outputs.version }}" != "nightly" ]; then - echo "versions=$(jq -r '.["${{ needs.major-wp-version.outputs.version }}"] | @json' .version-support-php.json)" >> $GITHUB_OUTPUT + if [ "${WP_VERSION}" != "latest" ] && [ "${WP_VERSION}" != "nightly" ]; then + VERSIONS="$( jq \ + -r \ + --arg wp_version "${WP_VERSION}" \ + '.[$wp_version] | @json' \ + .version-support-php.json + )" + echo "versions=$VERSIONS" >> "$GITHUB_OUTPUT" else - echo "versions=$(jq -r '.[ (keys[-1]) ] | @json' .version-support-php.json)" >> $GITHUB_OUTPUT + echo "versions=$(jq -r '.[ (keys[-1]) ] | @json' .version-support-php.json)" >> "$GITHUB_OUTPUT" fi + env: + WP_VERSION: ${{ needs.major-wp-version.outputs.version }} # Determines the versions of MySQL supported for a version of WordPress. # @@ -99,6 +119,8 @@ jobs: # .version-support-mysql.json file and returning the values in that version's index. mysql-versions: name: Determine MySQL versions + permissions: + contents: read runs-on: ubuntu-latest needs: [ major-wp-version ] timeout-minutes: 5 @@ -111,14 +133,23 @@ jobs: with: repository: ${{ inputs.repository }} show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + persist-credentials: false # Look up the major version's specific MySQL support policy when a version is provided. # Otherwise, use the current MySQL support policy. - name: Get supported MySQL versions id: mysql-versions run: | - if [ "${{ needs.major-wp-version.outputs.version }}" != "latest" ] && [ "${{ needs.major-wp-version.outputs.version }}" != "nightly" ]; then - echo "versions=$(jq -r '.["${{ needs.major-wp-version.outputs.version }}"] | @json' .version-support-mysql.json)" >> $GITHUB_OUTPUT + if [ "${WP_VERSION}" != "latest" ] && [ "${WP_VERSION}" != "nightly" ]; then + VERSIONS="$( jq \ + -r \ + --arg wp_version "${WP_VERSION}" \ + '.[$wp_version] | @json' \ + .version-support-mysql.json + )" + echo "versions=$VERSIONS" >> "$GITHUB_OUTPUT" else - echo "versions=$(jq -r '.[ (keys[-1]) ] | @json' .version-support-mysql.json)" >> $GITHUB_OUTPUT + echo "versions=$(jq -r '.[ (keys[-1]) ] | @json' .version-support-mysql.json)" >> "$GITHUB_OUTPUT" fi + env: + WP_VERSION: ${{ needs.major-wp-version.outputs.version }} diff --git a/.github/workflows/reusable-test-core-build-process.yml b/.github/workflows/reusable-test-core-build-process.yml index e2683961471c1..eb5dc34c715f8 100644 --- a/.github/workflows/reusable-test-core-build-process.yml +++ b/.github/workflows/reusable-test-core-build-process.yml @@ -35,6 +35,10 @@ on: env: PUPPETEER_SKIP_DOWNLOAD: ${{ true }} +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + jobs: # Verifies that installing npm dependencies and building WordPress works as expected. # @@ -53,6 +57,8 @@ jobs: # - Uploads the pull request number as an artifact. build-process-tests: name: Core running from ${{ inputs.directory }} / ${{ contains( inputs.os, 'macos-' ) && 'MacOS' || contains( inputs.os, 'windows-' ) && 'Windows' || 'Linux' }} + permissions: + contents: read runs-on: ${{ inputs.os }} timeout-minutes: 20 @@ -61,6 +67,7 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + persist-credentials: false - name: Set up Node.js uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 @@ -85,7 +92,7 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Build WordPress to run from ${{ inputs.directory }} - run: npm run build${{ inputs.directory == 'src' && ':dev' || '' }} + run: npm run ${{ inputs.directory == 'src' && 'build:dev' || 'build' }} - name: Ensure version-controlled files are not modified or deleted during building run: git diff --exit-code @@ -95,7 +102,7 @@ jobs: run: zip -r wordpress.zip build/. - name: Clean after building to run from ${{ inputs.directory }} - run: npm run grunt clean${{ inputs.directory == 'src' && ' -- --dev' || '' }} + run: npm run grunt ${{ inputs.directory == 'src' && 'clean -- --dev' || 'clean' }} - name: Ensure version-controlled files are not modified or deleted during cleaning run: git diff --exit-code @@ -112,7 +119,9 @@ jobs: if: ${{ inputs.prepare-playground }} run: | mkdir -p ./pr-number - echo ${{ github.event.number }} > ./pr-number/NR + echo "${EVENT_NUMBER}" > ./pr-number/NR + env: + EVENT_NUMBER: ${{ github.event.number }} # Uploads the PR number as an artifact for the Pull Request Commenting workflow to download and then # leave a comment detailing how to test the PR within WordPress Playground. diff --git a/.github/workflows/reusable-test-gutenberg-build-process.yml b/.github/workflows/reusable-test-gutenberg-build-process.yml index 86756a5043b55..32e91af42fd20 100644 --- a/.github/workflows/reusable-test-gutenberg-build-process.yml +++ b/.github/workflows/reusable-test-gutenberg-build-process.yml @@ -22,6 +22,10 @@ env: PUPPETEER_SKIP_DOWNLOAD: ${{ true }} NODE_OPTIONS: '--max-old-space-size=8192' +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + jobs: # Verifies that installing npm dependencies and building the Gutenberg plugin works as expected. # @@ -38,6 +42,8 @@ jobs: # - Ensures version-controlled files are not modified or deleted. build-process-tests: name: Gutenberg running from ${{ inputs.directory }} / ${{ contains( inputs.os, 'macos-' ) && 'MacOS' || contains( inputs.os, 'windows-' ) && 'Windows' || 'Linux' }} + permissions: + contents: read runs-on: ${{ inputs.os }} timeout-minutes: 30 @@ -46,6 +52,7 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + persist-credentials: false - name: Checkout Gutenberg plugin uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -53,6 +60,7 @@ jobs: repository: 'WordPress/gutenberg' path: ${{ env.GUTENBERG_DIRECTORY }} show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + persist-credentials: false - name: Set up Node.js uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 @@ -82,7 +90,7 @@ jobs: working-directory: ${{ env.GUTENBERG_DIRECTORY }} - name: Build WordPress to run from ${{ inputs.directory }} - run: npm run build${{ inputs.directory == 'src' && ':dev' || '' }} + run: npm run ${{ inputs.directory == 'src' && 'build:dev' || 'build' }} - name: Run Gutenberg build script after building Core to run from ${{ inputs.directory }} run: npm run build diff --git a/.github/workflows/reusable-test-local-docker-environment-v1.yml b/.github/workflows/reusable-test-local-docker-environment-v1.yml index 6e521de70dfa6..98fb645533d59 100644 --- a/.github/workflows/reusable-test-local-docker-environment-v1.yml +++ b/.github/workflows/reusable-test-local-docker-environment-v1.yml @@ -47,6 +47,10 @@ env: LOCAL_WP_TESTS_DOMAIN: ${{ inputs.tests-domain }} PUPPETEER_SKIP_DOWNLOAD: ${{ true }} +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + jobs: # Tests the local Docker environment. # @@ -70,19 +74,22 @@ jobs: # - Ensures version-controlled files are not modified or deleted. local-docker-environment-tests: name: PHP ${{ inputs.php }} / ${{ 'mariadb' == inputs.db-type && 'MariaDB' || 'MySQL' }} ${{ inputs.db-version }}${{ inputs.memcached && ' with memcached' || '' }}${{ 'example.org' != inputs.tests-domain && format( ' {0}', inputs.tests-domain ) || '' }} + permissions: + contents: read runs-on: ${{ inputs.os }} timeout-minutes: 20 steps: - name: Configure environment variables run: | - echo "PHP_FPM_UID=$(id -u)" >> $GITHUB_ENV - echo "PHP_FPM_GID=$(id -g)" >> $GITHUB_ENV + echo "PHP_FPM_UID=$(id -u)" >> "$GITHUB_ENV" + echo "PHP_FPM_GID=$(id -g)" >> "$GITHUB_ENV" - name: Checkout repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + persist-credentials: false - name: Set up Node.js uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 @@ -135,7 +142,7 @@ jobs: - name: WordPress Docker container debug information run: | - docker compose run --rm mysql ${{ env.LOCAL_DB_TYPE }} --version + docker compose run --rm mysql "${LOCAL_DB_TYPE}" --version docker compose run --rm php php --version docker compose run --rm php php -m docker compose run --rm php php -i diff --git a/.github/workflows/reusable-upgrade-testing.yml b/.github/workflows/reusable-upgrade-testing.yml index 1d4f26f91ad2c..ca071a3db3f5c 100644 --- a/.github/workflows/reusable-upgrade-testing.yml +++ b/.github/workflows/reusable-upgrade-testing.yml @@ -37,6 +37,10 @@ on: type: 'string' default: '5.7' +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + jobs: # Runs upgrade tests on a build of WordPress. # @@ -49,6 +53,7 @@ jobs: # - Updates to the version of WordPress being tested. upgrade-tests: name: ${{ inputs.wp }} to ${{ inputs.new-version }} / PHP ${{ inputs.php }} with ${{ 'mariadb' == inputs.db-type && 'MariaDB' || 'MySQL' }} ${{ inputs.db-version }}${{ inputs.multisite && ' multisite' || '' }} + permissions: {} runs-on: ${{ inputs.os }} timeout-minutes: 20 @@ -76,17 +81,26 @@ jobs: tools: wp-cli - name: Download WordPress ${{ inputs.wp }} - run: wp core download --version=${{ inputs.wp }} + run: wp core download --version="${WP_VERSION}" + env: + WP_VERSION: ${{ inputs.wp }} - name: Create wp-config.php file - run: wp config create --dbname=test_db --dbuser=root --dbpass=root --dbhost=127.0.0.1:${{ job.services.database.ports['3306'] }} + run: wp config create --dbname=test_db --dbuser=root --dbpass=root --dbhost="127.0.0.1:${DB_PORT}" + env: + DB_PORT: ${{ job.services.database.ports['3306'] }} - name: Install WordPress - run: wp core ${{ inputs.multisite && 'multisite-' || '' }}install --url=http://localhost/ --title="Upgrade Test" --admin_user=admin --admin_password=password --admin_email=me@example.org --skip-email + run: | + wp core ${{ inputs.multisite && 'multisite-install' || 'install' }} \ + --url=http://localhost/ --title="Upgrade Test" --admin_user=admin \ + --admin_password=password --admin_email=me@example.org --skip-email - name: Update to the latest minor version run: wp core update --minor - name: Upgrade to WordPress ${{ inputs.new-version }} run: | - wp core update${{ 'latest' != inputs.new-version && format( ' --version={0}', inputs.new-version ) || '' }} + wp core update ${{ 'latest' != inputs.new-version && '--version="${WP_VERSION}"' || '' }} + env: + WP_VERSION: ${{ inputs.new-version }} diff --git a/.github/workflows/reusable-workflow-lint.yml b/.github/workflows/reusable-workflow-lint.yml new file mode 100644 index 0000000000000..352a1eb65e5d8 --- /dev/null +++ b/.github/workflows/reusable-workflow-lint.yml @@ -0,0 +1,34 @@ +name: Lint GitHub Actions workflows +on: + workflow_call: + +permissions: {} + +jobs: + # Runs the actionlint GitHub Action workflow file linter. + # + # This helps guard against common mistakes including strong type checking for expressions (${{ }}), security checks, + # `run:` script checking, glob syntax validation, and more. + # + # Performs the following steps: + # - Checks out the repository. + # - Runs actionlint. + actionlint: + name: Run actionlint + runs-on: ubuntu-latest + permissions: + contents: read + timeout-minutes: 5 + steps: + - name: Checkout repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + + # actionlint is static checker for GitHub Actions workflow files. + # See https://github.com/rhysd/actionlint. + - name: Run actionlint + uses: docker://rhysd/actionlint:1.7.7 + with: + args: "-color -verbose" diff --git a/.github/workflows/slack-notifications.yml b/.github/workflows/slack-notifications.yml index cbd1e94427ba8..5d50f89032978 100644 --- a/.github/workflows/slack-notifications.yml +++ b/.github/workflows/slack-notifications.yml @@ -54,7 +54,7 @@ jobs: timeout-minutes: 5 if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event.workflow_run.event != 'pull_request' }} outputs: - previous_conclusion: ${{ steps.previous-conclusion.outputs.previous_conclusion }} + previous_conclusion: ${{ steps.previous-attempt-result.outputs.result }} payload: ${{ steps.create-payload.outputs.payload }} steps: @@ -68,10 +68,10 @@ jobs: const workflow_run = await github.rest.actions.getWorkflowRun({ owner: context.repo.owner, repo: context.repo.repo, - run_id: ${{ github.run_id }}, + run_id: context.runId, }); - if ( '${{ inputs.calling_status }}' == 'failure' && workflow_run.data.run_attempt == 1 ) { + if ( process.env.CALLING_STATUS == 'failure' && workflow_run.data.run_attempt == 1 ) { return 'first-failure'; } @@ -82,7 +82,7 @@ jobs: const previous_run = await github.rest.actions.getWorkflowRunAttempt({ owner: context.repo.owner, repo: context.repo.repo, - run_id: ${{ github.run_id }}, + run_id: context.runId, attempt_number: workflow_run.data.run_attempt - 1 }); @@ -94,7 +94,7 @@ jobs: owner: context.repo.owner, repo: context.repo.repo, workflow_id: workflow_run.data.workflow_id, - branch: '${{ env.CURRENT_BRANCH }}', + branch: process.env.CURRENT_BRANCH, exclude_pull_requests: true, }); @@ -124,10 +124,8 @@ jobs: // Can't determine previous workflow conclusion. return 'unknown'; - - - name: Store previous conclusion as an output - id: previous-conclusion - run: echo "previous_conclusion=${{ steps.previous-attempt-result.outputs.result }}" >> $GITHUB_OUTPUT + env: + CALLING_STATUS: ${{ inputs.calling_status }} - name: Get the commit message id: current-commit-message @@ -140,26 +138,38 @@ jobs: const commit_details = await github.rest.repos.getCommit({ owner: context.repo.owner, repo: context.repo.repo, - ref: '${{ github.sha }}' + ref: context.sha, }); return commit_details.data.commit.message; - name: Prepare commit message. id: commit-message run: | - COMMIT_MESSAGE=$(cat <<'EOF' | awk 'NR==1' | sed 's/`/\\`/g' | sed 's/\"/\\\\\\"/g' | sed 's/\$/\\$/g' - ${{ ( github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' ) && fromJson( steps.current-commit-message.outputs.result ) || github.event.head_commit.message }} - EOF - ) - echo "commit_message_escaped=${COMMIT_MESSAGE}" >> $GITHUB_OUTPUT + # shellcheck disable=SC2016 + COMMIT_MESSAGE="$(echo "${COMMIT_MSG_RAW}" | awk 'NR==1' | sed 's/`/\\`/g' | sed 's/\"/\\\\\\"/g' | sed 's/\$/\\$/g')" + echo "commit_message_escaped=${COMMIT_MESSAGE}" >> "$GITHUB_OUTPUT" + env: + COMMIT_MSG_RAW: ${{ ( github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' ) && fromJson( steps.current-commit-message.outputs.result ) || github.event.head_commit.message }} - name: Construct payload and store as an output id: create-payload - run: echo "payload={\"workflow_name\":\"${{ github.workflow }}\",\"ref_name\":\"${{ env.CURRENT_BRANCH }}\",\"run_url\":\"https://github.com/WordPress/wordpress-develop/actions/runs/${{ github.run_id }}/attempts/${{ github.run_attempt }}\",\"commit_message\":\"${{ steps.commit-message.outputs.commit_message_escaped }}\"}" >> $GITHUB_OUTPUT + run: | + PAYLOAD="$( jq \ + -n \ + --arg workflow_name "${GITHUB_WORKFLOW}" \ + --arg ref_name "${CURRENT_BRANCH}" \ + --arg run_url "https://github.com/WordPress/wordpress-develop/actions/runs/${GITHUB_RUN_ID}/attempts/${GITHUB_RUN_ATTEMPT}" \ + --arg commit_message "${COMMIT_MSG}" \ + '{workflow_name: $workflow_name, ref_name: $ref_name, run_url: $run_url, commit_message: $commit_message}' + )" + echo "payload=$PAYLOAD" >> "$GITHUB_OUTPUT" + env: + COMMIT_MSG: ${{ steps.commit-message.outputs.commit_message_escaped }} # Posts notifications when a workflow fails. failure: name: Failure notifications + permissions: {} runs-on: ubuntu-latest timeout-minutes: 10 needs: [ prepare ] @@ -176,6 +186,7 @@ jobs: # Posts notifications the first time a workflow run succeeds after previously failing. fixed: name: Fixed notifications + permissions: {} runs-on: ubuntu-latest timeout-minutes: 10 needs: [ prepare ] @@ -192,6 +203,7 @@ jobs: # Posts notifications when a workflow is successful. success: name: Success notifications + permissions: {} runs-on: ubuntu-latest timeout-minutes: 10 needs: [ prepare ] @@ -208,6 +220,7 @@ jobs: # Posts notifications when a workflow is cancelled. cancelled: name: Cancelled notifications + permissions: {} runs-on: ubuntu-latest timeout-minutes: 10 needs: [ prepare ] diff --git a/.github/workflows/test-and-zip-default-themes.yml b/.github/workflows/test-and-zip-default-themes.yml index 8a68016a3156b..98e7071b5fe77 100644 --- a/.github/workflows/test-and-zip-default-themes.yml +++ b/.github/workflows/test-and-zip-default-themes.yml @@ -91,10 +91,13 @@ jobs: with: ref: ${{ github.event_name == 'workflow_dispatch' && inputs.branch || github.ref }} show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + persist-credentials: false - name: Check for zero-byte (empty) files run: | - [[ ! $(find src/wp-content/themes/${{ matrix.theme }} -empty) ]] + [[ ! $(find "src/wp-content/themes/${THEME}" -empty) ]] + env: + THEME: ${{ matrix.theme }} # Tests the build script for themes that have one. # @@ -130,6 +133,7 @@ jobs: with: ref: ${{ github.event_name == 'workflow_dispatch' && inputs.branch || github.ref }} show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + persist-credentials: false - name: Set up Node.js uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 @@ -187,6 +191,7 @@ jobs: with: ref: ${{ github.event_name == 'workflow_dispatch' && inputs.branch || github.ref }} show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + persist-credentials: false - name: Upload theme ZIP as an artifact uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 diff --git a/.github/workflows/upgrade-testing.yml b/.github/workflows/upgrade-testing.yml index 81037ba371c1b..4fab2812f0971 100644 --- a/.github/workflows/upgrade-testing.yml +++ b/.github/workflows/upgrade-testing.yml @@ -59,8 +59,6 @@ jobs: name: ${{ matrix.wp }} to ${{ inputs.new-version && inputs.new-version || 'latest' }} uses: ./.github/workflows/reusable-upgrade-testing.yml if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} - permissions: - contents: read strategy: fail-fast: false matrix: @@ -96,8 +94,6 @@ jobs: name: ${{ matrix.wp }} to ${{ inputs.new-version && inputs.new-version || 'latest' }} uses: ./.github/workflows/reusable-upgrade-testing.yml if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} - permissions: - contents: read strategy: fail-fast: false matrix: @@ -112,8 +108,6 @@ jobs: # The PHP <= 7.3/MySQL 8.4 jobs currently fail due to mysql_native_password being disabled by default. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '8.4' - - php: '7.3' - db-version: '8.4' with: os: ${{ matrix.os }} php: ${{ matrix.php }} @@ -142,8 +136,6 @@ jobs: # The PHP <= 7.3/MySQL 8.4 jobs currently fail due to mysql_native_password being disabled by default. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '8.4' - - php: '7.3' - db-version: '8.4' with: os: ${{ matrix.os }} php: ${{ matrix.php }} @@ -201,8 +193,6 @@ jobs: # The PHP <= 7.3/MySQL 8.4 jobs currently fail due to mysql_native_password being disabled by default. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '8.4' - - php: '7.3' - db-version: '8.4' with: os: ${{ matrix.os }} php: ${{ matrix.php }} diff --git a/.github/workflows/workflow-lint.yml b/.github/workflows/workflow-lint.yml new file mode 100644 index 0000000000000..2aabdf09e2641 --- /dev/null +++ b/.github/workflows/workflow-lint.yml @@ -0,0 +1,39 @@ +name: Lint GitHub Actions workflow files + +on: + push: + branches: + - trunk + - '6.[8-9]' + - '[7-9].[0-9]' + paths: + # Only run when changes are made to workflow files. + - '.github/workflows/**' + pull_request: + branches: + - trunk + - '[0-9].[0-9]' + paths: + # Only run when changes are made to workflow files. + - '.github/workflows/**' + workflow_dispatch: + +# Cancels all previous workflow runs for pull requests that have not completed. +concurrency: + # The concurrency group contains the workflow name and the branch name for pull requests + # or the commit hash for any other events. + group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }} + cancel-in-progress: true + +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + +jobs: + lint: + name: Lint GitHub Action files + permissions: + security-events: write + actions: read + contents: read + uses: ./.github/workflows/reusable-workflow-lint.yml diff --git a/docker-compose.yml b/docker-compose.yml index 7465f022e1299..48f3abc607b03 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -38,14 +38,14 @@ services: - wpdevnet environment: - - LOCAL_PHP_XDEBUG=${LOCAL_PHP_XDEBUG-false} - - XDEBUG_MODE=${LOCAL_PHP_XDEBUG_MODE-develop,debug} - - LOCAL_PHP_MEMCACHED=${LOCAL_PHP_MEMCACHED-false} - - PHP_FPM_UID=${PHP_FPM_UID-1000} - - PHP_FPM_GID=${PHP_FPM_GID-1000} - - GITHUB_REF=${GITHUB_REF-false} - - GITHUB_EVENT_NAME=${GITHUB_EVENT_NAME-false} - - HOST_PATH=${PWD-}/${LOCAL_DIR-src} + LOCAL_PHP_XDEBUG: ${LOCAL_PHP_XDEBUG-false} + XDEBUG_MODE: ${LOCAL_PHP_XDEBUG_MODE-develop,debug} + LOCAL_PHP_MEMCACHED: ${LOCAL_PHP_MEMCACHED-false} + PHP_FPM_UID: ${PHP_FPM_UID-1000} + PHP_FPM_GID: ${PHP_FPM_GID-1000} + GITHUB_REF: ${GITHUB_REF-false} + GITHUB_EVENT_NAME: ${GITHUB_EVENT_NAME-false} + HOST_PATH: ${PWD-}/${LOCAL_DIR-src} volumes: - ./tools/local-env/php-config.ini:/usr/local/etc/php/conf.d/php-config.ini @@ -83,7 +83,10 @@ services: command: ${LOCAL_DB_AUTH_OPTION-} healthcheck: - test: [ "CMD-SHELL", "if [ \"$LOCAL_DB_TYPE\" = \"mariadb\" ]; then case \"$LOCAL_DB_VERSION\" in 5.5|10.0|10.1|10.2|10.3) mysqladmin ping -h localhost || exit $$?;; *) mariadb-admin ping -h localhost || exit $$?;; esac; else mysqladmin ping -h localhost || exit $$?; fi" ] + test: [ + 'CMD-SHELL', + 'if [ "$LOCAL_DB_TYPE" = "mariadb" ]; then case "$LOCAL_DB_VERSION" in 5.5|10.0|10.1|10.2|10.3) mysqladmin ping -h localhost || exit $$?;; *) mariadb-admin ping -h localhost || exit $$?;; esac; else mysqladmin ping -h localhost || exit $$?; fi' + ] timeout: 5s interval: 5s retries: 10 @@ -98,11 +101,11 @@ services: - wpdevnet environment: - - LOCAL_PHP_XDEBUG=${LOCAL_PHP_XDEBUG-false} - - LOCAL_PHP_MEMCACHED=${LOCAL_PHP_MEMCACHED-false} - - PHP_FPM_UID=${PHP_FPM_UID-1000} - - PHP_FPM_GID=${PHP_FPM_GID-1000} - - HOST_PATH=${PWD-}/${LOCAL_DIR-src} + LOCAL_PHP_XDEBUG: ${LOCAL_PHP_XDEBUG-false} + LOCAL_PHP_MEMCACHED: ${LOCAL_PHP_MEMCACHED-false} + PHP_FPM_UID: ${PHP_FPM_UID-1000} + PHP_FPM_GID: ${PHP_FPM_GID-1000} + HOST_PATH: ${PWD-}/${LOCAL_DIR-src} volumes: - ./:/var/www From 003163f512986b72f50ccc1c99e202f0f3286fd8 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Wed, 22 Jan 2025 15:38:42 +0000 Subject: [PATCH 216/323] Coding Standards: Rename `$thisEnclosure` variable in `wp_xmlrpc_server` methods. This resolves a WPCS warning: {{{ Variable "$thisEnclosure" is not in valid snake_case format, try "$this_enclosure" }}} Follow-up to [16824], [19848]. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59680 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-xmlrpc-server.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index 601717e7e8ce9..f94e2f3d46089 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -5623,8 +5623,8 @@ public function mw_newPost( $args ) { } // Handle enclosures. - $thisEnclosure = isset( $content_struct['enclosure'] ) ? $content_struct['enclosure'] : null; - $this->add_enclosure_if_new( $post_id, $thisEnclosure ); + $enclosure = isset( $content_struct['enclosure'] ) ? $content_struct['enclosure'] : null; + $this->add_enclosure_if_new( $post_id, $enclosure ); $this->attach_uploads( $post_id, $post_content ); @@ -6019,8 +6019,8 @@ public function mw_editPost( $args ) { } // Handle enclosures. - $thisEnclosure = isset( $content_struct['enclosure'] ) ? $content_struct['enclosure'] : null; - $this->add_enclosure_if_new( $post_id, $thisEnclosure ); + $enclosure = isset( $content_struct['enclosure'] ) ? $content_struct['enclosure'] : null; + $this->add_enclosure_if_new( $post_id, $enclosure ); $this->attach_uploads( $ID, $post_content ); From 5d65aee36a8c3a3f6df49a897e51adc288898f68 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Wed, 22 Jan 2025 17:03:48 +0000 Subject: [PATCH 217/323] Build/Test Tools: Fix Slack message payload generation. The JSON string set as an output for the Slack message payload needs to be one line to prevent causing errors. This ensures `jq` returns a compact JSON string. Follow up to [59679]. Props johnbillion. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59681 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/slack-notifications.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/slack-notifications.yml b/.github/workflows/slack-notifications.yml index 5d50f89032978..2679e9e761fce 100644 --- a/.github/workflows/slack-notifications.yml +++ b/.github/workflows/slack-notifications.yml @@ -160,7 +160,7 @@ jobs: --arg ref_name "${CURRENT_BRANCH}" \ --arg run_url "https://github.com/WordPress/wordpress-develop/actions/runs/${GITHUB_RUN_ID}/attempts/${GITHUB_RUN_ATTEMPT}" \ --arg commit_message "${COMMIT_MSG}" \ - '{workflow_name: $workflow_name, ref_name: $ref_name, run_url: $run_url, commit_message: $commit_message}' + '{workflow_name: $workflow_name, ref_name: $ref_name, run_url: $run_url, commit_message: $commit_message}' | jq -c . )" echo "payload=$PAYLOAD" >> "$GITHUB_OUTPUT" env: From 82de1691e43801763b5213d731a4ee9ab8044e6c Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Wed, 22 Jan 2025 17:49:26 +0000 Subject: [PATCH 218/323] Build/Test Tools: Update `@playwright/test`. This updates `@playwright/test` to the latest version, currently `1.49.1`. In older branches using Playwright, the E2E and Performance workflows have recently started failing. This is due to changes in the GitHub Actions runner images. Updating Playwright ensures more modern dependency trees are used when installing browsers for testing and fixes the issue. Props swissspidy. See #62843. git-svn-id: https://develop.svn.wordpress.org/trunk@59682 602fd350-edb4-49c9-b593-d223f7449a82 --- package-lock.json | 27 +++++++++++++++------------ package.json | 2 +- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8175a44ff0880..d907a7883b1c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -103,7 +103,7 @@ }, "devDependencies": { "@lodder/grunt-postcss": "^3.1.1", - "@playwright/test": "1.45.0", + "@playwright/test": "1.49.1", "@pmmmwh/react-refresh-webpack-plugin": "0.5.15", "@wordpress/babel-preset-default": "8.8.2", "@wordpress/dependency-extraction-webpack-plugin": "6.8.3", @@ -4111,12 +4111,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.45.0.tgz", - "integrity": "sha512-TVYsfMlGAaxeUllNkywbwek67Ncf8FRGn8ZlRdO291OL3NjG9oMbfVhyP82HQF0CZLMrYsvesqoUekxdWuF9Qw==", + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.1.tgz", + "integrity": "sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "playwright": "1.45.0" + "playwright": "1.49.1" }, "bin": { "playwright": "cli.js" @@ -27848,12 +27849,13 @@ } }, "node_modules/playwright": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.45.0.tgz", - "integrity": "sha512-4z3ac3plDfYzGB6r0Q3LF8POPR20Z8D0aXcxbJvmfMgSSq1hkcgvFRXJk9rUq5H/MJ0Ktal869hhOdI/zUTeLA==", + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.1.tgz", + "integrity": "sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.45.0" + "playwright-core": "1.49.1" }, "bin": { "playwright": "cli.js" @@ -27866,10 +27868,11 @@ } }, "node_modules/playwright-core": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.45.0.tgz", - "integrity": "sha512-lZmHlFQ0VYSpAs43dRq1/nJ9G/6SiTI7VPqidld9TDefL9tX87bTKExWZZUF5PeRyqtXqd8fQi2qmfIedkwsNQ==", + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.1.tgz", + "integrity": "sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==", "dev": true, + "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, diff --git a/package.json b/package.json index 98e26ff06eaff..16db3938e79dc 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ ], "devDependencies": { "@lodder/grunt-postcss": "^3.1.1", - "@playwright/test": "1.45.0", + "@playwright/test": "1.49.1", "@pmmmwh/react-refresh-webpack-plugin": "0.5.15", "@wordpress/babel-preset-default": "8.8.2", "@wordpress/dependency-extraction-webpack-plugin": "6.8.3", From 90b3a49b83fcbfe46e7db2c6ce4ae8aca79d9708 Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Wed, 22 Jan 2025 19:24:48 +0000 Subject: [PATCH 219/323] Build/Test Tools: Coerce the `run_id` input to a string before passing it to the "Failed Workflow" workflow. Follow-up to [59679]. See #62221 git-svn-id: https://develop.svn.wordpress.org/trunk@59687 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/coding-standards.yml | 2 +- .github/workflows/end-to-end-tests.yml | 2 +- .github/workflows/install-testing.yml | 2 +- .github/workflows/javascript-tests.yml | 2 +- .github/workflows/local-docker-environment.yml | 2 +- .github/workflows/performance.yml | 2 +- .github/workflows/php-compatibility.yml | 2 +- .github/workflows/phpunit-tests.yml | 2 +- .github/workflows/slack-notifications.yml | 4 ++-- .github/workflows/test-and-zip-default-themes.yml | 2 +- .github/workflows/test-build-processes.yml | 2 +- .github/workflows/test-coverage.yml | 2 +- .github/workflows/upgrade-testing.yml | 2 +- 13 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/coding-standards.yml b/.github/workflows/coding-standards.yml index 70c3cee09a3ad..527293c4240f4 100644 --- a/.github/workflows/coding-standards.yml +++ b/.github/workflows/coding-standards.yml @@ -107,6 +107,6 @@ jobs: workflow_id: 'failed-workflow.yml', ref: 'trunk', inputs: { - run_id: context.runId, + run_id: `${context.runId}`, } }); diff --git a/.github/workflows/end-to-end-tests.yml b/.github/workflows/end-to-end-tests.yml index 5ec1763193bfa..173612a0d3af9 100644 --- a/.github/workflows/end-to-end-tests.yml +++ b/.github/workflows/end-to-end-tests.yml @@ -93,6 +93,6 @@ jobs: workflow_id: 'failed-workflow.yml', ref: 'trunk', inputs: { - run_id: context.runId, + run_id: `${context.runId}`, } }); diff --git a/.github/workflows/install-testing.yml b/.github/workflows/install-testing.yml index 8275b3851cb00..5fe90fddbb50f 100644 --- a/.github/workflows/install-testing.yml +++ b/.github/workflows/install-testing.yml @@ -179,6 +179,6 @@ jobs: workflow_id: 'failed-workflow.yml', ref: 'trunk', inputs: { - run_id: context.runId, + run_id: `${context.runId}`, } }); diff --git a/.github/workflows/javascript-tests.yml b/.github/workflows/javascript-tests.yml index db965045cfafb..3b36a0e96aa10 100644 --- a/.github/workflows/javascript-tests.yml +++ b/.github/workflows/javascript-tests.yml @@ -97,6 +97,6 @@ jobs: workflow_id: 'failed-workflow.yml', ref: 'trunk', inputs: { - run_id: context.runId, + run_id: `${context.runId}`, } }); diff --git a/.github/workflows/local-docker-environment.yml b/.github/workflows/local-docker-environment.yml index bed8d57cb0abe..d5c2a6be96a01 100644 --- a/.github/workflows/local-docker-environment.yml +++ b/.github/workflows/local-docker-environment.yml @@ -150,6 +150,6 @@ jobs: workflow_id: 'failed-workflow.yml', ref: 'trunk', inputs: { - run_id: context.runId, + run_id: `${context.runId}`, } }); diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index 66188564e7f94..73ef5afc87454 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -93,6 +93,6 @@ jobs: workflow_id: 'failed-workflow.yml', ref: 'trunk', inputs: { - run_id: context.runId, + run_id: `${context.runId}`, } }); diff --git a/.github/workflows/php-compatibility.yml b/.github/workflows/php-compatibility.yml index 69815a55daab5..bb611d0f8bf58 100644 --- a/.github/workflows/php-compatibility.yml +++ b/.github/workflows/php-compatibility.yml @@ -94,6 +94,6 @@ jobs: workflow_id: 'failed-workflow.yml', ref: 'trunk', inputs: { - run_id: context.runId, + run_id: `${context.runId}`, } }); diff --git a/.github/workflows/phpunit-tests.yml b/.github/workflows/phpunit-tests.yml index 9dd2c0e9e4642..dbab9135d01c1 100644 --- a/.github/workflows/phpunit-tests.yml +++ b/.github/workflows/phpunit-tests.yml @@ -263,6 +263,6 @@ jobs: workflow_id: 'failed-workflow.yml', ref: 'trunk', inputs: { - run_id: context.runId, + run_id: `${context.runId}`, } }); diff --git a/.github/workflows/slack-notifications.yml b/.github/workflows/slack-notifications.yml index 2679e9e761fce..08ed167ef15ef 100644 --- a/.github/workflows/slack-notifications.yml +++ b/.github/workflows/slack-notifications.yml @@ -68,7 +68,7 @@ jobs: const workflow_run = await github.rest.actions.getWorkflowRun({ owner: context.repo.owner, repo: context.repo.repo, - run_id: context.runId, + run_id: `${context.runId}`, }); if ( process.env.CALLING_STATUS == 'failure' && workflow_run.data.run_attempt == 1 ) { @@ -82,7 +82,7 @@ jobs: const previous_run = await github.rest.actions.getWorkflowRunAttempt({ owner: context.repo.owner, repo: context.repo.repo, - run_id: context.runId, + run_id: `${context.runId}`, attempt_number: workflow_run.data.run_attempt - 1 }); diff --git a/.github/workflows/test-and-zip-default-themes.yml b/.github/workflows/test-and-zip-default-themes.yml index 98e7071b5fe77..1eeac859f0d80 100644 --- a/.github/workflows/test-and-zip-default-themes.yml +++ b/.github/workflows/test-and-zip-default-themes.yml @@ -246,6 +246,6 @@ jobs: workflow_id: 'failed-workflow.yml', ref: 'trunk', inputs: { - run_id: '${{ github.run_id }}' + run_id: `${context.runId}`, } }); diff --git a/.github/workflows/test-build-processes.yml b/.github/workflows/test-build-processes.yml index bd0acbb4567b3..61685f2eeb5f8 100644 --- a/.github/workflows/test-build-processes.yml +++ b/.github/workflows/test-build-processes.yml @@ -160,6 +160,6 @@ jobs: workflow_id: 'failed-workflow.yml', ref: 'trunk', inputs: { - run_id: '${{ github.run_id }}' + run_id: `${context.runId}`, } }); diff --git a/.github/workflows/test-coverage.yml b/.github/workflows/test-coverage.yml index 4ddfdeae80882..4a5b3565d2fe1 100644 --- a/.github/workflows/test-coverage.yml +++ b/.github/workflows/test-coverage.yml @@ -110,6 +110,6 @@ jobs: workflow_id: 'failed-workflow.yml', ref: 'trunk', inputs: { - run_id: '${{ github.run_id }}' + run_id: `${context.runId}`, } }); diff --git a/.github/workflows/upgrade-testing.yml b/.github/workflows/upgrade-testing.yml index 4fab2812f0971..cd0a766cef8f0 100644 --- a/.github/workflows/upgrade-testing.yml +++ b/.github/workflows/upgrade-testing.yml @@ -312,6 +312,6 @@ jobs: workflow_id: 'failed-workflow.yml', ref: 'trunk', inputs: { - run_id: '${{ github.run_id }}' + run_id: `${context.runId}`, } }); From 4210d509599c6ff5ff79329f6b9f9ea6a756f884 Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Wed, 22 Jan 2025 19:46:16 +0000 Subject: [PATCH 220/323] General: Stop direct loading of files in `/wp-includes` that should only be included. This changeset restricts direct access call in `/wp-includes` and its sub directories. Follow-up to [11768], [59678]. Props deepakrohilla. Fixes #61314. git-svn-id: https://develop.svn.wordpress.org/trunk@59688 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-IXR.php | 5 +++++ src/wp-includes/class-wp-customize-control.php | 5 +++++ src/wp-includes/class-wp-customize-panel.php | 5 +++++ src/wp-includes/class-wp-customize-setting.php | 5 +++++ src/wp-includes/class-wp-http.php | 5 +++++ src/wp-includes/class-wp-simplepie-sanitize-kses.php | 5 +++++ src/wp-includes/class-wp-text-diff-renderer-table.php | 5 +++++ src/wp-includes/default-filters.php | 5 +++++ src/wp-includes/default-widgets.php | 5 +++++ src/wp-includes/feed-atom.php | 5 +++++ src/wp-includes/functions.php | 5 +++++ src/wp-includes/media.php | 5 +++++ src/wp-includes/ms-blogs.php | 5 +++++ src/wp-includes/ms-settings.php | 5 +++++ src/wp-includes/nav-menu-template.php | 5 +++++ src/wp-includes/update.php | 5 +++++ src/wp-includes/vars.php | 5 +++++ src/wp-includes/wp-diff.php | 5 +++++ 18 files changed, 90 insertions(+) diff --git a/src/wp-includes/class-IXR.php b/src/wp-includes/class-IXR.php index 0cd72df20e895..35657c7c7378f 100644 --- a/src/wp-includes/class-IXR.php +++ b/src/wp-includes/class-IXR.php @@ -39,6 +39,11 @@ * @license http://www.opensource.org/licenses/bsd-license.php BSD */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + require_once ABSPATH . WPINC . '/IXR/class-IXR-server.php'; require_once ABSPATH . WPINC . '/IXR/class-IXR-base64.php'; diff --git a/src/wp-includes/class-wp-customize-control.php b/src/wp-includes/class-wp-customize-control.php index 048c2afaf0c06..c85322fd9114b 100644 --- a/src/wp-includes/class-wp-customize-control.php +++ b/src/wp-includes/class-wp-customize-control.php @@ -7,6 +7,11 @@ * @since 3.4.0 */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + /** * Customize Control class. * diff --git a/src/wp-includes/class-wp-customize-panel.php b/src/wp-includes/class-wp-customize-panel.php index ec15ac8e665e2..4f2cb05b3c362 100644 --- a/src/wp-includes/class-wp-customize-panel.php +++ b/src/wp-includes/class-wp-customize-panel.php @@ -7,6 +7,11 @@ * @since 4.0.0 */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + /** * Customize Panel class. * diff --git a/src/wp-includes/class-wp-customize-setting.php b/src/wp-includes/class-wp-customize-setting.php index 99d0d2e51f199..95f6b26972682 100644 --- a/src/wp-includes/class-wp-customize-setting.php +++ b/src/wp-includes/class-wp-customize-setting.php @@ -7,6 +7,11 @@ * @since 3.4.0 */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + /** * Customize Setting class. * diff --git a/src/wp-includes/class-wp-http.php b/src/wp-includes/class-wp-http.php index fde0f4355de12..d901b1abde7d5 100644 --- a/src/wp-includes/class-wp-http.php +++ b/src/wp-includes/class-wp-http.php @@ -7,6 +7,11 @@ * @since 2.7.0 */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + if ( ! class_exists( 'WpOrg\Requests\Autoload' ) ) { require ABSPATH . WPINC . '/Requests/src/Autoload.php'; diff --git a/src/wp-includes/class-wp-simplepie-sanitize-kses.php b/src/wp-includes/class-wp-simplepie-sanitize-kses.php index d45df1c3e8156..9f0a2279f9647 100644 --- a/src/wp-includes/class-wp-simplepie-sanitize-kses.php +++ b/src/wp-includes/class-wp-simplepie-sanitize-kses.php @@ -7,6 +7,11 @@ * @since 4.7.0 */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + /** * Core class used to implement SimplePie feed sanitization. * diff --git a/src/wp-includes/class-wp-text-diff-renderer-table.php b/src/wp-includes/class-wp-text-diff-renderer-table.php index 4fa3d414d2401..25272265e261b 100644 --- a/src/wp-includes/class-wp-text-diff-renderer-table.php +++ b/src/wp-includes/class-wp-text-diff-renderer-table.php @@ -7,6 +7,11 @@ * @since 4.7.0 */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + /** * Table renderer to display the diff lines. * diff --git a/src/wp-includes/default-filters.php b/src/wp-includes/default-filters.php index 575e8a91758f1..0468797ee236c 100644 --- a/src/wp-includes/default-filters.php +++ b/src/wp-includes/default-filters.php @@ -23,6 +23,11 @@ * @package WordPress */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + // Strip, trim, kses, special chars for string saves. foreach ( array( 'pre_term_name', 'pre_comment_author_name', 'pre_link_name', 'pre_link_target', 'pre_link_rel', 'pre_user_display_name', 'pre_user_first_name', 'pre_user_last_name', 'pre_user_nickname' ) as $filter ) { add_filter( $filter, 'sanitize_text_field' ); diff --git a/src/wp-includes/default-widgets.php b/src/wp-includes/default-widgets.php index f8f3c4d141535..cbb25de8f0a4e 100644 --- a/src/wp-includes/default-widgets.php +++ b/src/wp-includes/default-widgets.php @@ -7,6 +7,11 @@ * @since 2.8.0 */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + /** WP_Widget_Pages class */ require_once ABSPATH . WPINC . '/widgets/class-wp-widget-pages.php'; diff --git a/src/wp-includes/feed-atom.php b/src/wp-includes/feed-atom.php index e9e3f49528065..9ee70f895a4c9 100644 --- a/src/wp-includes/feed-atom.php +++ b/src/wp-includes/feed-atom.php @@ -5,6 +5,11 @@ * @package WordPress */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + header( 'Content-Type: ' . feed_content_type( 'atom' ) . '; charset=' . get_option( 'blog_charset' ), true ); $more = 1; diff --git a/src/wp-includes/functions.php b/src/wp-includes/functions.php index 7e46dd53cab2d..6e1d97677d03c 100644 --- a/src/wp-includes/functions.php +++ b/src/wp-includes/functions.php @@ -5,6 +5,11 @@ * @package WordPress */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + require ABSPATH . WPINC . '/option.php'; /** diff --git a/src/wp-includes/media.php b/src/wp-includes/media.php index 2f280a58790c9..805691ad93e70 100644 --- a/src/wp-includes/media.php +++ b/src/wp-includes/media.php @@ -6,6 +6,11 @@ * @subpackage Media */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + /** * Retrieves additional image sizes. * diff --git a/src/wp-includes/ms-blogs.php b/src/wp-includes/ms-blogs.php index 724c4ad7d2255..0be865fd87f13 100644 --- a/src/wp-includes/ms-blogs.php +++ b/src/wp-includes/ms-blogs.php @@ -8,6 +8,11 @@ * @since MU (3.0.0) */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + require_once ABSPATH . WPINC . '/ms-site.php'; require_once ABSPATH . WPINC . '/ms-network.php'; diff --git a/src/wp-includes/ms-settings.php b/src/wp-includes/ms-settings.php index 27dc1337f5fd0..c665da17e3aeb 100644 --- a/src/wp-includes/ms-settings.php +++ b/src/wp-includes/ms-settings.php @@ -10,6 +10,11 @@ * @since 3.0.0 */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + /** * Objects representing the current network and current site. * diff --git a/src/wp-includes/nav-menu-template.php b/src/wp-includes/nav-menu-template.php index 860efa92d3377..d90fdfa8061ab 100644 --- a/src/wp-includes/nav-menu-template.php +++ b/src/wp-includes/nav-menu-template.php @@ -7,6 +7,11 @@ * @since 3.0.0 */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + /** Walker_Nav_Menu class */ require_once ABSPATH . WPINC . '/class-walker-nav-menu.php'; diff --git a/src/wp-includes/update.php b/src/wp-includes/update.php index 572f7ee4c6bc0..8dba379ad31de 100644 --- a/src/wp-includes/update.php +++ b/src/wp-includes/update.php @@ -6,6 +6,11 @@ * @since 2.3.0 */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + /** * Checks WordPress version against the newest version. * diff --git a/src/wp-includes/vars.php b/src/wp-includes/vars.php index b719b48d2e87f..22496330c33ff 100644 --- a/src/wp-includes/vars.php +++ b/src/wp-includes/vars.php @@ -15,6 +15,11 @@ * @package WordPress */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + global $pagenow, $is_lynx, $is_gecko, $is_winIE, $is_macIE, $is_opera, $is_NS4, $is_safari, $is_chrome, $is_iphone, $is_IE, $is_edge, $is_apache, $is_IIS, $is_iis7, $is_nginx, $is_caddy; diff --git a/src/wp-includes/wp-diff.php b/src/wp-includes/wp-diff.php index 4f4c2c6a159e1..e99a001ecb233 100644 --- a/src/wp-includes/wp-diff.php +++ b/src/wp-includes/wp-diff.php @@ -8,6 +8,11 @@ * @subpackage Diff */ +// Don't load directly. +if ( ! defined( 'ABSPATH' ) ) { + die( '-1' ); +} + if ( ! class_exists( 'Text_Diff', false ) ) { /** Text_Diff class */ require ABSPATH . WPINC . '/Text/Diff.php'; From b8dc43d2ccce13b6cbf3df2419a67c5b31110f43 Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Wed, 22 Jan 2025 21:16:19 +0000 Subject: [PATCH 221/323] Themes: Add `wp-singular` to the list of `body` classes when viewing a single post object. The `wp-singular` class includes a `wp` prefix to avoid conflicts with existing classes. This changeset also updates the `Tests_Post_GetBodyClass` PHPUnit test to include the new CSS class. Props danielpataki, peterwilsoncc, swissspidy, johnbillion, eceleste, poena, audrasjb, raj198, shailu25. Fixes #35164. git-svn-id: https://develop.svn.wordpress.org/trunk@59689 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post-template.php | 2 ++ tests/phpunit/tests/post/getBodyClass.php | 1 + 2 files changed, 3 insertions(+) diff --git a/src/wp-includes/post-template.php b/src/wp-includes/post-template.php index 4f3bfbef0cd7e..8b84b86702931 100644 --- a/src/wp-includes/post-template.php +++ b/src/wp-includes/post-template.php @@ -676,6 +676,8 @@ function get_body_class( $css_class = '' ) { $post_id = $post->ID; $post_type = $post->post_type; + $classes[] = 'wp-singular'; + if ( is_page_template() ) { $classes[] = "{$post_type}-template"; diff --git a/tests/phpunit/tests/post/getBodyClass.php b/tests/phpunit/tests/post/getBodyClass.php index 25810e6075740..6027fc3a075da 100644 --- a/tests/phpunit/tests/post/getBodyClass.php +++ b/tests/phpunit/tests/post/getBodyClass.php @@ -105,6 +105,7 @@ public function test_singular_body_classes() { $this->assertContains( 'single-post', $class ); $this->assertContains( "postid-{$post_id}", $class ); $this->assertContains( 'single-format-standard', $class ); + $this->assertContains( 'wp-singular', $class ); } public function test_page_template_body_classes_no_template() { From 5a8799d7da6e4815b1c152235942523402fe19a7 Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Wed, 22 Jan 2025 22:31:06 +0000 Subject: [PATCH 222/323] Administration: Remove useless arrow icon from WordPress admin menu. This changeset deletes the arrow that is typically added next to WordPress admin menu items that have submenus. The `.wp-menu-arrow` element is no longer visible since the WP 3.8 redesign, but the HTML and CSS remained. With this changeset, the HTML generating the arrow is removed, and the corresponding CSS styling is deleted. Props helen, azaozz, jbkkd, pbearne, flixos90. Fixes #26960. git-svn-id: https://develop.svn.wordpress.org/trunk@59690 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/css/admin-menu.css | 10 +--------- src/wp-admin/menu-header.php | 9 ++++----- tests/qunit/index.html | 1 - 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/src/wp-admin/css/admin-menu.css b/src/wp-admin/css/admin-menu.css index acbd903e6bf9a..d374e9c371714 100644 --- a/src/wp-admin/css/admin-menu.css +++ b/src/wp-admin/css/admin-menu.css @@ -180,9 +180,7 @@ #adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, #adminmenu li.current a.menu-top, -#adminmenu .wp-menu-arrow, -#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head, -#adminmenu .wp-menu-arrow div { +#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head { background: #2271b1; color: #fff; } @@ -333,12 +331,6 @@ div.wp-menu-image:before { position: fixed; } -/* A new arrow */ - -.wp-menu-arrow { - display: none !important; -} - ul#adminmenu a.wp-has-current-submenu { position: relative; } diff --git a/src/wp-admin/menu-header.php b/src/wp-admin/menu-header.php index 9887dcb9964c6..cf7fe7d3e005e 100644 --- a/src/wp-admin/menu-header.php +++ b/src/wp-admin/menu-header.php @@ -142,7 +142,6 @@ function _wp_menu_output( $menu, $submenu, $submenu_as_parent = true ) { $img_class = ' dashicons-before ' . sanitize_html_class( $item[6] ); } } - $arrow = '<div class="wp-menu-arrow"><div></div></div>'; $title = wptexturize( $item[0] ); @@ -171,9 +170,9 @@ function _wp_menu_output( $menu, $submenu, $submenu_as_parent = true ) { && ! file_exists( ABSPATH . "/wp-admin/$menu_file" ) ) ) { $admin_is_parent = true; - echo "<a href='admin.php?page={$submenu_items[0][2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style aria-hidden='true'>$img</div><div class='wp-menu-name'>$title</div></a>"; + echo "<a href='admin.php?page={$submenu_items[0][2]}'$class $aria_attributes><div class='wp-menu-image$img_class'$img_style aria-hidden='true'>$img</div><div class='wp-menu-name'>$title</div></a>"; } else { - echo "\n\t<a href='{$submenu_items[0][2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style aria-hidden='true'>$img</div><div class='wp-menu-name'>$title</div></a>"; + echo "\n\t<a href='{$submenu_items[0][2]}'$class $aria_attributes><div class='wp-menu-image$img_class'$img_style aria-hidden='true'>$img</div><div class='wp-menu-name'>$title</div></a>"; } } elseif ( ! empty( $item[2] ) && current_user_can( $item[1] ) ) { $menu_hook = get_plugin_page_hook( $item[2], 'admin.php' ); @@ -190,9 +189,9 @@ function _wp_menu_output( $menu, $submenu, $submenu_as_parent = true ) { && ! file_exists( ABSPATH . "/wp-admin/$menu_file" ) ) ) { $admin_is_parent = true; - echo "\n\t<a href='admin.php?page={$item[2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style aria-hidden='true'>$img</div><div class='wp-menu-name'>{$item[0]}</div></a>"; + echo "\n\t<a href='admin.php?page={$item[2]}'$class $aria_attributes><div class='wp-menu-image$img_class'$img_style aria-hidden='true'>$img</div><div class='wp-menu-name'>{$item[0]}</div></a>"; } else { - echo "\n\t<a href='{$item[2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style aria-hidden='true'>$img</div><div class='wp-menu-name'>{$item[0]}</div></a>"; + echo "\n\t<a href='{$item[2]}'$class $aria_attributes><div class='wp-menu-image$img_class'$img_style aria-hidden='true'>$img</div><div class='wp-menu-name'>{$item[0]}</div></a>"; } } diff --git a/tests/qunit/index.html b/tests/qunit/index.html index 47c5ee21ca7eb..7ed007802a571 100644 --- a/tests/qunit/index.html +++ b/tests/qunit/index.html @@ -2292,7 +2292,6 @@ <h2>Preview</h2> </li> <li class="wp-has-submenu wp-not-current-submenu menu-top menu-icon-plugins" id="menu-plugins"> <a href="plugins.php" class="wp-has-submenu wp-not-current-submenu menu-top menu-icon-plugins" aria-haspopup="true"> - <div class="wp-menu-arrow"><div></div></div> <div class="wp-menu-image dashicons-before dashicons-admin-plugins"><br></div> <div class="wp-menu-name">Plugins <span class="update-plugins count-2"> From 0cad2168b04b95ff37915a4e496325555b8ba72e Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Wed, 22 Jan 2025 23:29:25 +0000 Subject: [PATCH 223/323] Docs: Clarify the purpose of post date/time functions. This changeset clarifies the purpose of these functions and make the documentation more accurate and flexible. Instead of referring to the "date the post was written," the functions and filter descriptions now refer to the "date of the post." This change accommodates scenarios where the displayed date might not strictly correspond to the writing date (e.g. scheduled posts, backdated posts, or content where the "date" represents something other than creation). Props casiepa, audrasjb, SergeyBiryukov, Rarst, helen, azouamauriac, pbearne. Fixes #51289. git-svn-id: https://develop.svn.wordpress.org/trunk@59691 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/general-template.php | 36 ++++++++++++++-------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/wp-includes/general-template.php b/src/wp-includes/general-template.php index 11dffac4b3270..c64508032ac8d 100644 --- a/src/wp-includes/general-template.php +++ b/src/wp-includes/general-template.php @@ -2517,7 +2517,7 @@ function the_date_xml() { } /** - * Displays or retrieves the date the current post was written (once per date) + * Displays or retrieves the date of the post (once per date). * * Will only output the date if the current post's date is different from the * previous one output. @@ -2550,7 +2550,7 @@ function the_date( $format = '', $before = '', $after = '', $display = true ) { } /** - * Filters the date a post was published for display. + * Filters the date of the post, for display. * * @since 0.71 * @@ -2569,7 +2569,7 @@ function the_date( $format = '', $before = '', $after = '', $display = true ) { } /** - * Retrieves the date on which the post was written. + * Retrieves the date of the post. * * Unlike the_date() this function will always return the date. * Modify output with the {@see 'get_the_date'} filter. @@ -2592,7 +2592,7 @@ function get_the_date( $format = '', $post = null ) { $the_date = get_post_time( $_format, false, $post, true ); /** - * Filters the date a post was published. + * Filters the date of the post. * * @since 3.0.0 * @@ -2618,7 +2618,7 @@ function the_modified_date( $format = '', $before = '', $after = '', $display = $the_modified_date = $before . get_the_modified_date( $format ) . $after; /** - * Filters the date a post was last modified for display. + * Filters the date a post was last modified, for display. * * @since 2.1.0 * @@ -2672,7 +2672,7 @@ function get_the_modified_date( $format = '', $post = null ) { } /** - * Displays the time at which the post was written. + * Displays the date of the post. * * @since 0.71 * @@ -2682,7 +2682,7 @@ function get_the_modified_date( $format = '', $post = null ) { */ function the_time( $format = '' ) { /** - * Filters the time a post was written for display. + * Filters the date of the post, for display. * * @since 0.71 * @@ -2694,7 +2694,7 @@ function the_time( $format = '' ) { } /** - * Retrieves the time at which the post was written. + * Retrieves the date of the post. * * @since 1.5.0 * @@ -2717,7 +2717,7 @@ function get_the_time( $format = '', $post = null ) { $the_time = get_post_time( $_format, false, $post, true ); /** - * Filters the time a post was written. + * Filters the date of the post. * * @since 1.5.0 * @@ -2730,7 +2730,7 @@ function get_the_time( $format = '', $post = null ) { } /** - * Retrieves the time at which the post was written. + * Retrieves the localized date of the post. * * @since 2.0.0 * @@ -2774,12 +2774,12 @@ function get_post_time( $format = 'U', $gmt = false, $post = null, $translate = } /** - * Filters the localized time a post was written. + * Filters the localized date of the post. * * @since 2.6.0 * * @param string|int $time Formatted date string or Unix timestamp if `$format` is 'U' or 'G'. - * @param string $format Format to use for retrieving the time the post was written. + * @param string $format Format to use for retrieving the date of the post. * Accepts 'G', 'U', or PHP date format. * @param bool $gmt Whether to retrieve the GMT time. */ @@ -2976,7 +2976,7 @@ function get_post_modified_time( $format = 'U', $gmt = false, $post = null, $tra } /** - * Displays the weekday on which the post was written. + * Displays the weekday for the post. * * @since 0.71 * @@ -2994,7 +2994,7 @@ function the_weekday() { $the_weekday = $wp_locale->get_weekday( get_post_time( 'w', false, $post ) ); /** - * Filters the weekday on which the post was written, for display. + * Filters the weekday of the post, for display. * * @since 0.71 * @@ -3004,7 +3004,7 @@ function the_weekday() { } /** - * Displays the weekday on which the post was written. + * Displays the localized weekday date for the post * * Will only output the weekday if the current post's weekday is different from * the previous one output. @@ -3037,7 +3037,7 @@ function the_weekday_date( $before = '', $after = '' ) { } /** - * Filters the localized date on which the post was written, for display. + * Filters the localized weekday date of the post, for display. * * @since 0.71 * @@ -4351,7 +4351,7 @@ function get_search_query( $escaped = true ) { */ function the_search_query() { /** - * Filters the contents of the search query variable for display. + * Filters the contents of the search query variable, for display. * * @since 2.3.0 * @@ -4984,7 +4984,7 @@ function wp_generator() { */ function the_generator( $type ) { /** - * Filters the output of the XHTML generator tag for display. + * Filters the output of the XHTML generator tag, for display. * * @since 2.5.0 * From 4a991830e2c9ea89cbfc05c2146f57ecd613ad0f Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Thu, 23 Jan 2025 00:45:34 +0000 Subject: [PATCH 224/323] Docs: Correct description for `the_time()`, `get_the_time()`, and `get_post_time()`. This aims to avoid confusion with `the_date()` and `get_the_date()`. Includes synchronizing the description for `the_weekday()` and `the_weekday_date()`, which have very similar functionality, except that the latter will only output the weekday if the current post's weekday is different from the previous one output. Follow-up to [59691]. See #51289. git-svn-id: https://develop.svn.wordpress.org/trunk@59692 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/general-template.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/wp-includes/general-template.php b/src/wp-includes/general-template.php index c64508032ac8d..40597164699c4 100644 --- a/src/wp-includes/general-template.php +++ b/src/wp-includes/general-template.php @@ -2672,7 +2672,7 @@ function get_the_modified_date( $format = '', $post = null ) { } /** - * Displays the date of the post. + * Displays the time of the post. * * @since 0.71 * @@ -2682,7 +2682,7 @@ function get_the_modified_date( $format = '', $post = null ) { */ function the_time( $format = '' ) { /** - * Filters the date of the post, for display. + * Filters the time of the post, for display. * * @since 0.71 * @@ -2694,7 +2694,7 @@ function the_time( $format = '' ) { } /** - * Retrieves the date of the post. + * Retrieves the time of the post. * * @since 1.5.0 * @@ -2717,7 +2717,7 @@ function get_the_time( $format = '', $post = null ) { $the_time = get_post_time( $_format, false, $post, true ); /** - * Filters the date of the post. + * Filters the time of the post. * * @since 1.5.0 * @@ -2730,7 +2730,7 @@ function get_the_time( $format = '', $post = null ) { } /** - * Retrieves the localized date of the post. + * Retrieves the localized time of the post. * * @since 2.0.0 * @@ -2774,7 +2774,7 @@ function get_post_time( $format = 'U', $gmt = false, $post = null, $translate = } /** - * Filters the localized date of the post. + * Filters the localized time of the post. * * @since 2.6.0 * @@ -2976,7 +2976,7 @@ function get_post_modified_time( $format = 'U', $gmt = false, $post = null, $tra } /** - * Displays the weekday for the post. + * Displays the localized weekday for the post. * * @since 0.71 * @@ -2994,7 +2994,7 @@ function the_weekday() { $the_weekday = $wp_locale->get_weekday( get_post_time( 'w', false, $post ) ); /** - * Filters the weekday of the post, for display. + * Filters the localized weekday of the post, for display. * * @since 0.71 * @@ -3004,7 +3004,7 @@ function the_weekday() { } /** - * Displays the localized weekday date for the post + * Displays the localized weekday for the post. * * Will only output the weekday if the current post's weekday is different from * the previous one output. @@ -3037,7 +3037,7 @@ function the_weekday_date( $before = '', $after = '' ) { } /** - * Filters the localized weekday date of the post, for display. + * Filters the localized weekday of the post, for display. * * @since 0.71 * From 20071e0fefcbd4653aefcacb8f67bd46cb5d28d6 Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Thu, 23 Jan 2025 17:12:02 +0000 Subject: [PATCH 225/323] Build/Test Tools: Correct the usage of the conclusion of the previous run within the Slack notifications workflow. Prior to r59679 this value was echoed to GitHub output which meant that its surrounding double quotes lost their significance. Now this value is used directly in the job output it needs to be treated as a plain string. This concludes the conclusion confusion. See #82221 git-svn-id: https://develop.svn.wordpress.org/trunk@59693 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/slack-notifications.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/slack-notifications.yml b/.github/workflows/slack-notifications.yml index 08ed167ef15ef..53ad9c36fd0d6 100644 --- a/.github/workflows/slack-notifications.yml +++ b/.github/workflows/slack-notifications.yml @@ -64,6 +64,7 @@ jobs: with: retries: 2 retry-exempt-status-codes: 418 + result-encoding: string script: | const workflow_run = await github.rest.actions.getWorkflowRun({ owner: context.repo.owner, From e12e1f97537296e7769988b1099f8ab67031c391 Mon Sep 17 00:00:00 2001 From: Joe Dolson <joedolson@git.wordpress.org> Date: Thu, 23 Jan 2025 22:47:13 +0000 Subject: [PATCH 226/323] Editor: Remove option to disable the visual editor. Remove the option "Disable the visual editor when writing" from the user profile if it is currently false. If enabled, the option will stay available until disabled. This was blocked due to issues with tab order and focusability in the classic editor environment until [59188]. Props mark-k, SergeyBiryukov, joedolson, pento, iseulde, chriscct7, afercia, prasadkarmalkar, rcreators, jamieblomerus. Fixes #34681. git-svn-id: https://develop.svn.wordpress.org/trunk@59695 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/user-edit.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-admin/user-edit.php b/src/wp-admin/user-edit.php index 3f74baa856f57..1e9fe4dcc4213 100644 --- a/src/wp-admin/user-edit.php +++ b/src/wp-admin/user-edit.php @@ -296,7 +296,7 @@ <h2><?php _e( 'Personal Options' ); ?></h2> <table class="form-table" role="presentation"> - <?php if ( ! ( IS_PROFILE_PAGE && ! $user_can_edit ) ) : ?> + <?php if ( ! ( IS_PROFILE_PAGE && ! $user_can_edit ) && 'false' === $profile_user->rich_editing ) : ?> <tr class="user-rich-editing-wrap"> <th scope="row"><?php _e( 'Visual Editor' ); ?></th> <td> From 9548718a44924454f5c6c406d544675098f36403 Mon Sep 17 00:00:00 2001 From: Joe Dolson <joedolson@git.wordpress.org> Date: Thu, 23 Jan 2025 23:52:04 +0000 Subject: [PATCH 227/323] Editor: Change the `Text` editor label to `Code`. Rename the 'Text' tab of the classic editor to 'Code', mimicking the labels used in the block editor: "Visual editor" and "Code editor". Update code comment and Help documentation to reference the editor using the new label. Props lukecavanagh, ctienshi, travel_girl, audrasjb, sabernhardt, joedolson, rseigel, mark-k, sergeybiryukov, presskopp, giuriani, afercia, knutsp, audrasjb, sukhendu2002. Fixes #38061. git-svn-id: https://develop.svn.wordpress.org/trunk@59696 602fd350-edb4-49c9-b593-d223f7449a82 --- src/js/_enqueues/lib/link.js | 2 +- src/js/_enqueues/wp/autosave.js | 2 +- src/js/_enqueues/wp/editor/base.js | 12 ++++++------ src/wp-admin/edit-form-advanced.php | 6 +++--- src/wp-includes/class-wp-editor.php | 12 ++++++------ src/wp-includes/general-template.php | 2 +- src/wp-includes/widgets/class-wp-widget-text.php | 2 +- 7 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/js/_enqueues/lib/link.js b/src/js/_enqueues/lib/link.js index 2f2ef0d59c579..a2500a9069648 100644 --- a/src/js/_enqueues/lib/link.js +++ b/src/js/_enqueues/lib/link.js @@ -162,7 +162,7 @@ if ( wpLink.isMCE() ) { wpLink.mceRefresh( url, text ); } else { - // For the Text editor the "Link text" field is always shown. + // For the Code editor the "Link text" field is always shown. if ( ! inputs.wrap.hasClass( 'has-text-field' ) ) { inputs.wrap.addClass( 'has-text-field' ); } diff --git a/src/js/_enqueues/wp/autosave.js b/src/js/_enqueues/wp/autosave.js index 29d81e6e9d0c3..9f46c3161483e 100644 --- a/src/js/_enqueues/wp/autosave.js +++ b/src/js/_enqueues/wp/autosave.js @@ -559,7 +559,7 @@ window.autosave = function() { }); } else { - // Make sure the Text editor is selected. + // Make sure the Code editor is selected. $( '#content-html' ).trigger( 'click' ); $( '#content' ).trigger( 'focus' ); diff --git a/src/js/_enqueues/wp/editor/base.js b/src/js/_enqueues/wp/editor/base.js index 2e2e4423158a5..34c37053981d9 100644 --- a/src/js/_enqueues/wp/editor/base.js +++ b/src/js/_enqueues/wp/editor/base.js @@ -22,7 +22,7 @@ window.wp = window.wp || {}; $$ = tinymce.$; /** - * Handles onclick events for the Visual/Text tabs. + * Handles onclick events for the Visual/Code tabs. * * @since 4.3.0 * @@ -62,7 +62,7 @@ window.wp = window.wp || {}; } /** - * Switches the editor between Visual and Text mode. + * Switches the editor between Visual and Code mode. * * @since 2.5.0 * @@ -838,7 +838,7 @@ window.wp = window.wp || {}; } } - // Restore the selection when the editor is initialized. Needed when the Text editor is the default. + // Restore the selection when the editor is initialized. Needed when the Code editor is the default. $( document ).on( 'tinymce-editor-init.keep-scroll-position', function( event, editor ) { if ( editor.$( '.mce_SELRES_start' ).length ) { focusHTMLBookmarkInVisualEditor( editor ); @@ -1203,7 +1203,7 @@ window.wp = window.wp || {}; /** * Initialize TinyMCE and/or Quicktags. For use with wp_enqueue_editor() (PHP). * - * Intended for use with an existing textarea that will become the Text editor tab. + * Intended for use with an existing textarea that will become the Code editor tab. * The editor width will be the width of the textarea container, height will be adjustable. * * Settings for both TinyMCE and Quicktags can be passed on initialization, and are "filtered" @@ -1246,7 +1246,7 @@ window.wp = window.wp || {}; }; } - // Add wrap and the Visual|Text tabs. + // Add wrap and the Visual|Code tabs. if ( settings.tinymce && settings.quicktags ) { var $textarea = $( '#' + id ); @@ -1293,7 +1293,7 @@ window.wp = window.wp || {}; .append( $button.attr({ id: id + '-html', 'class': 'wp-switch-editor switch-html' - }).text( window.tinymce.translate( 'Text' ) ) ) + }).text( window.tinymce.translate( 'Code' ) ) ) ).append( $editorContainer ) ); diff --git a/src/wp-admin/edit-form-advanced.php b/src/wp-admin/edit-form-advanced.php index 319a534fd2791..f9ade65458bf2 100644 --- a/src/wp-admin/edit-form-advanced.php +++ b/src/wp-admin/edit-form-advanced.php @@ -283,9 +283,9 @@ ); $title_and_editor = '<p>' . __( '<strong>Title</strong> &mdash; Enter a title for your post. After you enter a title, you&#8217;ll see the permalink below, which you can edit.' ) . '</p>'; - $title_and_editor .= '<p>' . __( '<strong>Post editor</strong> &mdash; Enter the text for your post. There are two modes of editing: Visual and Text. Choose the mode by clicking on the appropriate tab.' ) . '</p>'; + $title_and_editor .= '<p>' . __( '<strong>Post editor</strong> &mdash; Enter the text for your post. There are two modes of editing: Visual and Code. Choose the mode by clicking on the appropriate tab.' ) . '</p>'; $title_and_editor .= '<p>' . __( 'Visual mode gives you an editor that is similar to a word processor. Click the Toolbar Toggle button to get a second row of controls.' ) . '</p>'; - $title_and_editor .= '<p>' . __( 'The Text mode allows you to enter HTML along with your post text. Note that &lt;p&gt; and &lt;br&gt; tags are converted to line breaks when switching to the Text editor to make it less cluttered. When you type, a single line break can be used instead of typing &lt;br&gt;, and two line breaks instead of paragraph tags. The line breaks are converted back to tags automatically.' ) . '</p>'; + $title_and_editor .= '<p>' . __( 'The Code mode allows you to enter HTML along with your post text. Note that &lt;p&gt; and &lt;br&gt; tags are converted to line breaks when switching to the Code editor to make it less cluttered. When you type, a single line break can be used instead of typing &lt;br&gt;, and two line breaks instead of paragraph tags. The line breaks are converted back to tags automatically.' ) . '</p>'; $title_and_editor .= '<p>' . __( 'You can insert media files by clicking the button above the post editor and following the directions. You can align or edit images using the inline formatting toolbar available in Visual mode.' ) . '</p>'; $title_and_editor .= '<p>' . __( 'You can enable distraction-free writing mode using the icon to the right. This feature is not available for old browsers or devices with small screens, and requires that the full-height editor be enabled in Screen Options.' ) . '</p>'; $title_and_editor .= '<p>' . sprintf( @@ -314,7 +314,7 @@ ); } elseif ( 'page' === $post_type ) { $about_pages = '<p>' . __( 'Pages are similar to posts in that they have a title, body text, and associated metadata, but they are different in that they are not part of the chronological blog stream, kind of like permanent posts. Pages are not categorized or tagged, but can have a hierarchy. You can nest pages under other pages by making one the &#8220;Parent&#8221; of the other, creating a group of pages.' ) . '</p>' . - '<p>' . __( 'Creating a Page is very similar to creating a Post, and the screens can be customized in the same way using drag and drop, the Screen Options tab, and expanding/collapsing boxes as you choose. This screen also has the distraction-free writing space, available in both the Visual and Text modes via the Fullscreen buttons. The Page editor mostly works the same as the Post editor, but there are some Page-specific features in the Page Attributes box.' ) . '</p>'; + '<p>' . __( 'Creating a Page is very similar to creating a Post, and the screens can be customized in the same way using drag and drop, the Screen Options tab, and expanding/collapsing boxes as you choose. This screen also has the distraction-free writing space, available in both the Visual and Code modes via the Fullscreen buttons. The Page editor mostly works the same as the Post editor, but there are some Page-specific features in the Page Attributes box.' ) . '</p>'; get_current_screen()->add_help_tab( array( diff --git a/src/wp-includes/class-wp-editor.php b/src/wp-includes/class-wp-editor.php index 9bda3f039b876..8ec20d6b22125 100644 --- a/src/wp-includes/class-wp-editor.php +++ b/src/wp-includes/class-wp-editor.php @@ -54,7 +54,7 @@ private function __construct() {} * @type string|int $tabindex Tabindex value to use. Default empty. * @type string $tabfocus_elements The previous and next element ID to move the focus to * when pressing the Tab key in TinyMCE. Default ':prev,:next'. - * @type string $editor_css Intended for extra styles for both Visual and Text editors. + * @type string $editor_css Intended for extra styles for both Visual and Code editors. * Should include `<style>` tags, and can use "scoped". Default empty. * @type string $editor_class Extra classes to add to the editor textarea element. Default empty. * @type bool $teeny Whether to output the minimal editor config. Examples include @@ -184,7 +184,7 @@ public static function editor( $content, $editor_id, $settings = array() ) { if ( self::$this_quicktags ) { $default_editor = $set['default_editor'] ? $set['default_editor'] : wp_default_editor(); - // 'html' is used for the "Text" editor tab. + // 'html' is used for the "Code" editor tab. if ( 'html' !== $default_editor ) { $default_editor = 'tinymce'; } @@ -194,7 +194,7 @@ public static function editor( $content, $editor_id, $settings = array() ) { $buttons .= '<button type="button" id="' . $editor_id_attr . '-tmce"' . $html_active . ' class="wp-switch-editor switch-tmce"' . ' data-wp-editor-id="' . $editor_id_attr . '">' . _x( 'Visual', 'Name for the Visual editor tab' ) . "</button>\n"; $buttons .= '<button type="button" id="' . $editor_id_attr . '-html"' . $tmce_active . ' class="wp-switch-editor switch-html"' . - ' data-wp-editor-id="' . $editor_id_attr . '">' . _x( 'Text', 'Name for the Text editor tab (formerly HTML)' ) . "</button>\n"; + ' data-wp-editor-id="' . $editor_id_attr . '">' . _x( 'Code', 'Name for the Code editor tab (formerly Text)' ) . "</button>\n"; } else { $default_editor = 'tinymce'; } @@ -272,7 +272,7 @@ public static function editor( $content, $editor_id, $settings = array() ) { 'id="' . $editor_id_attr . '">%s</textarea></div>' ); - // Prepare the content for the Visual or Text editor, only when TinyMCE is used (back-compat). + // Prepare the content for the Visual or Code editor, only when TinyMCE is used (back-compat). if ( self::$this_tinymce ) { add_filter( 'the_editor_content', 'format_for_editor', 10, 2 ); } @@ -627,7 +627,7 @@ public static function editor_settings( $editor_id, $set ) { ); /** - * Filters the list of teenyMCE buttons (Text tab). + * Filters the list of teenyMCE buttons (Code tab). * * @since 2.7.0 * @since 3.3.0 The `$editor_id` parameter was added. @@ -1396,7 +1396,7 @@ private static function get_translation() { 'Apply' => __( 'Apply' ), // Tooltip for the 'apply' button in the inline link dialog. 'Link options' => __( 'Link options' ), // Tooltip for the 'link options' button in the inline link dialog. 'Visual' => _x( 'Visual', 'Name for the Visual editor tab' ), // Editor switch tab label. - 'Text' => _x( 'Text', 'Name for the Text editor tab (formerly HTML)' ), // Editor switch tab label. + 'Code' => _x( 'Code', 'Name for the Code editor tab (formerly Text)' ), // Editor switch tab label. 'Add Media' => array( __( 'Add Media' ), 'accessM' ), // Tooltip for the 'Add Media' button in the block editor Classic block. // Shortcuts help modal. diff --git a/src/wp-includes/general-template.php b/src/wp-includes/general-template.php index 40597164699c4..f97071b7835a3 100644 --- a/src/wp-includes/general-template.php +++ b/src/wp-includes/general-template.php @@ -3792,7 +3792,7 @@ function user_can_richedit() { * Finds out which editor should be displayed by default. * * Works out which of the editors to display as the current editor for a - * user. The 'html' setting is for the "Text" editor tab. + * user. The 'html' setting is for the "Code" editor tab. * * @since 2.5.0 * diff --git a/src/wp-includes/widgets/class-wp-widget-text.php b/src/wp-includes/widgets/class-wp-widget-text.php index 1bd8f4f149b87..ba6c4fdfee0be 100644 --- a/src/wp-includes/widgets/class-wp-widget-text.php +++ b/src/wp-includes/widgets/class-wp-widget-text.php @@ -557,7 +557,7 @@ public static function render_control_template_scripts() { <div hidden class="wp-pointer paste-html-pointer wp-pointer-top"> <div class="wp-pointer-content"> <h3><?php _e( 'Did you just paste HTML?' ); ?></h3> - <p><?php _e( 'Hey there, looks like you just pasted HTML into the &#8220;Visual&#8221; tab of the Text widget. You may want to paste your code into the &#8220;Text&#8221; tab instead. Alternately, try out the new &#8220;Custom HTML&#8221; widget!' ); ?></p> + <p><?php _e( 'Hey there, looks like you just pasted HTML into the &#8220;Visual&#8221; tab of the Text widget. You may want to paste your code into the &#8220;Code&#8221; tab instead. Alternately, try out the new &#8220;Custom HTML&#8221; widget!' ); ?></p> <div class="wp-pointer-buttons"> <a class="close" href="#"><?php _e( 'Dismiss' ); ?></a> </div> From 530e8fda5d466b07391ff41fe20525d3de4c55ab Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Fri, 24 Jan 2025 00:02:08 +0000 Subject: [PATCH 228/323] Coding Standards: Rename the `$ID` variable in `wp_xmlrpc_server` methods. This resolves a WPCS warning: {{{ Variable "$ID" is not in valid snake_case format, try "$i_d" }}} Follow-up to [28448]. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59697 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-xmlrpc-server.php | 69 ++++++++++++++++++---- 1 file changed, 58 insertions(+), 11 deletions(-) diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index f94e2f3d46089..87d182f5aad11 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -5143,7 +5143,15 @@ public function blogger_newPost( $args ) { $post_date = current_time( 'mysql' ); $post_date_gmt = current_time( 'mysql', 1 ); - $post_data = compact( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_category', 'post_status' ); + $post_data = compact( + 'post_author', + 'post_date', + 'post_date_gmt', + 'post_content', + 'post_title', + 'post_category', + 'post_status' + ); $post_id = wp_insert_post( $post_data ); if ( is_wp_error( $post_id ) ) { @@ -5595,7 +5603,26 @@ public function mw_newPost( $args ) { } } - $postdata = compact( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'comment_status', 'ping_status', 'to_ping', 'post_type', 'post_name', 'post_password', 'post_parent', 'menu_order', 'tags_input', 'page_template' ); + $postdata = compact( + 'post_author', + 'post_date', + 'post_date_gmt', + 'post_content', + 'post_title', + 'post_category', + 'post_status', + 'post_excerpt', + 'comment_status', + 'ping_status', + 'to_ping', + 'post_type', + 'post_name', + 'post_password', + 'post_parent', + 'menu_order', + 'tags_input', + 'page_template' + ); $post_id = get_default_post_to_edit( $post_type, true )->ID; $postdata['ID'] = $post_id; @@ -5777,7 +5804,7 @@ public function mw_editPost( $args ) { $this->escape( $postdata ); - $ID = $postdata['ID']; + $post_id = $postdata['ID']; $post_content = $postdata['post_content']; $post_title = $postdata['post_title']; $post_excerpt = $postdata['post_excerpt']; @@ -5979,7 +6006,27 @@ public function mw_editPost( $args ) { } // We've got all the data -- post it. - $newpost = compact( 'ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'comment_status', 'ping_status', 'edit_date', 'post_date', 'post_date_gmt', 'to_ping', 'post_name', 'post_password', 'post_parent', 'menu_order', 'post_author', 'tags_input', 'page_template' ); + $newpost = compact( + 'post_id', + 'post_content', + 'post_title', + 'post_category', + 'post_status', + 'post_excerpt', + 'comment_status', + 'ping_status', + 'edit_date', + 'post_date', + 'post_date_gmt', + 'to_ping', + 'post_name', + 'post_password', + 'post_parent', + 'menu_order', + 'post_author', + 'tags_input', + 'page_template' + ); $result = wp_update_post( $newpost, true ); if ( is_wp_error( $result ) ) { @@ -6022,7 +6069,7 @@ public function mw_editPost( $args ) { $enclosure = isset( $content_struct['enclosure'] ) ? $content_struct['enclosure'] : null; $this->add_enclosure_if_new( $post_id, $enclosure ); - $this->attach_uploads( $ID, $post_content ); + $this->attach_uploads( $post_id, $post_content ); // Handle post formats if assigned, validation is handled earlier in this function. if ( isset( $content_struct['wp_post_format'] ) ) { @@ -6458,20 +6505,20 @@ public function mw_newMediaObject( $args ) { ); // Save the data. - $id = wp_insert_attachment( $attachment, $upload['file'], $post_id ); - wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $upload['file'] ) ); + $attachment_id = wp_insert_attachment( $attachment, $upload['file'], $post_id ); + wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $upload['file'] ) ); /** * Fires after a new attachment has been added via the XML-RPC MovableType API. * * @since 3.4.0 * - * @param int $id ID of the new attachment. - * @param array $args An array of arguments to add the attachment. + * @param int $attachment_id ID of the new attachment. + * @param array $args An array of arguments to add the attachment. */ - do_action( 'xmlrpc_call_success_mw_newMediaObject', $id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase + do_action( 'xmlrpc_call_success_mw_newMediaObject', $attachment_id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase - $struct = $this->_prepare_media_item( get_post( $id ) ); + $struct = $this->_prepare_media_item( get_post( $attachment_id ) ); // Deprecated values. $struct['id'] = $struct['attachment_id']; From 0f6707de3023234b85e7186fa5cd10ad039d0109 Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Fri, 24 Jan 2025 10:56:38 +0000 Subject: [PATCH 229/323] Themes: Add `wp-theme-<name>` and `wp-child-theme-<name>` classes to `body_class`. This changeset introduces new classes to the body tag. The classes `wp-theme-<name>` and `wp-child-theme-<name>` (when the current theme is a child theme) are added, where `<name>` represents the sanitized name of the active theme. Props cais, GaryJ, nacin, SergeyBiryukov, johnjamesjacoby, nirajgirixd, poena, audrasjb, rinkalpagdar. Fixes #19736. git-svn-id: https://develop.svn.wordpress.org/trunk@59698 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/admin-header.php | 5 +++++ src/wp-includes/post-template.php | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/wp-admin/admin-header.php b/src/wp-admin/admin-header.php index 54bcc11ca55b3..ea0245fdb119c 100644 --- a/src/wp-admin/admin-header.php +++ b/src/wp-admin/admin-header.php @@ -214,6 +214,11 @@ $admin_body_class .= ' block-editor-page wp-embed-responsive'; } +$admin_body_class .= ' wp-theme-' . sanitize_html_class( get_template() ); +if ( is_child_theme() ) { + $admin_body_class .= ' wp-child-theme-' . sanitize_html_class( get_stylesheet() ); +} + $error_get_last = error_get_last(); // Print a CSS class to make PHP errors visible. diff --git a/src/wp-includes/post-template.php b/src/wp-includes/post-template.php index 8b84b86702931..ffcca1647d326 100644 --- a/src/wp-includes/post-template.php +++ b/src/wp-includes/post-template.php @@ -838,6 +838,11 @@ function get_body_class( $css_class = '' ) { } } + $classes[] = 'wp-theme-' . sanitize_html_class( get_template() ); + if ( is_child_theme() ) { + $classes[] = 'wp-child-theme-' . sanitize_html_class( get_stylesheet() ); + } + if ( ! empty( $css_class ) ) { if ( ! is_array( $css_class ) ) { $css_class = preg_split( '#\s+#', $css_class ); From b88206a61f977f9053405e7c0c0af0deee78d37c Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Fri, 24 Jan 2025 12:28:26 +0000 Subject: [PATCH 230/323] XML-RPC: Correctly pass the `ID` value to `wp_update_post()` in `::mw_editPost()`. Follow-up to [59697]. Props johnbillion. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59699 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-xmlrpc-server.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index 87d182f5aad11..53fc23524936e 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -6005,9 +6005,11 @@ public function mw_editPost( $args ) { $post_date_gmt = $postdata['post_date_gmt']; } - // We've got all the data -- post it. - $newpost = compact( - 'post_id', + $newpost = array( + 'ID' => $post_id, + ); + + $newpost += compact( 'post_content', 'post_title', 'post_category', @@ -6028,6 +6030,7 @@ public function mw_editPost( $args ) { 'page_template' ); + // We've got all the data -- post it. $result = wp_update_post( $newpost, true ); if ( is_wp_error( $result ) ) { return new IXR_Error( 500, $result->get_error_message() ); From 97298804f610ea672aa0ea39dd7c717d06e5fcd0 Mon Sep 17 00:00:00 2001 From: Pascal Birchler <swissspidy@git.wordpress.org> Date: Fri, 24 Jan 2025 13:30:27 +0000 Subject: [PATCH 231/323] Posts, Post Types: Embeds: Add new `embeddable` argument to post types. This new argument, which defaults to the value of `public`, can be used to determine whether a post can be embedded using oEmbed. A new `is_post_embeddable()` function is added to easily check this. Props pampfelimetten, swissspidy, bradleyt, DrewAPicture, gadelhas, mukesh27. Fixes #35567. git-svn-id: https://develop.svn.wordpress.org/trunk@59700 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-post-type.php | 16 +++++++ src/wp-includes/embed.php | 12 +++-- src/wp-includes/post.php | 34 ++++++++++++++ tests/phpunit/tests/oembed/discovery.php | 15 +++++++ tests/phpunit/tests/oembed/template.php | 56 ++++++++++++++++++++++++ tests/phpunit/tests/post/types.php | 30 +++++++++++++ 6 files changed, 160 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/class-wp-post-type.php b/src/wp-includes/class-wp-post-type.php index 5336d3e1cf8f3..400fd0b698c1e 100644 --- a/src/wp-includes/class-wp-post-type.php +++ b/src/wp-includes/class-wp-post-type.php @@ -113,6 +113,16 @@ final class WP_Post_Type { */ public $publicly_queryable = null; + /** + * Whether this post type is embeddable. + * + * Default is the value of $public. + * + * @since 6.8.0 + * @var bool $embeddable + */ + public $embeddable = null; + /** * Whether to generate and allow a UI for managing this post type in the admin. * @@ -521,6 +531,7 @@ public function set_props( $args ) { 'hierarchical' => false, 'exclude_from_search' => null, 'publicly_queryable' => null, + 'embeddable' => null, 'show_ui' => null, 'show_in_menu' => null, 'show_in_nav_menus' => null, @@ -565,6 +576,11 @@ public function set_props( $args ) { $args['show_ui'] = $args['public']; } + // If not set, default to the setting for 'public'. + if ( null === $args['embeddable'] ) { + $args['embeddable'] = $args['public']; + } + // If not set, default rest_namespace to wp/v2 if show_in_rest is true. if ( false === $args['rest_namespace'] && ! empty( $args['show_in_rest'] ) ) { $args['rest_namespace'] = 'wp/v2'; diff --git a/src/wp-includes/embed.php b/src/wp-includes/embed.php index f7fe10e48239d..b5b30acead880 100644 --- a/src/wp-includes/embed.php +++ b/src/wp-includes/embed.php @@ -331,11 +331,12 @@ function wp_oembed_register_route() { * Adds oEmbed discovery links in the head element of the website. * * @since 4.4.0 + * @since 6.8.0 Output was adjusted to only embed if the post supports it. */ function wp_oembed_add_discovery_links() { $output = ''; - if ( is_singular() ) { + if ( is_singular() && is_post_embeddable() ) { $output .= '<link rel="alternate" title="' . _x( 'oEmbed (JSON)', 'oEmbed resource link name' ) . '" type="application/json+oembed" href="' . esc_url( get_oembed_endpoint_url( get_permalink() ) ) . '" />' . "\n"; if ( class_exists( 'SimpleXMLElement' ) ) { @@ -538,11 +539,12 @@ function get_post_embed_html( $width, $height, $post = null ) { * Retrieves the oEmbed response data for a given post. * * @since 4.4.0 + * @since 6.8.0 Output was adjusted to only embed if the post type supports it. * * @param WP_Post|int $post Post ID or post object. * @param int $width The requested width. - * @return array|false Response data on success, false if post doesn't exist - * or is not publicly viewable. + * @return array|false Response data on success, false if post doesn't exist, + * is not publicly viewable or post type is not embeddable. */ function get_oembed_response_data( $post, $width ) { $post = get_post( $post ); @@ -556,6 +558,10 @@ function get_oembed_response_data( $post, $width ) { return false; } + if ( ! is_post_embeddable( $post ) ) { + return false; + } + /** * Filters the allowed minimum and maximum widths for the oEmbed response. * diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index 009287916d7bb..a78e97b6c1dd9 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -2475,6 +2475,40 @@ function is_post_publicly_viewable( $post = null ) { return is_post_type_viewable( $post_type ) && is_post_status_viewable( $post_status ); } +/** + * Determines whether a post is embeddable. + * + * @since 6.8.0 + * + * @param int|WP_Post|null $post Optional. Post ID or `WP_Post` object. Defaults to global $post. + * @return bool Whether the post should be considered embeddable. + */ +function is_post_embeddable( $post = null ) { + $post = get_post( $post ); + + if ( ! $post ) { + return false; + } + + $post_type = get_post_type_object( $post->post_type ); + + if ( ! $post_type ) { + return false; + } + + $is_embeddable = $post_type->embeddable; + + /** + * Filter whether a post is embeddable. + * + * @since 6.8.0 + * + * @param bool $is_embeddable Whether the post is embeddable. + * @param WP_Post $post Post object. + */ + return apply_filters( 'is_post_embeddable', $is_embeddable, $post ); +} + /** * Retrieves an array of the latest posts, or posts matching the given criteria. * diff --git a/tests/phpunit/tests/oembed/discovery.php b/tests/phpunit/tests/oembed/discovery.php index 675d3264fcf71..41efe1cc2a378 100644 --- a/tests/phpunit/tests/oembed/discovery.php +++ b/tests/phpunit/tests/oembed/discovery.php @@ -85,4 +85,19 @@ public function test_add_oembed_discovery_links_to_attachment() { $this->assertSame( $expected, get_echo( 'wp_oembed_add_discovery_links' ) ); } + + /** + * @ticket 35567 + */ + public function test_wp_oembed_add_discovery_links_non_embeddable_post_type_output_should_be_empty() { + register_post_type( 'not_embeddable', array( 'embeddable' => false ) ); + + $post = self::factory()->post->create_and_get( + array( + 'post_type' => 'not_embeddable', + ) + ); + + $this->assertFalse( get_oembed_response_data( $post, 100 ) ); + } } diff --git a/tests/phpunit/tests/oembed/template.php b/tests/phpunit/tests/oembed/template.php index 8416b50c1b0a5..bce26bbcd8ddd 100644 --- a/tests/phpunit/tests/oembed/template.php +++ b/tests/phpunit/tests/oembed/template.php @@ -343,4 +343,60 @@ public function test_wp_maybe_enqueue_oembed_host_js_without_wp_head_action() { wp_maybe_enqueue_oembed_host_js( $post_embed ); $this->assertFalse( $scripts->query( 'wp-embed', 'enqueued' ) ); } + + /** + * @ticket 35567 + */ + public function test_is_embeddable_post_non_existent_post() { + $this->assertFalse( is_post_embeddable( 99999 ) ); + } + + /** + * @ticket 35567 + */ + public function test_is_embeddable_post_should_return_false_for_non_embeddable_post_type() { + register_post_type( 'not_embeddable', array( 'embeddable' => false ) ); + + $post = self::factory()->post->create_and_get( + array( + 'post_type' => 'not_embeddable', + ) + ); + + $this->assertFalse( is_post_embeddable( $post ) ); + } + + /** + * @ticket 35567 + */ + public function test_is_embeddable_post_should_return_true_for_embeddable_post_type() { + register_post_type( 'embeddable', array( 'embeddable' => true ) ); + + $post = self::factory()->post->create_and_get( + array( + 'post_type' => 'embeddable', + ) + ); + + $this->assertTrue( is_post_embeddable( $post ) ); + } + + /** + * @ticket 35567 + */ + public function test_is_embeddable_post_filtered() { + register_post_type( 'not_embeddable', array( 'embeddable' => false ) ); + + $post = self::factory()->post->create_and_get( + array( + 'post_type' => 'not_embeddable', + ) + ); + + add_filter( 'is_post_embeddable', '__return_true' ); + $embeddable = is_post_embeddable( $post ); + remove_filter( 'is_post_embeddable', '__return_true' ); + + $this->assertTrue( $embeddable ); + } } diff --git a/tests/phpunit/tests/post/types.php b/tests/phpunit/tests/post/types.php index 5aa1ca505a22f..96519586d6cff 100644 --- a/tests/phpunit/tests/post/types.php +++ b/tests/phpunit/tests/post/types.php @@ -646,4 +646,34 @@ public function test_removing_editor_support_does_not_remove_autosave_support() $this->assertFalse( post_type_supports( 'foo', 'editor' ), 'Post type should not support editor.' ); $this->assertTrue( post_type_supports( 'foo', 'autosave' ), 'Post type should still support autosaves.' ); } + + /** + * @group oembed + * @ticket 35567 + */ + public function test_register_post_type_is_embeddable_should_default_to_value_of_public() { + $post_type = register_post_type( $this->post_type ); + $this->assertFalse( $post_type->embeddable, 'Non-public post type should not be embeddable by default' ); + + $post_type = register_post_type( $this->post_type, array( 'public' => true ) ); + $this->assertTrue( $post_type->embeddable, 'Public post type should be embeddable by default' ); + } + + /** + * @group oembed + * @ticket 35567 + */ + public function test_register_post_type_override_is_embeddable() { + $post_type = register_post_type( $this->post_type, array( 'embeddable' => true ) ); + $this->assertTrue( $post_type->embeddable, 'Post type should be embeddable even though it is not public' ); + + $post_type = register_post_type( + $this->post_type, + array( + 'public' => true, + 'embeddable' => false, + ) + ); + $this->assertFalse( $post_type->embeddable, 'Post type should not be embeddable even though it is public' ); + } } From 5a213bfd41d1eda96332b8518df458565b23797f Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Fri, 24 Jan 2025 14:00:56 +0000 Subject: [PATCH 232/323] Import: Add the `import_filters` action hook to the Import screen. This changeset introduces the new `import_filters` action hook at the end of the Import screen, consistently with other admin screens like `export.php`. Props audrasjb, lenasterg. Fixes #54419. See #19863. git-svn-id: https://develop.svn.wordpress.org/trunk@59701 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/import.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/wp-admin/import.php b/src/wp-admin/import.php index e04dc3109bc71..913f402fe38e4 100644 --- a/src/wp-admin/import.php +++ b/src/wp-admin/import.php @@ -235,6 +235,13 @@ esc_url( network_admin_url( 'plugin-install.php?tab=search&type=tag&s=importer' ) ) ) . '</p>'; } + +/** + * Fires at the end of the Import screen. + * + * @since 6.8.0 + */ +do_action( 'import_filters' ); ?> </div> From a3f0f609be08d47ab3513eaf3307ef02d48ede60 Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Fri, 24 Jan 2025 21:18:05 +0000 Subject: [PATCH 233/323] Docs: Various Docblock fixes in `wp-includes/widgets.php`, as per WP Docs standards; Props ankitpatel1578, sabernhardt. Fixes #62859. See #62281. git-svn-id: https://develop.svn.wordpress.org/trunk@59702 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/widgets.php | 42 ++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/wp-includes/widgets.php b/src/wp-includes/widgets.php index aa17656507a4f..6bc1ffc6f7724 100644 --- a/src/wp-includes/widgets.php +++ b/src/wp-includes/widgets.php @@ -3,7 +3,7 @@ * Core Widgets API * * This API is used for creating dynamic sidebar without hardcoding functionality into - * themes + * themes. * * Includes both internal WordPress routines and theme-use routines. * @@ -103,7 +103,7 @@ // /** - * Register a widget + * Registers a widget. * * Registers a WP_Widget widget * @@ -226,7 +226,7 @@ function register_sidebars( $number = 1, $args = array() ) { * on what other plugins and themes are installed. * * If theme support for 'widgets' has not yet been added when this function is - * called, it will be automatically enabled through the use of add_theme_support() + * called, it will be automatically enabled through the use of add_theme_support(). * * @since 2.2.0 * @since 5.6.0 Added the `before_sidebar` and `after_sidebar` arguments. @@ -361,7 +361,7 @@ function is_registered_sidebar( $sidebar_id ) { } /** - * Register an instance of a widget. + * Registers an instance of a widget. * * The default widget option is 'classname' that can be overridden. * @@ -435,7 +435,7 @@ function wp_register_sidebar_widget( $id, $name, $output_callback, $options = ar } /** - * Retrieve description for widget. + * Retrieves description for widget. * * When registering widgets, the options can also include 'description' that * describes the widget for display on the widget administration panel or @@ -461,7 +461,7 @@ function wp_widget_description( $id ) { } /** - * Retrieve description for a sidebar. + * Retrieves description for a sidebar. * * When registering sidebars a 'description' parameter can be included that * describes the sidebar for display on the widget administration panel. @@ -669,7 +669,7 @@ function _register_widget_form_callback( $id, $name, $form_callback, $options = } /** - * Remove control callback for widget. + * Removes control callback for widget. * * @since 2.2.0 * @@ -680,7 +680,7 @@ function wp_unregister_widget_control( $id ) { } /** - * Display dynamic sidebar. + * Displays dynamic sidebar. * * By default this displays the default sidebar or 'sidebar-1'. If your theme specifies the 'id' or * 'name' parameter for its registered sidebars you can pass an ID or name as the $index parameter. @@ -883,8 +883,8 @@ function dynamic_sidebar( $index = 1 ) { /** * Determines whether a given widget is displayed on the front end. * - * Either $callback or $id_base can be used - * $id_base is the first argument when extending WP_Widget class + * Either $callback or $id_base can be used. + * $id_base is the first argument when extending WP_Widget class. * Without the optional $widget_id parameter, returns the ID of the first sidebar * in which the first instance of the widget with the given callback or $id_base is found. * With the $widget_id parameter, returns the ID of the sidebar where @@ -1002,7 +1002,7 @@ function is_active_sidebar( $index ) { // /** - * Retrieve full list of sidebars and their widget instance IDs. + * Retrieves the full list of sidebars and their widget instance IDs. * * Will upgrade sidebar widget list, if needed. Will also save updated list, if * needed. @@ -1081,7 +1081,7 @@ function wp_get_sidebar( $id ) { } /** - * Set the sidebar widget option to update sidebars. + * Sets the sidebar widget option to update sidebars. * * @since 2.2.0 * @access private @@ -1103,7 +1103,7 @@ function wp_set_sidebars_widgets( $sidebars_widgets ) { } /** - * Retrieve default registered sidebars list. + * Retrieves default registered sidebars list. * * @since 2.2.0 * @access private @@ -1194,7 +1194,7 @@ function wp_convert_widget_settings( $base_name, $option_name, $settings ) { } /** - * Output an arbitrary widget as a template tag. + * Outputs an arbitrary widget as a template tag. * * @since 2.8.0 * @@ -1282,7 +1282,7 @@ function _get_widget_id_base( $id ) { } /** - * Handle sidebars config after theme change + * Handles sidebars config after theme change. * * @access private * @since 3.3.0 @@ -1575,7 +1575,7 @@ function _wp_remove_unregistered_widgets( $sidebars_widgets, $allowed_widget_ids } /** - * Display the RSS entries in a list. + * Displays the RSS entries in a list. * * @since 2.5.0 * @@ -1682,7 +1682,7 @@ function wp_widget_rss_output( $rss, $args = array() ) { } /** - * Display RSS widget options form. + * Displays RSS widget options form. * * The options for what fields are displayed for the RSS form are all booleans * and are as follows: 'url', 'title', 'items', 'show_summary', 'show_author', @@ -1763,7 +1763,7 @@ function wp_widget_rss_form( $args, $inputs = null ) { } /** - * Process RSS feed widget data and optionally retrieve feed items. + * Processes RSS feed widget data and optionally retrieve feed items. * * The feed widget can not have more than 20 items or it will reset back to the * default, which is 10. @@ -1883,9 +1883,9 @@ function wp_setup_widgets_block_editor() { } /** - * Whether or not to use the block editor to manage widgets. Defaults to true - * unless a theme has removed support for widgets-block-editor or a plugin has - * filtered the return value of this function. + * Determines whether or not to use the block editor to manage widgets. + * Defaults to true unless a theme has removed support for widgets-block-editor + * or a plugin has filtered the return value of this function. * * @since 5.8.0 * From 1cb2ed28880e1c643bee6fd91dad4cfd34911566 Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Fri, 24 Jan 2025 22:58:32 +0000 Subject: [PATCH 234/323] Posts, Post Types: Remove `title` attribute from `the_shortlink()`. Since [13683], `the_shortlink()` has included a `title` attribute. By default, that gives the sanitized post title, and it does not sanitize custom text. Given the low value of this attribute, this changeset removes it. Props sabernhardt, audrasjb, joedolson. Fixes #62838. See #24766. git-svn-id: https://develop.svn.wordpress.org/trunk@59703 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/link-template.php | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/wp-includes/link-template.php b/src/wp-includes/link-template.php index da57ebd64df80..5d49d7169db60 100644 --- a/src/wp-includes/link-template.php +++ b/src/wp-includes/link-template.php @@ -4247,11 +4247,12 @@ function wp_shortlink_header() { * Call like the_shortlink( __( 'Shortlinkage FTW' ) ) * * @since 3.0.0 + * @since 6.8.0 Removed title attribute. * - * @param string $text Optional The link text or HTML to be displayed. Defaults to 'This is the short link.' - * @param string $title Optional The tooltip for the link. Must be sanitized. Defaults to the sanitized post title. - * @param string $before Optional HTML to display before the link. Default empty. - * @param string $after Optional HTML to display after the link. Default empty. + * @param string $text Optional. The link text or HTML to be displayed. Defaults to 'This is the short link.' + * @param string $title Unused. + * @param string $before Optional. HTML to display before the link. Default empty. + * @param string $after Optional. HTML to display after the link. Default empty. */ function the_shortlink( $text = '', $title = '', $before = '', $after = '' ) { $post = get_post(); @@ -4260,14 +4261,10 @@ function the_shortlink( $text = '', $title = '', $before = '', $after = '' ) { $text = __( 'This is the short link.' ); } - if ( empty( $title ) ) { - $title = the_title_attribute( array( 'echo' => false ) ); - } - $shortlink = wp_get_shortlink( $post->ID ); if ( ! empty( $shortlink ) ) { - $link = '<a rel="shortlink" href="' . esc_url( $shortlink ) . '" title="' . $title . '">' . $text . '</a>'; + $link = '<a rel="shortlink" href="' . esc_url( $shortlink ) . '">' . $text . '</a>'; /** * Filters the short link anchor tag for a post. @@ -4277,7 +4274,7 @@ function the_shortlink( $text = '', $title = '', $before = '', $after = '' ) { * @param string $link Shortlink anchor tag. * @param string $shortlink Shortlink URL. * @param string $text Shortlink's text. - * @param string $title Shortlink's title attribute. + * @param string $title Shortlink's title attribute. Unused. */ $link = apply_filters( 'the_shortlink', $link, $shortlink, $text, $title ); echo $before, $link, $after; From 0a2a18a63611c24f362a2b180a962b5981550736 Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Fri, 24 Jan 2025 23:26:18 +0000 Subject: [PATCH 235/323] Docs: Improve @return docblock section for `get_category()`. This changeset adds more details on the `WP_Term` returned by `get_category()` as it contains additional backwards compatible aliases for the era before WP 4.4 and 2.3. Props apermo, audrasjb. Fixes #62842. See #62281. git-svn-id: https://develop.svn.wordpress.org/trunk@59704 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/category.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/category.php b/src/wp-includes/category.php index 5dc35cf6b5737..d1c43274d704b 100644 --- a/src/wp-includes/category.php +++ b/src/wp-includes/category.php @@ -85,8 +85,9 @@ function get_categories( $args = '' ) { * correspond to a WP_Term object, an associative array, or a numeric array, * respectively. Default OBJECT. * @param string $filter Optional. How to sanitize category fields. Default 'raw'. - * @return object|array|WP_Error|null Category data in type defined by $output parameter. - * WP_Error if $category is empty, null if it does not exist. + * @return WP_Term|array|WP_Error|null Category data in type defined by $output parameter. + * Returns a WP_Term object with backwards compatible property aliases filled in. + * WP_Error if $category is empty, null if it does not exist. */ function get_category( $category, $output = OBJECT, $filter = 'raw' ) { $category = get_term( $category, 'category', $output, $filter ); From 9465b374cbf5aea473916d874e1f568cab3b5a07 Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Sat, 25 Jan 2025 14:05:29 +0000 Subject: [PATCH 236/323] Administration: Introduce a lighter background for WP Admin. This changeset replaces the light grey background color with the white color defined in the Editor Storybook. This change also impacts admin color schemes that previously utilized the default admin background color. This is an initial implementation of the WordPress design system, aligning with the broader goal of achieving a more consistent and unified design across the administration. Props karmatosed, audrasjb. Fixes #62831. git-svn-id: https://develop.svn.wordpress.org/trunk@59705 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/css/admin-menu.css | 2 +- src/wp-admin/css/colors/_variables.scss | 2 +- src/wp-admin/css/common.css | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/wp-admin/css/admin-menu.css b/src/wp-admin/css/admin-menu.css index d374e9c371714..c7d3b1d3dd880 100644 --- a/src/wp-admin/css/admin-menu.css +++ b/src/wp-admin/css/admin-menu.css @@ -344,7 +344,7 @@ ul#adminmenu > li.current > a.current:after { width: 0; position: absolute; pointer-events: none; - border-right-color: #f0f0f1; + border-right-color: #fff; top: 50%; margin-top: -8px; } diff --git a/src/wp-admin/css/colors/_variables.scss b/src/wp-admin/css/colors/_variables.scss index 8a073f830e4b6..724a51d73dfdb 100644 --- a/src/wp-admin/css/colors/_variables.scss +++ b/src/wp-admin/css/colors/_variables.scss @@ -15,7 +15,7 @@ $notification-color: #d54e21 !default; // global -$body-background: #f1f1f1 !default; +$body-background: #fff !default; $link: #0073aa !default; $link-focus: color.adjust($link, $lightness: 10%) !default; diff --git a/src/wp-admin/css/common.css b/src/wp-admin/css/common.css index 6d24705d549b2..6c050e851df58 100644 --- a/src/wp-admin/css/common.css +++ b/src/wp-admin/css/common.css @@ -220,7 +220,6 @@ body { } body { - background: #f0f0f1; color: #3c434a; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; From 08a292b7f6f853bd081097204d8760c4c8a12637 Mon Sep 17 00:00:00 2001 From: audrasjb <audrasjb@602fd350-edb4-49c9-b593-d223f7449a82> Date: Sat, 25 Jan 2025 14:10:01 +0000 Subject: [PATCH 237/323] Plugins: Improve search box margin behavior in the Add Plugins screen. This changeset fixes a margin issue in the search input box on the Add New Plugins screen, which was previously breaking below 1138px. Specifically, the top margin was set to 0px, and the overall appearance of the search box was inconsistent between 1000px and 1138px. Now, the margin is consistent across all breakpoints. Props jomonthomaslobo1, narenin, iflairwebtechnologies, peterwilsoncc, audrasjb, shailu25. Fixes #61785. git-svn-id: https://develop.svn.wordpress.org/trunk@59706 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/css/common.css | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/wp-admin/css/common.css b/src/wp-admin/css/common.css index 6c050e851df58..16f3ae88626c0 100644 --- a/src/wp-admin/css/common.css +++ b/src/wp-admin/css/common.css @@ -1115,11 +1115,6 @@ th.action-links { align-items: center; } -.wp-filter .search-form.search-plugins { - /* This element is a flex item: the inherited float won't have any effect. */ - margin-top: 0; -} - .wp-filter .search-form.search-plugins select, .wp-filter .search-form.search-plugins .wp-filter-search, .no-js .wp-filter .search-form.search-plugins .button { @@ -1352,6 +1347,12 @@ th.action-links { float: none; } +@media only screen and (max-width: 1138px) { + .wp-filter .search-form { + margin: 11px 0; + } +} + @media only screen and (max-width: 1120px) { .filter-drawer { border-bottom: 1px solid #f0f0f1; From fe241a9a05d87fc9993c0ec454b5ecb1a2ba7350 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sat, 25 Jan 2025 14:32:35 +0000 Subject: [PATCH 238/323] Coding Standards: Use strict comparison in `wp_xmlrpc_server::_insert_post()`. Follow-up to [19848]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59707 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-xmlrpc-server.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index 53fc23524936e..695727b680dc9 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -1488,7 +1488,7 @@ protected function _insert_post( $user, $content_struct ) { } $post_data['post_author'] = absint( $post_data['post_author'] ); - if ( ! empty( $post_data['post_author'] ) && $post_data['post_author'] != $user->ID ) { + if ( ! empty( $post_data['post_author'] ) && $post_data['post_author'] !== $user->ID ) { if ( ! current_user_can( $post_type->cap->edit_others_posts ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to create posts as this user.' ) ); } From 4dc9e8012a9b54ba42eef8f908807f6b31621ea5 Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Sat, 25 Jan 2025 17:09:32 +0000 Subject: [PATCH 239/323] Themes: Improve theme count behavior in the Add Themes screen. This changeset fixes an UI issue where the theme count in the "Add Themes" screen touches the top border on small screens. Props sukhendu2002, diliphingarajiya, dilipbheda, ankitkumarshah, dhruvang21, im3dabasia1. Fixes #62499. git-svn-id: https://develop.svn.wordpress.org/trunk@59708 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/css/themes.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/wp-admin/css/themes.css b/src/wp-admin/css/themes.css index 2d81613dbce47..955d2b69ea6fa 100644 --- a/src/wp-admin/css/themes.css +++ b/src/wp-admin/css/themes.css @@ -915,6 +915,10 @@ body.folded .theme-browser ~ .theme-overlay .theme-wrap { padding-left: 4%; padding-right: 4%; } + + .theme-install-php .wp-filter .filter-count { + margin-top: 10px; + } } @media only screen and (max-width: 650px) { From de504a63c06514416ac36d7db6f3a3332be5f99e Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Sat, 25 Jan 2025 23:49:17 +0000 Subject: [PATCH 240/323] Administration: Use a lighter `font-weight` value for settings labels. This changeset lowers the font-weight value from `600` to `400` for labels located in the Settings screens. This is an initial implementation of the WordPress design system, aligning with the broader goal of achieving a more consistent and unified design across the administration. Props karmatosed, audrasjb. Fixes #62865. git-svn-id: https://develop.svn.wordpress.org/trunk@59709 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/css/forms.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-admin/css/forms.css b/src/wp-admin/css/forms.css index ffe2c1711e7a1..45214f362ce3e 100644 --- a/src/wp-admin/css/forms.css +++ b/src/wp-admin/css/forms.css @@ -859,7 +859,7 @@ ul#add-to-blog-users { padding: 20px 10px 20px 0; width: 200px; line-height: 1.3; - font-weight: 600; + font-weight: 400; } .form-table th.th-full, /* Not used by core. Back-compat for pre-4.8 */ From e41f4f9aa9ca4a99a0b8df82ec019ede2bff20cc Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sun, 26 Jan 2025 18:51:35 +0000 Subject: [PATCH 241/323] Coding Standards: Use strict comparison in `wp_xmlrpc_server::_prepare_comment()`. Follow-up to [20856]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59710 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-xmlrpc-server.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index 695727b680dc9..9da0e1f9a1731 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -1179,11 +1179,11 @@ protected function _prepare_comment( $comment ) { // Format page date. $comment_date_gmt = $this->_convert_date_gmt( $comment->comment_date_gmt, $comment->comment_date ); - if ( '0' == $comment->comment_approved ) { + if ( '0' === $comment->comment_approved ) { $comment_status = 'hold'; } elseif ( 'spam' === $comment->comment_approved ) { $comment_status = 'spam'; - } elseif ( '1' == $comment->comment_approved ) { + } elseif ( '1' === $comment->comment_approved ) { $comment_status = 'approve'; } else { $comment_status = $comment->comment_approved; From 482d3e138db3e4b73eb57970c9e89c8907e21122 Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Sun, 26 Jan 2025 22:20:20 +0000 Subject: [PATCH 242/323] General: Get rid of `title` attributes used by `get_calendar()`. This changeset replaces `title` attributes with `aria-label` for weekdays in `get_calendar()` table cells. Props sabernhardt, audrasjb, mukesh27, shailu25. Fixes #62860. See #24766. git-svn-id: https://develop.svn.wordpress.org/trunk@59711 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/general-template.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/general-template.php b/src/wp-includes/general-template.php index f97071b7835a3..f0fa490ca90c2 100644 --- a/src/wp-includes/general-template.php +++ b/src/wp-includes/general-template.php @@ -2346,7 +2346,7 @@ function get_calendar( $initial = true, $display = true ) { foreach ( $myweek as $wd ) { $day_name = $initial ? $wp_locale->get_weekday_initial( $wd ) : $wp_locale->get_weekday_abbrev( $wd ); $wd = esc_attr( $wd ); - $calendar_output .= "\n\t\t<th scope=\"col\" title=\"$wd\">$day_name</th>"; + $calendar_output .= "\n\t\t<th scope=\"col\" aria-label=\"$wd\">$day_name</th>"; } $calendar_output .= ' From 1b57f98088f6fbd97666f7f191bef401522c0a4c Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Mon, 27 Jan 2025 14:39:18 +0000 Subject: [PATCH 243/323] Security: Enable the referrer policy header on the login screen. This sets the same referrer policy of `strict-origin-when-cross-origin` that's used in the admin area to prevent a referrer being sent to other origins. This helps prevent unwanted exposure of potentially sensitive information that may be contained within the URL. The header can be disabled if necessary by removing the `wp_admin_headers` action from the `login_init` hook. Props kkmuffme, sagarlakhani, albatross10 Fixes #62273 See #42036 git-svn-id: https://develop.svn.wordpress.org/trunk@59712 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/admin-filters.php | 1 - src/wp-admin/includes/misc.php | 23 ----------------------- src/wp-includes/default-filters.php | 1 + src/wp-includes/functions.php | 24 ++++++++++++++++++++++++ 4 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/wp-admin/includes/admin-filters.php b/src/wp-admin/includes/admin-filters.php index 587fbc25e9e3c..6776f5898ad58 100644 --- a/src/wp-admin/includes/admin-filters.php +++ b/src/wp-admin/includes/admin-filters.php @@ -44,7 +44,6 @@ // Misc hooks. add_action( 'admin_init', 'wp_admin_headers' ); -add_action( 'login_init', 'wp_admin_headers' ); add_action( 'admin_init', 'send_frame_options_header', 10, 0 ); add_action( 'admin_head', 'wp_admin_canonical_url' ); add_action( 'admin_head', 'wp_site_icon' ); diff --git a/src/wp-admin/includes/misc.php b/src/wp-admin/includes/misc.php index 5ce34cf18d781..afa36a2f2b51a 100644 --- a/src/wp-admin/includes/misc.php +++ b/src/wp-admin/includes/misc.php @@ -1415,29 +1415,6 @@ function wp_admin_canonical_url() { <?php } -/** - * Sends a referrer policy header so referrers are not sent externally from administration screens. - * - * @since 4.9.0 - */ -function wp_admin_headers() { - $policy = 'strict-origin-when-cross-origin'; - - /** - * Filters the admin referrer policy header value. - * - * @since 4.9.0 - * @since 4.9.5 The default value was changed to 'strict-origin-when-cross-origin'. - * - * @link https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy - * - * @param string $policy The admin referrer policy header value. Default 'strict-origin-when-cross-origin'. - */ - $policy = apply_filters( 'admin_referrer_policy', $policy ); - - header( sprintf( 'Referrer-Policy: %s', $policy ) ); -} - /** * Outputs JS that reloads the page if the user navigated to it with the Back or Forward button. * diff --git a/src/wp-includes/default-filters.php b/src/wp-includes/default-filters.php index 0468797ee236c..54883b840d7f4 100644 --- a/src/wp-includes/default-filters.php +++ b/src/wp-includes/default-filters.php @@ -389,6 +389,7 @@ add_action( 'login_head', 'wp_site_icon', 99 ); add_action( 'login_footer', 'wp_print_footer_scripts', 20 ); add_action( 'login_init', 'send_frame_options_header', 10, 0 ); +add_action( 'login_init', 'wp_admin_headers' ); // Feed generator tags. foreach ( array( 'rss2_head', 'commentsrss2_head', 'rss_head', 'rdf_header', 'atom_head', 'comments_atom_head', 'opml_head', 'app_head' ) as $action ) { diff --git a/src/wp-includes/functions.php b/src/wp-includes/functions.php index 6e1d97677d03c..f46de3a2821ba 100644 --- a/src/wp-includes/functions.php +++ b/src/wp-includes/functions.php @@ -7144,6 +7144,30 @@ function send_frame_options_header() { header( 'X-Frame-Options: SAMEORIGIN' ); } +/** + * Sends a referrer policy header so referrers are not sent externally from administration screens. + * + * @since 4.9.0 + * @since 6.8.0 This function was moved from `wp-admin/includes/misc.php` to `wp-includes/functions.php`. + */ +function wp_admin_headers() { + $policy = 'strict-origin-when-cross-origin'; + + /** + * Filters the admin referrer policy header value. + * + * @since 4.9.0 + * @since 4.9.5 The default value was changed to 'strict-origin-when-cross-origin'. + * + * @link https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy + * + * @param string $policy The admin referrer policy header value. Default 'strict-origin-when-cross-origin'. + */ + $policy = apply_filters( 'admin_referrer_policy', $policy ); + + header( sprintf( 'Referrer-Policy: %s', $policy ) ); +} + /** * Retrieves a list of protocols to allow in HTML attributes. * From 557fe1da6916981d16d89129beeafa7f4c7d0925 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Mon, 27 Jan 2025 15:43:57 +0000 Subject: [PATCH 244/323] Coding Standards: Use strict comparison in `wp_xmlrpc_server::mw_newPost()`. Follow-up to [5281]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59713 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-xmlrpc-server.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index 9da0e1f9a1731..2a1815e5aa15d 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -5457,8 +5457,8 @@ public function mw_newPost( $args ) { $post_author = $user->ID; - // If an author id was provided then use it instead. - if ( isset( $content_struct['wp_author_id'] ) && ( $user->ID != $content_struct['wp_author_id'] ) ) { + // If an author ID was provided then use it instead. + if ( isset( $content_struct['wp_author_id'] ) && ( $user->ID !== (int) $content_struct['wp_author_id'] ) ) { switch ( $post_type ) { case 'post': if ( ! current_user_can( 'edit_others_posts' ) ) { From ed8cb2a5bfde3f9eae8a07a651c47e462f47946c Mon Sep 17 00:00:00 2001 From: Joe Dolson <joedolson@git.wordpress.org> Date: Mon, 27 Jan 2025 19:23:45 +0000 Subject: [PATCH 245/323] Administration: Fix typo in code documentation in `wp/sanitize.js`. Change "Text to have the HTML tags striped out of." to "Text to strip the HTML tags from." Replaces an unclear statement with a typo with a more clear statement. Props joedolson, mukesh27, dhruvang21. Fixes #62851. git-svn-id: https://develop.svn.wordpress.org/trunk@59714 602fd350-edb4-49c9-b593-d223f7449a82 --- src/js/_enqueues/wp/sanitize.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/_enqueues/wp/sanitize.js b/src/js/_enqueues/wp/sanitize.js index 6082b1912dd74..13f9045024f74 100644 --- a/src/js/_enqueues/wp/sanitize.js +++ b/src/js/_enqueues/wp/sanitize.js @@ -16,7 +16,7 @@ /** * Strip HTML tags. * - * @param {string} text Text to have the HTML tags striped out of. + * @param {string} text Text to strip the HTML tags from. * * @return Stripped text. */ From 7091fcd2f4e2eb285551bae10ae6a015818fb4f4 Mon Sep 17 00:00:00 2001 From: Jonny Harris <spacedmonkey@git.wordpress.org> Date: Mon, 27 Jan 2025 23:05:21 +0000 Subject: [PATCH 246/323] Revisions: Use WP_Query in wp_get_post_autosave. Replaced the raw SQL query in the `wp_get_post_autosave` function with a `WP_Query` call. This change improves code maintainability and replaces the raw SQL query with a cacheable query via `WP_Query`. Props narenin, swissspidy, mukesh27, spacedmonkey, im3dabasia1. Fixes #62658. git-svn-id: https://develop.svn.wordpress.org/trunk@59715 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/revision.php | 44 +++--- tests/phpunit/tests/post/wpGetAutoSave.php | 165 +++++++++++++++++++++ 2 files changed, 183 insertions(+), 26 deletions(-) create mode 100644 tests/phpunit/tests/post/wpGetAutoSave.php diff --git a/src/wp-includes/revision.php b/src/wp-includes/revision.php index 2747ea92673d8..a2267fcbf8f60 100644 --- a/src/wp-includes/revision.php +++ b/src/wp-includes/revision.php @@ -270,42 +270,34 @@ function wp_save_post_revision( $post_id ) { * * @since 2.6.0 * - * @global wpdb $wpdb WordPress database abstraction object. - * * @param int $post_id The post ID. * @param int $user_id Optional. The post author ID. Default 0. * @return WP_Post|false The autosaved data or false on failure or when no autosave exists. */ function wp_get_post_autosave( $post_id, $user_id = 0 ) { - global $wpdb; - - $autosave_name = $post_id . '-autosave-v1'; - $user_id_query = ( 0 !== $user_id ) ? "AND post_author = $user_id" : null; - - // Construct the autosave query. - $autosave_query = " - SELECT * - FROM $wpdb->posts - WHERE post_parent = %d - AND post_type = 'revision' - AND post_status = 'inherit' - AND post_name = %s " . $user_id_query . ' - ORDER BY post_date DESC - LIMIT 1'; - - $autosave = $wpdb->get_results( - $wpdb->prepare( - $autosave_query, - $post_id, - $autosave_name - ) + $args = array( + 'post_type' => 'revision', + 'post_status' => 'inherit', + 'post_parent' => $post_id, + 'name' => $post_id . '-autosave-v1', + 'posts_per_page' => 1, + 'orderby' => 'date', + 'order' => 'DESC', + 'fields' => 'ids', + 'no_found_rows' => true, ); - if ( ! $autosave ) { + if ( 0 !== $user_id ) { + $args['author'] = $user_id; + } + + $query = new WP_Query( $args ); + + if ( ! $query->have_posts() ) { return false; } - return get_post( $autosave[0] ); + return get_post( $query->posts[0] ); } /** diff --git a/tests/phpunit/tests/post/wpGetAutoSave.php b/tests/phpunit/tests/post/wpGetAutoSave.php new file mode 100644 index 0000000000000..db27d25fad58d --- /dev/null +++ b/tests/phpunit/tests/post/wpGetAutoSave.php @@ -0,0 +1,165 @@ +<?php + +/** + * @group post + */ +class Tests_Post_wpGetPostAutosave extends WP_UnitTestCase { + + /** + * Admin user ID. + * + * @var int + */ + protected static $admin_id; + + /** + * Editor user ID. + * + * @var int + */ + protected static $editor_id; + + /** + * Post ID. + * + * @var int + */ + protected static $post_id; + + /** + * Set up before class. + * + * @param WP_UnitTest_Factory $factory Factory. + */ + public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) { + self::$admin_id = $factory->user->create( array( 'role' => 'administrator' ) ); + self::$editor_id = $factory->user->create( array( 'role' => 'editor' ) ); + + wp_set_current_user( self::$admin_id ); + self::$post_id = $factory->post->create( array( 'post_status' => 'publish' ) ); + } + + /** + * Test when no autosave exists for a post. + * + * @ticket 62658 + */ + public function test_no_autosave_exists() { + $autosave = wp_get_post_autosave( self::$post_id ); + $this->assertFalse( $autosave, 'Expected no autosave.' ); + } + + /** + * Test when an autosave exists for a post. + * + * @ticket 62658 + */ + public function test_autosave_exists() { + $autosave_id = $this->factory()->post->create( + array( + 'post_type' => 'revision', + 'post_status' => 'inherit', + 'post_parent' => self::$post_id, + 'post_author' => self::$admin_id, + 'post_content' => 'Autosaved content', + 'post_name' => self::$post_id . '-autosave-v1', + ) + ); + + $autosave = wp_get_post_autosave( self::$post_id ); + + $this->assertInstanceOf( 'WP_Post', $autosave ); + $this->assertSame( $autosave_id, $autosave->ID, 'Autosave ID does not match.' ); + $this->assertSame( self::$post_id, (int) $autosave->post_parent, 'Post parent ID does not match.' ); + } + + /** + * Test when an autosave exists for a specific user. + * + * @ticket 62658 + */ + public function test_autosave_for_specific_user() { + $autosave_id = $this->factory()->post->create( + array( + 'post_type' => 'revision', + 'post_status' => 'inherit', + 'post_parent' => self::$post_id, + 'post_author' => self::$editor_id, + 'post_content' => 'Editor-specific autosave', + 'post_name' => self::$post_id . '-autosave-v1', + ) + ); + + $autosave = wp_get_post_autosave( self::$post_id, self::$editor_id ); + + $this->assertInstanceOf( 'WP_Post', $autosave ); + $this->assertSame( self::$editor_id, (int) $autosave->post_author, 'Post author does not match.' ); + $this->assertSame( $autosave_id, $autosave->ID, 'Autosave ID does not match.' ); + } + + /** + * Test when an autosave is updated. + * + * @ticket 62658 + */ + public function test_autosave_exists_update_caches() { + $autosave_id = $this->factory()->post->create( + array( + 'post_type' => 'revision', + 'post_status' => 'inherit', + 'post_parent' => self::$post_id, + 'post_author' => self::$admin_id, + 'post_content' => 'Autosaved content', + 'post_name' => self::$post_id . '-autosave-v1', + ) + ); + + $autosave = wp_get_post_autosave( self::$post_id ); + + $this->assertInstanceOf( 'WP_Post', $autosave ); + $this->assertSame( $autosave_id, $autosave->ID, 'Autosave ID does not match.' ); + $this->assertSame( self::$post_id, (int) $autosave->post_parent, 'Post parent ID does not match.' ); + $this->assertSame( 'Autosaved content', $autosave->post_content, 'Post content does not match.' ); + + wp_update_post( + array( + 'ID' => $autosave->ID, + 'post_content' => 'Autosaved content updated', + ) + ); + + $autosave = wp_get_post_autosave( self::$post_id ); + $this->assertInstanceOf( 'WP_Post', $autosave ); + $this->assertSame( 'Autosaved content updated', $autosave->post_content, 'Post content does not match.' ); + } + + /** + * Test when an autosave is deleted + * + * @ticket 62658 + */ + public function test_autosave_exists_and_deleted() { + $autosave_id = $this->factory()->post->create( + array( + 'post_type' => 'revision', + 'post_status' => 'inherit', + 'post_parent' => self::$post_id, + 'post_author' => self::$admin_id, + 'post_content' => 'Autosaved content', + 'post_name' => self::$post_id . '-autosave-v1', + ) + ); + + $autosave = wp_get_post_autosave( self::$post_id ); + + $this->assertInstanceOf( 'WP_Post', $autosave ); + $this->assertSame( $autosave_id, $autosave->ID, 'Autosave ID does not match.' ); + $this->assertSame( self::$post_id, (int) $autosave->post_parent, 'Post parent ID does not match.' ); + $this->assertSame( 'Autosaved content', $autosave->post_content, 'Post content does not match.' ); + + wp_delete_post( $autosave->ID, true ); + + $autosave = wp_get_post_autosave( self::$post_id ); + $this->assertFalse( $autosave, 'Autosave should not exist' ); + } +} From dd597b09150a0a227a6893da8126ba68e47dc4d8 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Tue, 28 Jan 2025 00:43:28 +0000 Subject: [PATCH 247/323] Build/Test Tools: Update 3rd-party GitHub Actions. This updates the following GitHub Actions to their latest versions: - `actions/cache` - `actions/checkout` - `actions/setup-node` - `actions/upload-artifact` - `codecov/codecov-action` - `shivammathur/setup-php` See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59716 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/install-testing.yml | 2 +- .../reusable-coding-standards-javascript.yml | 4 ++-- .github/workflows/reusable-coding-standards-php.yml | 6 +++--- .github/workflows/reusable-end-to-end-tests.yml | 6 +++--- .github/workflows/reusable-javascript-tests.yml | 4 ++-- .github/workflows/reusable-performance.yml | 6 +++--- .github/workflows/reusable-php-compatibility.yml | 6 +++--- .github/workflows/reusable-phpunit-tests-v1.yml | 6 +++--- .github/workflows/reusable-phpunit-tests-v2.yml | 6 +++--- .github/workflows/reusable-phpunit-tests-v3.yml | 12 ++++++------ .../workflows/reusable-test-core-build-process.yml | 8 ++++---- .../reusable-test-gutenberg-build-process.yml | 6 +++--- .../reusable-test-local-docker-environment-v1.yml | 6 +++--- .github/workflows/reusable-upgrade-testing.yml | 2 +- .github/workflows/test-and-zip-default-themes.yml | 10 +++++----- 15 files changed, 45 insertions(+), 45 deletions(-) diff --git a/.github/workflows/install-testing.yml b/.github/workflows/install-testing.yml index 5fe90fddbb50f..e4d91eccd26b7 100644 --- a/.github/workflows/install-testing.yml +++ b/.github/workflows/install-testing.yml @@ -115,7 +115,7 @@ jobs: steps: - name: Set up PHP ${{ matrix.php }} - uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1 + uses: shivammathur/setup-php@9e72090525849c5e82e596468b86eb55e9cc5401 # v2.32.0 with: php-version: '${{ matrix.php }}' coverage: none diff --git a/.github/workflows/reusable-coding-standards-javascript.yml b/.github/workflows/reusable-coding-standards-javascript.yml index 23c0be570bac7..5e77e8cf3e10f 100644 --- a/.github/workflows/reusable-coding-standards-javascript.yml +++ b/.github/workflows/reusable-coding-standards-javascript.yml @@ -34,13 +34,13 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} persist-credentials: false - name: Set up Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version-file: '.nvmrc' cache: npm diff --git a/.github/workflows/reusable-coding-standards-php.yml b/.github/workflows/reusable-coding-standards-php.yml index 28c09a42d1121..82973f1515b4f 100644 --- a/.github/workflows/reusable-coding-standards-php.yml +++ b/.github/workflows/reusable-coding-standards-php.yml @@ -46,13 +46,13 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} persist-credentials: false - name: Set up PHP - uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1 + uses: shivammathur/setup-php@9e72090525849c5e82e596468b86eb55e9cc5401 # v2.32.0 with: php-version: ${{ inputs.php-version }} coverage: none @@ -65,7 +65,7 @@ jobs: run: echo "date=$(/bin/date -u --date='last Mon' "+%F")" >> "$GITHUB_OUTPUT" - name: Cache PHPCS scan cache - uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 + uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 with: path: | .cache/phpcs-src.json diff --git a/.github/workflows/reusable-end-to-end-tests.yml b/.github/workflows/reusable-end-to-end-tests.yml index 38c8e93af7202..790f120aa8b81 100644 --- a/.github/workflows/reusable-end-to-end-tests.yml +++ b/.github/workflows/reusable-end-to-end-tests.yml @@ -71,13 +71,13 @@ jobs: echo "PHP_FPM_GID=$(id -g)" >> "$GITHUB_ENV" - name: Checkout repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} persist-credentials: false - name: Set up Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version-file: '.nvmrc' cache: npm @@ -139,7 +139,7 @@ jobs: run: npm run test:e2e - name: Archive debug artifacts (screenshots, HTML snapshots) - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 if: always() with: name: failures-artifacts${{ inputs.LOCAL_SCRIPT_DEBUG && '-SCRIPT_DEBUG' || '' }}-${{ github.run_id }} diff --git a/.github/workflows/reusable-javascript-tests.yml b/.github/workflows/reusable-javascript-tests.yml index 944833d8ff550..b3a63f65e32fd 100644 --- a/.github/workflows/reusable-javascript-tests.yml +++ b/.github/workflows/reusable-javascript-tests.yml @@ -35,13 +35,13 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} persist-credentials: false - name: Set up Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version-file: '.nvmrc' cache: npm diff --git a/.github/workflows/reusable-performance.yml b/.github/workflows/reusable-performance.yml index e467d9ce850fe..56fb0e95eba73 100644 --- a/.github/workflows/reusable-performance.yml +++ b/.github/workflows/reusable-performance.yml @@ -127,7 +127,7 @@ jobs: echo "PHP_FPM_GID=$(id -g)" >> "$GITHUB_ENV" - name: Checkout repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} fetch-depth: ${{ github.event_name == 'workflow_dispatch' && '2' || '1' }} @@ -139,7 +139,7 @@ jobs: run: echo "TARGET_SHA=$(git rev-parse HEAD^1)" >> "$GITHUB_ENV" - name: Set up Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version-file: '.nvmrc' cache: npm @@ -312,7 +312,7 @@ jobs: run: npm run test:performance - name: Archive artifacts - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 if: always() with: name: performance-artifacts${{ inputs.multisite && '-multisite' || '' }}${{ inputs.memcached && '-memcached' || '' }}-${{ github.run_id }} diff --git a/.github/workflows/reusable-php-compatibility.yml b/.github/workflows/reusable-php-compatibility.yml index f07e68cf5e32c..74c39999f12ac 100644 --- a/.github/workflows/reusable-php-compatibility.yml +++ b/.github/workflows/reusable-php-compatibility.yml @@ -40,13 +40,13 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} persist-credentials: false - name: Set up PHP - uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1 + uses: shivammathur/setup-php@9e72090525849c5e82e596468b86eb55e9cc5401 # v2.32.0 with: php-version: ${{ inputs.php-version }} coverage: none @@ -63,7 +63,7 @@ jobs: run: echo "date=$(/bin/date -u --date='last Mon' "+%F")" >> "$GITHUB_OUTPUT" - name: Cache PHP compatibility scan cache - uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 + uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 with: path: .cache/phpcompat.json key: ${{ runner.os }}-date-${{ steps.get-date.outputs.date }}-php-${{ inputs.php-version }}-phpcompat-cache-${{ hashFiles('**/composer.json', 'phpcompat.xml.dist') }} diff --git a/.github/workflows/reusable-phpunit-tests-v1.yml b/.github/workflows/reusable-phpunit-tests-v1.yml index 1b08f69c15069..4da2b3bb99bff 100644 --- a/.github/workflows/reusable-phpunit-tests-v1.yml +++ b/.github/workflows/reusable-phpunit-tests-v1.yml @@ -95,13 +95,13 @@ jobs: echo "PHP_FPM_GID=$(id -g)" >> "$GITHUB_ENV" - name: Checkout repository - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} persist-credentials: false - name: Set up Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version-file: '.nvmrc' cache: npm @@ -119,7 +119,7 @@ jobs: - name: Cache Composer dependencies if: ${{ env.COMPOSER_INSTALL == true }} - uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 + uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 env: cache-name: cache-composer-dependencies with: diff --git a/.github/workflows/reusable-phpunit-tests-v2.yml b/.github/workflows/reusable-phpunit-tests-v2.yml index eea607c3f45b8..d5df2f0bf18ef 100644 --- a/.github/workflows/reusable-phpunit-tests-v2.yml +++ b/.github/workflows/reusable-phpunit-tests-v2.yml @@ -97,13 +97,13 @@ jobs: echo "PHP_FPM_GID=$(id -g)" >> "$GITHUB_ENV" - name: Checkout repository - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} persist-credentials: false - name: Install Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version-file: '.nvmrc' cache: npm @@ -116,7 +116,7 @@ jobs: run: echo "composer_dir=$(composer config cache-files-dir)" >> "$GITHUB_OUTPUT" - name: Cache Composer dependencies - uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 + uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 env: cache-name: cache-composer-dependencies with: diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index d889eacb26eb2..fb508e47d9350 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -129,13 +129,13 @@ jobs: echo "PHP_FPM_GID=$(id -g)" >> "$GITHUB_ENV" - name: Checkout repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} persist-credentials: false - name: Set up Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version-file: '.nvmrc' cache: npm @@ -148,7 +148,7 @@ jobs: # dependency versions are installed and cached. ## - name: Set up PHP - uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1 + uses: shivammathur/setup-php@9e72090525849c5e82e596468b86eb55e9cc5401 # v2.32.0 with: php-version: '${{ inputs.php }}' coverage: none @@ -232,7 +232,7 @@ jobs: - name: Upload test coverage report to Codecov if: ${{ inputs.coverage-report }} - uses: codecov/codecov-action@7f8b4b4bde536c465e797be725718b88c5d95e0e # v5.1.1 + uses: codecov/codecov-action@13ce06bfc6bbe3ecf90edbbf1bc32fe5978ca1d3 # v5.3.1 with: token: ${{ secrets.CODECOV_TOKEN }} file: wp-code-coverage${{ inputs.multisite && '-multisite' || '-single' }}-${{ github.sha }}.xml @@ -241,7 +241,7 @@ jobs: - name: Upload HTML coverage report as artifact if: ${{ inputs.coverage-report }} - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: wp-code-coverage${{ inputs.multisite && '-multisite' || '-single' }}-${{ github.sha }} path: wp-code-coverage${{ inputs.multisite && '-multisite' || '-single' }}-${{ github.sha }} @@ -252,7 +252,7 @@ jobs: - name: Checkout the WordPress Test Reporter if: ${{ github.ref == 'refs/heads/trunk' && inputs.report }} - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: repository: 'WordPress/phpunit-test-runner' path: 'test-runner' diff --git a/.github/workflows/reusable-test-core-build-process.yml b/.github/workflows/reusable-test-core-build-process.yml index eb5dc34c715f8..4f119b5f1eef1 100644 --- a/.github/workflows/reusable-test-core-build-process.yml +++ b/.github/workflows/reusable-test-core-build-process.yml @@ -64,13 +64,13 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} persist-credentials: false - name: Set up Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version-file: '.nvmrc' cache: npm @@ -108,7 +108,7 @@ jobs: run: git diff --exit-code - name: Upload ZIP as a GitHub Actions artifact - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 if: ${{ inputs.save-build || inputs.prepare-playground }} with: name: wordpress-build-${{ github.event_name == 'pull_request' && github.event.number || github.sha }} @@ -126,7 +126,7 @@ jobs: # Uploads the PR number as an artifact for the Pull Request Commenting workflow to download and then # leave a comment detailing how to test the PR within WordPress Playground. - name: Upload PR number as artifact - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 if: ${{ inputs.prepare-playground && github.repository == 'WordPress/wordpress-develop' && github.event_name == 'pull_request' }} with: name: pr-number diff --git a/.github/workflows/reusable-test-gutenberg-build-process.yml b/.github/workflows/reusable-test-gutenberg-build-process.yml index 32e91af42fd20..f7371d2c3750e 100644 --- a/.github/workflows/reusable-test-gutenberg-build-process.yml +++ b/.github/workflows/reusable-test-gutenberg-build-process.yml @@ -49,13 +49,13 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} persist-credentials: false - name: Checkout Gutenberg plugin - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: repository: 'WordPress/gutenberg' path: ${{ env.GUTENBERG_DIRECTORY }} @@ -63,7 +63,7 @@ jobs: persist-credentials: false - name: Set up Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version-file: '.nvmrc' cache: npm diff --git a/.github/workflows/reusable-test-local-docker-environment-v1.yml b/.github/workflows/reusable-test-local-docker-environment-v1.yml index 98fb645533d59..3d3b47c2240b5 100644 --- a/.github/workflows/reusable-test-local-docker-environment-v1.yml +++ b/.github/workflows/reusable-test-local-docker-environment-v1.yml @@ -86,13 +86,13 @@ jobs: echo "PHP_FPM_GID=$(id -g)" >> "$GITHUB_ENV" - name: Checkout repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} persist-credentials: false - name: Set up Node.js - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version-file: '.nvmrc' cache: npm @@ -105,7 +105,7 @@ jobs: # dependency versions are installed and cached. ## - name: Set up PHP - uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1 + uses: shivammathur/setup-php@9e72090525849c5e82e596468b86eb55e9cc5401 # v2.32.0 with: php-version: '${{ inputs.php }}' coverage: none diff --git a/.github/workflows/reusable-upgrade-testing.yml b/.github/workflows/reusable-upgrade-testing.yml index ca071a3db3f5c..544c1ad38ecad 100644 --- a/.github/workflows/reusable-upgrade-testing.yml +++ b/.github/workflows/reusable-upgrade-testing.yml @@ -74,7 +74,7 @@ jobs: steps: - name: Set up PHP ${{ inputs.php }} - uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1 + uses: shivammathur/setup-php@9e72090525849c5e82e596468b86eb55e9cc5401 # v2.32.0 with: php-version: '${{ inputs.php }}' coverage: none diff --git a/.github/workflows/test-and-zip-default-themes.yml b/.github/workflows/test-and-zip-default-themes.yml index 1eeac859f0d80..3c6f28fe304fb 100644 --- a/.github/workflows/test-and-zip-default-themes.yml +++ b/.github/workflows/test-and-zip-default-themes.yml @@ -87,7 +87,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ github.event_name == 'workflow_dispatch' && inputs.branch || github.ref }} show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} @@ -129,14 +129,14 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ github.event_name == 'workflow_dispatch' && inputs.branch || github.ref }} show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} persist-credentials: false - name: Set up Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version-file: '.nvmrc' cache: npm @@ -187,14 +187,14 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ github.event_name == 'workflow_dispatch' && inputs.branch || github.ref }} show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} persist-credentials: false - name: Upload theme ZIP as an artifact - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: ${{ matrix.theme }} path: src/wp-content/themes/${{ matrix.theme }} From 05e923cda8a4893617b1cef7cded5563f63bba23 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Tue, 28 Jan 2025 03:48:40 +0000 Subject: [PATCH 248/323] Build/Test Tools: Correct input name for Code Coverage reports. The input for providing files to the `codecov/codecov-action` was changed from `file` to `files` in version `5.0.0`. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59717 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-phpunit-tests-v3.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index fb508e47d9350..c5cb24f3016ba 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -235,7 +235,7 @@ jobs: uses: codecov/codecov-action@13ce06bfc6bbe3ecf90edbbf1bc32fe5978ca1d3 # v5.3.1 with: token: ${{ secrets.CODECOV_TOKEN }} - file: wp-code-coverage${{ inputs.multisite && '-multisite' || '-single' }}-${{ github.sha }}.xml + files: wp-code-coverage${{ inputs.multisite && '-multisite' || '-single' }}-${{ github.sha }}.xml flags: ${{ inputs.multisite && 'multisite' || 'single' }},php fail_ci_if_error: true From 7623fc1c051e63ae18e81a5ba1894e9398d71184 Mon Sep 17 00:00:00 2001 From: Jonny Harris <spacedmonkey@git.wordpress.org> Date: Tue, 28 Jan 2025 04:07:07 +0000 Subject: [PATCH 249/323] REST API: Introduce filter for controlling menu read access. The menu, menu item, and menu location endpoints were added to the REST API in [52079]. In that commit, menu data was treated as private and restricted to logged-in users with the edit_theme_options capability. However, in many cases, this data can be considered public. Previously, there was no simple way for developers to allow this data to be exposed via the REST API. This commit introduces the rest_menu_read_access filter, enabling developers to control read access to menus, menu items, and menu locations in the REST API. The same filter is applied across all three REST API classes, simplifying the process of opting into exposing this data. Each instance of the filter provides the current request and the relevant class instance as context, allowing developers to selectively or globally enable access to the data. Props spacedmonkey, antonvlasenko, kadamwhite, julianmar, masteradhoc. Fixes #54304. git-svn-id: https://develop.svn.wordpress.org/trunk@59718 602fd350-edb4-49c9-b593-d223f7449a82 --- .../class-wp-rest-menu-items-controller.php | 13 ++++++ ...lass-wp-rest-menu-locations-controller.php | 46 +++++++++++-------- .../class-wp-rest-menus-controller.php | 6 +++ .../rest-api/wpRestMenuItemsController.php | 24 ++++++++++ .../wpRestMenuLocationsController.php | 39 ++++++++++++++++ .../tests/rest-api/wpRestMenusController.php | 42 +++++++++++++++++ 6 files changed, 152 insertions(+), 18 deletions(-) diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php index ee69643813577..08d21fd090bc2 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php @@ -80,6 +80,19 @@ public function get_item_permissions_check( $request ) { * @return true|WP_Error True if the request has read access for the item, WP_Error object otherwise. */ protected function check_has_read_only_access( $request ) { + /** + * Filters whether the current user has read access to menu items via the REST API. + * + * @since 6.8.0 + * @param $read_only_access bool Whether the current user has read access to menu items via the REST API. + * @param $request WP_REST_Request Full details about the request. + * @param $this WP_REST_Controller The current instance of the controller. + */ + $read_only_access = apply_filters( 'rest_menu_read_access', false, $request, $this ); + if ( $read_only_access ) { + return true; + } + if ( current_user_can( 'edit_theme_options' ) ) { return true; } diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-menu-locations-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-menu-locations-controller.php index e5bff633a2a87..b0ccd60fc365a 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-menu-locations-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-menu-locations-controller.php @@ -80,15 +80,7 @@ public function register_routes() { * @return true|WP_Error True if the request has read access, WP_Error object otherwise. */ public function get_items_permissions_check( $request ) { - if ( ! current_user_can( 'edit_theme_options' ) ) { - return new WP_Error( - 'rest_cannot_view', - __( 'Sorry, you are not allowed to view menu locations.' ), - array( 'status' => rest_authorization_required_code() ) - ); - } - - return true; + return $this->check_has_read_only_access( $request ); } /** @@ -123,15 +115,7 @@ public function get_items( $request ) { * @return true|WP_Error True if the request has read access for the item, WP_Error object otherwise. */ public function get_item_permissions_check( $request ) { - if ( ! current_user_can( 'edit_theme_options' ) ) { - return new WP_Error( - 'rest_cannot_view', - __( 'Sorry, you are not allowed to view menu locations.' ), - array( 'status' => rest_authorization_required_code() ) - ); - } - - return true; + return $this->check_has_read_only_access( $request ); } /** @@ -157,6 +141,32 @@ public function get_item( $request ) { return rest_ensure_response( $data ); } + /** + * Checks whether the current user has read permission for the endpoint. + * + * @since 6.8.0 + * + * @param WP_REST_Request $request Full details about the request. + * @return true|WP_Error True if the current user has permission, WP_Error object otherwise. + */ + protected function check_has_read_only_access( $request ) { + /** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php */ + $read_only_access = apply_filters( 'rest_menu_read_access', false, $request, $this ); + if ( $read_only_access ) { + return true; + } + + if ( ! current_user_can( 'edit_theme_options' ) ) { + return new WP_Error( + 'rest_cannot_view', + __( 'Sorry, you are not allowed to view menu locations.' ), + array( 'status' => rest_authorization_required_code() ) + ); + } + + return true; + } + /** * Prepares a menu location object for serialization. * diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-menus-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-menus-controller.php index 3b8205f89dc92..3947bfd6107ce 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-menus-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-menus-controller.php @@ -84,6 +84,12 @@ protected function get_term( $id ) { * @return true|WP_Error True if the current user has permission, WP_Error object otherwise. */ protected function check_has_read_only_access( $request ) { + /** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php */ + $read_only_access = apply_filters( 'rest_menu_read_access', false, $request, $this ); + if ( $read_only_access ) { + return true; + } + if ( current_user_can( 'edit_theme_options' ) ) { return true; } diff --git a/tests/phpunit/tests/rest-api/wpRestMenuItemsController.php b/tests/phpunit/tests/rest-api/wpRestMenuItemsController.php index 5508123deac19..a5b76af3438d2 100644 --- a/tests/phpunit/tests/rest-api/wpRestMenuItemsController.php +++ b/tests/phpunit/tests/rest-api/wpRestMenuItemsController.php @@ -183,6 +183,30 @@ public function test_get_item() { $this->check_get_menu_item_response( $response, 'view' ); } + /** + * @ticket 54304 + * @covers ::get_items + */ + public function test_get_items_filter() { + add_filter( 'rest_menu_read_access', '__return_true' ); + $request = new WP_REST_Request( 'GET', '/wp/v2/menu-items' ); + $response = rest_get_server()->dispatch( $request ); + + $this->check_get_menu_items_response( $response ); + } + + /** + * @ticket 54304 + * @covers ::get_item + */ + public function test_get_item_filter() { + add_filter( 'rest_menu_read_access', '__return_true' ); + $request = new WP_REST_Request( 'GET', sprintf( '/wp/v2/menu-items/%d', $this->menu_item_id ) ); + $response = rest_get_server()->dispatch( $request ); + + $this->check_get_menu_item_response( $response, 'view' ); + } + /** * @ticket 40878 * @covers ::get_item diff --git a/tests/phpunit/tests/rest-api/wpRestMenuLocationsController.php b/tests/phpunit/tests/rest-api/wpRestMenuLocationsController.php index b324ce23c7fd6..1a0ffc4bb536b 100644 --- a/tests/phpunit/tests/rest-api/wpRestMenuLocationsController.php +++ b/tests/phpunit/tests/rest-api/wpRestMenuLocationsController.php @@ -120,6 +120,45 @@ public function test_get_item() { $this->assertSame( $menu, $data['name'] ); } + /** + * @ticket 54304 + * @covers ::get_items + */ + public function test_get_items_filter() { + $menus = array( 'primary', 'secondary' ); + $this->register_nav_menu_locations( array( 'primary', 'secondary' ) ); + add_filter( 'rest_menu_read_access', '__return_true' ); + + $request = new WP_REST_Request( 'GET', '/wp/v2/menu-locations' ); + $response = rest_get_server()->dispatch( $request ); + $data = $response->get_data(); + $data = array_values( $data ); + $this->assertCount( 2, $data, 'Number of menu location are not 2' ); + + $names = wp_list_pluck( $data, 'name' ); + $descriptions = wp_list_pluck( $data, 'description' ); + $this->assertSame( $menus, $names ); + $menu_descriptions = array_map( 'ucfirst', $names ); + + $this->assertSame( $menu_descriptions, $descriptions, 'Menu descriptions do not match' ); + } + + /** + * @ticket 54304 + * @covers ::get_item + */ + public function test_get_item_filter() { + $menu = 'primary'; + $this->register_nav_menu_locations( array( $menu ) ); + + add_filter( 'rest_menu_read_access', '__return_true' ); + $request = new WP_REST_Request( 'GET', '/wp/v2/menu-locations/' . $menu ); + $response = rest_get_server()->dispatch( $request ); + $data = $response->get_data(); + + $this->assertSame( $menu, $data['name'] ); + } + /** * @ticket 40878 * @covers ::get_item diff --git a/tests/phpunit/tests/rest-api/wpRestMenusController.php b/tests/phpunit/tests/rest-api/wpRestMenusController.php index 58780ca200880..864b09417d2cb 100644 --- a/tests/phpunit/tests/rest-api/wpRestMenusController.php +++ b/tests/phpunit/tests/rest-api/wpRestMenusController.php @@ -208,6 +208,48 @@ public function test_get_item() { $this->check_get_taxonomy_term_response( $response, $nav_menu_id ); } + + /** + * @ticket 54304 + * @covers ::get_items + */ + public function test_get_items_filter() { + add_filter( 'rest_menu_read_access', '__return_true' ); + wp_update_nav_menu_object( + 0, + array( + 'description' => 'Test get', + 'menu-name' => 'test Name get', + ) + ); + $request = new WP_REST_Request( 'GET', '/wp/v2/menus' ); + $request->set_param( 'per_page', self::$per_page ); + $response = rest_get_server()->dispatch( $request ); + $this->check_get_taxonomy_terms_response( $response ); + } + + /** + * @ticket 54304 + * @covers ::get_item + */ + public function test_get_item_filter() { + add_filter( 'rest_menu_read_access', '__return_true' ); + $nav_menu_id = wp_update_nav_menu_object( + 0, + array( + 'description' => 'Test menu', + 'menu-name' => 'test Name', + ) + ); + + $this->register_nav_menu_locations( array( 'primary' ) ); + set_theme_mod( 'nav_menu_locations', array( 'primary' => $nav_menu_id ) ); + + $request = new WP_REST_Request( 'GET', '/wp/v2/menus/' . $nav_menu_id ); + $response = rest_get_server()->dispatch( $request ); + $this->check_get_taxonomy_term_response( $response, $nav_menu_id ); + } + /** * @ticket 40878 * @covers ::create_item From 1af0e6cbcbca36d10a5738625330f22a85beeb34 Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Tue, 28 Jan 2025 09:44:57 +0000 Subject: [PATCH 250/323] Coding Standards: Add missing global variable in `determine_locale()` docblock. Props upadalavipul, mukesh27, dhruvang21. Fixes #62875. git-svn-id: https://develop.svn.wordpress.org/trunk@59719 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/l10n.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/l10n.php b/src/wp-includes/l10n.php index 1ed9a6a1a88c9..513039a83d7b5 100644 --- a/src/wp-includes/l10n.php +++ b/src/wp-includes/l10n.php @@ -116,7 +116,8 @@ function get_user_locale( $user = 0 ) { * * @since 5.0.0 * - * @global string $pagenow The filename of the current screen. + * @global string $pagenow The filename of the current screen. + * @global string $wp_local_package Locale code of the package. * * @return string The determined locale. */ From 015148da1d4d1ab395f51a8275a40eafe78632c0 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Tue, 28 Jan 2025 14:00:16 +0000 Subject: [PATCH 251/323] Build/Test Tools: Avoid using `*-latest` tags for runner images. While using the `ubuntu-latest`, `macos-latest`, and `windows-latest` runner image tags is convenient, it has proven to be problematic in a number of instances as the runners are slowly updated (see #62808 and #62843). This switches all workflows to using specific version tags representing the latest non-preview versions, which currently are as follows: - `ubuntu-24.04` - `windows-2022` - `macos-14` Props swissspidy, johnbillion. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59720 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/coding-standards.yml | 2 +- .github/workflows/end-to-end-tests.yml | 2 +- .github/workflows/failed-workflow.yml | 2 +- .github/workflows/install-testing.yml | 4 ++-- .github/workflows/javascript-tests.yml | 2 +- .../workflows/local-docker-environment.yml | 4 ++-- .github/workflows/performance.yml | 2 +- .github/workflows/php-compatibility.yml | 2 +- .github/workflows/phpunit-tests.yml | 22 +++++++++---------- .github/workflows/props-bot.yml | 2 +- .github/workflows/pull-request-comments.yml | 6 ++--- .../reusable-cleanup-pull-requests.yml | 2 +- .../reusable-coding-standards-javascript.yml | 2 +- .../reusable-coding-standards-php.yml | 2 +- .../workflows/reusable-end-to-end-tests.yml | 2 +- .../workflows/reusable-javascript-tests.yml | 2 +- .github/workflows/reusable-performance.yml | 2 +- .../workflows/reusable-php-compatibility.yml | 2 +- .../workflows/reusable-phpunit-tests-v1.yml | 2 +- .../workflows/reusable-phpunit-tests-v2.yml | 2 +- .../workflows/reusable-phpunit-tests-v3.yml | 2 +- .../reusable-support-json-reader-v1.yml | 6 ++--- .../reusable-test-core-build-process.yml | 4 ++-- .../reusable-test-gutenberg-build-process.yml | 2 +- ...sable-test-local-docker-environment-v1.yml | 2 +- .../workflows/reusable-upgrade-testing.yml | 2 +- .github/workflows/reusable-workflow-lint.yml | 2 +- .github/workflows/slack-notifications.yml | 10 ++++----- .../workflows/test-and-zip-default-themes.yml | 8 +++---- .github/workflows/test-build-processes.yml | 12 +++++----- .github/workflows/test-coverage.yml | 2 +- .github/workflows/test-old-branches.yml | 2 +- .github/workflows/upgrade-testing.yml | 16 +++++++------- 33 files changed, 69 insertions(+), 69 deletions(-) diff --git a/.github/workflows/coding-standards.yml b/.github/workflows/coding-standards.yml index 527293c4240f4..3bb7a60d1d233 100644 --- a/.github/workflows/coding-standards.yml +++ b/.github/workflows/coding-standards.yml @@ -80,7 +80,7 @@ jobs: failed-workflow: name: Failed workflow tasks - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: actions: write needs: [ phpcs, jshint, slack-notifications ] diff --git a/.github/workflows/end-to-end-tests.yml b/.github/workflows/end-to-end-tests.yml index 173612a0d3af9..06d6ac8e43a76 100644 --- a/.github/workflows/end-to-end-tests.yml +++ b/.github/workflows/end-to-end-tests.yml @@ -67,7 +67,7 @@ jobs: failed-workflow: name: Failed workflow tasks - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: actions: write needs: [ e2e-tests, slack-notifications ] diff --git a/.github/workflows/failed-workflow.yml b/.github/workflows/failed-workflow.yml index fb9b3e099809a..c937c20268ff3 100644 --- a/.github/workflows/failed-workflow.yml +++ b/.github/workflows/failed-workflow.yml @@ -23,7 +23,7 @@ jobs: # - Restarts all failed jobs when the workflow fails or is cancelled for the first time. failed-workflow: name: Rerun a workflow - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: actions: write timeout-minutes: 30 diff --git a/.github/workflows/install-testing.yml b/.github/workflows/install-testing.yml index e4d91eccd26b7..29af9df52dc9b 100644 --- a/.github/workflows/install-testing.yml +++ b/.github/workflows/install-testing.yml @@ -69,7 +69,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ ubuntu-latest ] + os: [ ubuntu-24.04 ] php: ${{ fromJSON( needs.build-test-matrix.outputs.php-versions ) }} db-type: [ 'mysql' ] db-version: ${{ fromJSON( needs.build-test-matrix.outputs.mysql-versions ) }} @@ -152,7 +152,7 @@ jobs: failed-workflow: name: Failed workflow tasks - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: actions: write needs: [ slack-notifications ] diff --git a/.github/workflows/javascript-tests.yml b/.github/workflows/javascript-tests.yml index 3b36a0e96aa10..54a78fcf42df4 100644 --- a/.github/workflows/javascript-tests.yml +++ b/.github/workflows/javascript-tests.yml @@ -70,7 +70,7 @@ jobs: failed-workflow: name: Failed workflow tasks - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: actions: write needs: [ slack-notifications ] diff --git a/.github/workflows/local-docker-environment.yml b/.github/workflows/local-docker-environment.yml index d5c2a6be96a01..a7bdc38f16bf4 100644 --- a/.github/workflows/local-docker-environment.yml +++ b/.github/workflows/local-docker-environment.yml @@ -82,7 +82,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ ubuntu-latest ] + os: [ ubuntu-24.04 ] memcached: [ false, true ] php: ${{ fromJSON( needs.build-test-matrix.outputs.php-versions ) }} db-version: ${{ fromJSON( needs.build-test-matrix.outputs.mysql-versions ) }} @@ -123,7 +123,7 @@ jobs: failed-workflow: name: Failed workflow tasks - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: actions: write needs: [ build-test-matrix, environment-tests-mysql, slack-notifications ] diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index 73ef5afc87454..1b4190293ebd8 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -66,7 +66,7 @@ jobs: failed-workflow: name: Failed workflow tasks - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: actions: write needs: [ slack-notifications ] diff --git a/.github/workflows/php-compatibility.yml b/.github/workflows/php-compatibility.yml index bb611d0f8bf58..c712e50476dbe 100644 --- a/.github/workflows/php-compatibility.yml +++ b/.github/workflows/php-compatibility.yml @@ -67,7 +67,7 @@ jobs: failed-workflow: name: Failed workflow tasks - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: actions: write needs: [ slack-notifications ] diff --git a/.github/workflows/phpunit-tests.yml b/.github/workflows/phpunit-tests.yml index dbab9135d01c1..bcd8b3ef93ade 100644 --- a/.github/workflows/phpunit-tests.yml +++ b/.github/workflows/phpunit-tests.yml @@ -44,7 +44,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ ubuntu-latest ] + os: [ ubuntu-24.04 ] php: [ '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ] db-type: [ 'mysql' ] db-version: [ '5.7', '8.0', '8.4' ] @@ -54,14 +54,14 @@ jobs: include: # Include jobs that test with memcached. - - os: ubuntu-latest + - os: ubuntu-24.04 php: '8.3' db-type: 'mysql' db-version: '8.4' tests-domain: 'example.org' multisite: false memcached: true - - os: ubuntu-latest + - os: ubuntu-24.04 php: '8.3' db-type: 'mysql' db-version: '8.4' @@ -69,14 +69,14 @@ jobs: multisite: true memcached: true # Include jobs with a port on the test domain for both single and multisite. - - os: ubuntu-latest + - os: ubuntu-24.04 php: '8.4' db-type: 'mysql' db-version: '8.4' tests-domain: 'example.org:8889' multisite: false memcached: false - - os: ubuntu-latest + - os: ubuntu-24.04 php: '8.4' db-type: 'mysql' db-version: '8.4' @@ -84,7 +84,7 @@ jobs: multisite: true memcached: false # Report test results to the Host Test Results. - - os: ubuntu-latest + - os: ubuntu-24.04 db-type: 'mysql' db-version: '8.4' tests-domain: 'example.org' @@ -115,7 +115,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ ubuntu-latest ] + os: [ ubuntu-24.04 ] php: [ '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ] db-type: [ 'mariadb' ] db-version: [ '5.5', '10.3', '10.4', '10.5', '10.6', '10.11', '11.4' ] @@ -124,13 +124,13 @@ jobs: include: # Include jobs that test with memcached. - - os: ubuntu-latest + - os: ubuntu-24.04 php: '8.3' db-type: 'mariadb' db-version: '11.4' multisite: false memcached: true - - os: ubuntu-latest + - os: ubuntu-24.04 php: '8.3' db-type: 'mariadb' db-version: '11.4' @@ -165,7 +165,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ ubuntu-latest ] + os: [ ubuntu-24.04 ] php: [ '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ] db-type: [ 'mysql', 'mariadb' ] db-version: [ '9.1', '11.6' ] @@ -236,7 +236,7 @@ jobs: failed-workflow: name: Failed workflow tasks - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: actions: write needs: [ slack-notifications ] diff --git a/.github/workflows/props-bot.yml b/.github/workflows/props-bot.yml index 474213062e44f..339451011270a 100644 --- a/.github/workflows/props-bot.yml +++ b/.github/workflows/props-bot.yml @@ -48,7 +48,7 @@ jobs: # - Removes the props-bot label, if necessary. props-bot: name: Generate a list of props - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: # The action needs permission `write` permission for PRs in order to add a comment. pull-requests: write diff --git a/.github/workflows/pull-request-comments.yml b/.github/workflows/pull-request-comments.yml index df060fc657f1b..ea18e6be9184c 100644 --- a/.github/workflows/pull-request-comments.yml +++ b/.github/workflows/pull-request-comments.yml @@ -22,7 +22,7 @@ permissions: {} jobs: # Comments on a pull request when the author is a first time contributor. post-welcome-message: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: issues: write pull-requests: write @@ -80,7 +80,7 @@ jobs: # Leaves a comment on a pull request with a link to test the changes in a WordPress Playground instance. playground-details: name: Comment on a pull request with Playground details - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: issues: write pull-requests: write @@ -170,7 +170,7 @@ jobs: # Manages comments reminding contributors to include a Trac ticket link when opening a pull request. trac-ticket-check: name: Manage Trac ticket reminders for pull requests - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: issues: write pull-requests: write diff --git a/.github/workflows/reusable-cleanup-pull-requests.yml b/.github/workflows/reusable-cleanup-pull-requests.yml index 8c49236782dd2..79c3566e9569c 100644 --- a/.github/workflows/reusable-cleanup-pull-requests.yml +++ b/.github/workflows/reusable-cleanup-pull-requests.yml @@ -22,7 +22,7 @@ jobs: # - Leaves a comment on each PR before closing. close-prs: name: Find and close PRs - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: pull-requests: write diff --git a/.github/workflows/reusable-coding-standards-javascript.yml b/.github/workflows/reusable-coding-standards-javascript.yml index 5e77e8cf3e10f..23c2ccf0d5a01 100644 --- a/.github/workflows/reusable-coding-standards-javascript.yml +++ b/.github/workflows/reusable-coding-standards-javascript.yml @@ -27,7 +27,7 @@ jobs: # - Ensures version-controlled files are not modified or deleted. jshint: name: Run coding standards checks - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: contents: read timeout-minutes: 20 diff --git a/.github/workflows/reusable-coding-standards-php.yml b/.github/workflows/reusable-coding-standards-php.yml index 82973f1515b4f..15766ddb69a64 100644 --- a/.github/workflows/reusable-coding-standards-php.yml +++ b/.github/workflows/reusable-coding-standards-php.yml @@ -39,7 +39,7 @@ jobs: # - Ensures version-controlled files are not modified or deleted. phpcs: name: Run coding standards checks - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: contents: read timeout-minutes: 20 diff --git a/.github/workflows/reusable-end-to-end-tests.yml b/.github/workflows/reusable-end-to-end-tests.yml index 790f120aa8b81..09a6346c23883 100644 --- a/.github/workflows/reusable-end-to-end-tests.yml +++ b/.github/workflows/reusable-end-to-end-tests.yml @@ -59,7 +59,7 @@ jobs: # - Ensures version-controlled files are not modified or deleted. e2e-tests: name: Run E2E tests - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: contents: read timeout-minutes: 20 diff --git a/.github/workflows/reusable-javascript-tests.yml b/.github/workflows/reusable-javascript-tests.yml index b3a63f65e32fd..d1cf58b724534 100644 --- a/.github/workflows/reusable-javascript-tests.yml +++ b/.github/workflows/reusable-javascript-tests.yml @@ -28,7 +28,7 @@ jobs: # - Ensures version-controlled files are not modified or deleted. test-js: name: Run QUnit tests - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: contents: read timeout-minutes: 20 diff --git a/.github/workflows/reusable-performance.yml b/.github/workflows/reusable-performance.yml index 56fb0e95eba73..1b3e6e527100a 100644 --- a/.github/workflows/reusable-performance.yml +++ b/.github/workflows/reusable-performance.yml @@ -115,7 +115,7 @@ jobs: # - Ensure version-controlled files are not modified or deleted. performance: name: ${{ inputs.multisite && 'Multisite' || 'Single site' }} / ${{ inputs.memcached && 'Memcached' || 'Default' }} - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: contents: read if: ${{ ! contains( github.event.before, '00000000' ) }} diff --git a/.github/workflows/reusable-php-compatibility.yml b/.github/workflows/reusable-php-compatibility.yml index 74c39999f12ac..f7eeb8ea5c24f 100644 --- a/.github/workflows/reusable-php-compatibility.yml +++ b/.github/workflows/reusable-php-compatibility.yml @@ -33,7 +33,7 @@ jobs: # - Ensures version-controlled files are not modified or deleted. php-compatibility: name: Run compatibility checks - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: contents: read timeout-minutes: 20 diff --git a/.github/workflows/reusable-phpunit-tests-v1.yml b/.github/workflows/reusable-phpunit-tests-v1.yml index 4da2b3bb99bff..3d7c832b4544a 100644 --- a/.github/workflows/reusable-phpunit-tests-v1.yml +++ b/.github/workflows/reusable-phpunit-tests-v1.yml @@ -14,7 +14,7 @@ on: description: 'Operating system to run tests on' required: false type: 'string' - default: 'ubuntu-latest' + default: 'ubuntu-24.04' php: description: 'The version of PHP to use, in the format of X.Y' required: true diff --git a/.github/workflows/reusable-phpunit-tests-v2.yml b/.github/workflows/reusable-phpunit-tests-v2.yml index d5df2f0bf18ef..01bb1f4ceaaa2 100644 --- a/.github/workflows/reusable-phpunit-tests-v2.yml +++ b/.github/workflows/reusable-phpunit-tests-v2.yml @@ -14,7 +14,7 @@ on: description: 'Operating system to run tests on' required: false type: 'string' - default: 'ubuntu-latest' + default: 'ubuntu-24.04' php: description: 'The version of PHP to use, in the format of X.Y' required: true diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index c5cb24f3016ba..947c7d46d23a4 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -12,7 +12,7 @@ on: description: 'Operating system to run tests on' required: false type: 'string' - default: 'ubuntu-latest' + default: 'ubuntu-24.04' php: description: 'The version of PHP to use, in the format of X.Y' required: true diff --git a/.github/workflows/reusable-support-json-reader-v1.yml b/.github/workflows/reusable-support-json-reader-v1.yml index 02adfb07e70bd..59cc54b1ea761 100644 --- a/.github/workflows/reusable-support-json-reader-v1.yml +++ b/.github/workflows/reusable-support-json-reader-v1.yml @@ -42,7 +42,7 @@ jobs: name: Determine major WordPress version permissions: contents: read - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 5 outputs: version: ${{ steps.major-wp-version.outputs.version }} @@ -78,7 +78,7 @@ jobs: name: Determine PHP versions permissions: contents: read - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [ major-wp-version ] timeout-minutes: 5 outputs: @@ -121,7 +121,7 @@ jobs: name: Determine MySQL versions permissions: contents: read - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [ major-wp-version ] timeout-minutes: 5 outputs: diff --git a/.github/workflows/reusable-test-core-build-process.yml b/.github/workflows/reusable-test-core-build-process.yml index 4f119b5f1eef1..653dcd902757c 100644 --- a/.github/workflows/reusable-test-core-build-process.yml +++ b/.github/workflows/reusable-test-core-build-process.yml @@ -10,7 +10,7 @@ on: description: 'Operating system to run tests on' required: false type: 'string' - default: 'ubuntu-latest' + default: 'ubuntu-24.04' directory: description: 'Directory to run WordPress from. Valid values are `src` or `build`' required: false @@ -98,7 +98,7 @@ jobs: run: git diff --exit-code - name: Create ZIP of built files - if: ${{ inputs.directory == 'build' && 'ubuntu-latest' == inputs.os }} + if: ${{ inputs.directory == 'build' && 'ubuntu-24.04' == inputs.os }} run: zip -r wordpress.zip build/. - name: Clean after building to run from ${{ inputs.directory }} diff --git a/.github/workflows/reusable-test-gutenberg-build-process.yml b/.github/workflows/reusable-test-gutenberg-build-process.yml index f7371d2c3750e..0590025e0d456 100644 --- a/.github/workflows/reusable-test-gutenberg-build-process.yml +++ b/.github/workflows/reusable-test-gutenberg-build-process.yml @@ -10,7 +10,7 @@ on: description: 'Operating system to run tests on' required: false type: 'string' - default: 'ubuntu-latest' + default: 'ubuntu-24.04' directory: description: 'Directory to run WordPress from. Valid values are `src` or `build`' required: false diff --git a/.github/workflows/reusable-test-local-docker-environment-v1.yml b/.github/workflows/reusable-test-local-docker-environment-v1.yml index 3d3b47c2240b5..22e62e9145ebb 100644 --- a/.github/workflows/reusable-test-local-docker-environment-v1.yml +++ b/.github/workflows/reusable-test-local-docker-environment-v1.yml @@ -12,7 +12,7 @@ on: description: 'Operating system to test' required: false type: 'string' - default: 'ubuntu-latest' + default: 'ubuntu-24.04' php: description: 'The version of PHP to use, in the format of X.Y' required: false diff --git a/.github/workflows/reusable-upgrade-testing.yml b/.github/workflows/reusable-upgrade-testing.yml index 544c1ad38ecad..1c617ee91f36f 100644 --- a/.github/workflows/reusable-upgrade-testing.yml +++ b/.github/workflows/reusable-upgrade-testing.yml @@ -8,7 +8,7 @@ on: description: 'Operating system to run tests on.' required: false type: 'string' - default: 'ubuntu-latest' + default: 'ubuntu-24.04' wp: description: 'The version of WordPress to start with.' required: true diff --git a/.github/workflows/reusable-workflow-lint.yml b/.github/workflows/reusable-workflow-lint.yml index 352a1eb65e5d8..8add7c6591b71 100644 --- a/.github/workflows/reusable-workflow-lint.yml +++ b/.github/workflows/reusable-workflow-lint.yml @@ -15,7 +15,7 @@ jobs: # - Runs actionlint. actionlint: name: Run actionlint - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: contents: read timeout-minutes: 5 diff --git a/.github/workflows/slack-notifications.yml b/.github/workflows/slack-notifications.yml index 53ad9c36fd0d6..af5b75c8ef826 100644 --- a/.github/workflows/slack-notifications.yml +++ b/.github/workflows/slack-notifications.yml @@ -47,7 +47,7 @@ jobs: # - Constructs and stores a message payload as an output. prepare: name: Prepare notifications - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: actions: read contents: read @@ -171,7 +171,7 @@ jobs: failure: name: Failure notifications permissions: {} - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 10 needs: [ prepare ] if: ${{ needs.prepare.outputs.previous_conclusion != 'first-failure' && inputs.calling_status == 'failure' || failure() }} @@ -188,7 +188,7 @@ jobs: fixed: name: Fixed notifications permissions: {} - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 10 needs: [ prepare ] if: ${{ contains( fromJson( '["failure", "cancelled", "none"]' ), needs.prepare.outputs.previous_conclusion ) && inputs.calling_status == 'success' && success() }} @@ -205,7 +205,7 @@ jobs: success: name: Success notifications permissions: {} - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 10 needs: [ prepare ] if: ${{ inputs.calling_status == 'success' && success() }} @@ -222,7 +222,7 @@ jobs: cancelled: name: Cancelled notifications permissions: {} - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 10 needs: [ prepare ] if: ${{ inputs.calling_status == 'cancelled' || cancelled() }} diff --git a/.github/workflows/test-and-zip-default-themes.yml b/.github/workflows/test-and-zip-default-themes.yml index 3c6f28fe304fb..a339f0791bb73 100644 --- a/.github/workflows/test-and-zip-default-themes.yml +++ b/.github/workflows/test-and-zip-default-themes.yml @@ -59,7 +59,7 @@ jobs: # - Checks for zero-byte (empty) files. check-for-empty-files: name: ${{ matrix.theme }} empty file check - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: contents: read timeout-minutes: 10 @@ -109,7 +109,7 @@ jobs: # - Ensures version-controlled files are not modified or deleted. test-build-scripts: name: Test ${{ matrix.theme }} build script - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: contents: read timeout-minutes: 10 @@ -158,7 +158,7 @@ jobs: # - Uploads the theme files as a workflow artifact (files uploaded as an artifact are automatically zipped). bundle-theme: name: Create ${{ matrix.theme }} ZIP file - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: contents: read needs: [ check-for-empty-files, test-build-scripts ] @@ -219,7 +219,7 @@ jobs: failed-workflow: name: Failed workflow tasks - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: actions: write needs: [ slack-notifications ] diff --git a/.github/workflows/test-build-processes.yml b/.github/workflows/test-build-processes.yml index 61685f2eeb5f8..b44d09101d060 100644 --- a/.github/workflows/test-build-processes.yml +++ b/.github/workflows/test-build-processes.yml @@ -38,11 +38,11 @@ jobs: strategy: fail-fast: false matrix: - os: [ ubuntu-latest, windows-latest ] + os: [ ubuntu-24.04, windows-2022 ] directory: [ 'src', 'build' ] include: # Only prepare artifacts for Playground once. - - os: ubuntu-latest + - os: ubuntu-24.04 directory: 'build' save-build: true prepare-playground: ${{ github.event_name == 'pull_request' && true || '' }} @@ -70,7 +70,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ macos-latest ] + os: [ macos-14 ] directory: [ 'src', 'build' ] with: os: ${{ matrix.os }} @@ -86,7 +86,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ ubuntu-latest, windows-latest ] + os: [ ubuntu-24.04, windows-2022 ] directory: [ 'src', 'build' ] with: os: ${{ matrix.os }} @@ -109,7 +109,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ macos-latest ] + os: [ macos-14 ] directory: [ 'src', 'build' ] with: os: ${{ matrix.os }} @@ -133,7 +133,7 @@ jobs: failed-workflow: name: Failed workflow tasks - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: actions: write needs: [ slack-notifications ] diff --git a/.github/workflows/test-coverage.yml b/.github/workflows/test-coverage.yml index 4a5b3565d2fe1..dbf9b79b9393e 100644 --- a/.github/workflows/test-coverage.yml +++ b/.github/workflows/test-coverage.yml @@ -83,7 +83,7 @@ jobs: failed-workflow: name: Failed workflow tasks - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: actions: write needs: [ slack-notifications ] diff --git a/.github/workflows/test-old-branches.yml b/.github/workflows/test-old-branches.yml index 29c7aeac25eee..5272ec7369f5b 100644 --- a/.github/workflows/test-old-branches.yml +++ b/.github/workflows/test-old-branches.yml @@ -30,7 +30,7 @@ env: jobs: dispatch-workflows-for-old-branches: name: ${{ matrix.workflow }} for ${{ matrix.branch }} - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: actions: write timeout-minutes: 20 diff --git a/.github/workflows/upgrade-testing.yml b/.github/workflows/upgrade-testing.yml index cd0a766cef8f0..a8b4a9b1c2a46 100644 --- a/.github/workflows/upgrade-testing.yml +++ b/.github/workflows/upgrade-testing.yml @@ -62,7 +62,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ 'ubuntu-latest' ] + os: [ 'ubuntu-24.04' ] php: [ '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ] db-type: [ 'mysql' ] db-version: [ '5.7', '8.0', '8.4', '9.1' ] @@ -97,7 +97,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ 'ubuntu-latest' ] + os: [ 'ubuntu-24.04' ] php: [ '7.2', '7.4', '8.0', '8.4' ] db-type: [ 'mysql' ] db-version: [ '5.7', '8.4' ] @@ -125,7 +125,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ 'ubuntu-latest' ] + os: [ 'ubuntu-24.04' ] php: [ '7.2', '7.4' ] db-type: [ 'mysql' ] db-version: [ '5.7', '8.4' ] @@ -157,7 +157,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ 'ubuntu-latest' ] + os: [ 'ubuntu-24.04' ] php: [ '8.0', '8.4' ] db-type: [ 'mysql' ] db-version: [ '5.7', '8.4' ] @@ -182,7 +182,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ 'ubuntu-latest' ] + os: [ 'ubuntu-24.04' ] php: [ '7.2', '7.4' ] db-type: [ 'mysql' ] db-version: [ '5.7', '8.4' ] @@ -216,7 +216,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ 'ubuntu-latest' ] + os: [ 'ubuntu-24.04' ] php: [ '8.0', '8.4' ] db-type: [ 'mysql' ] db-version: [ '5.7', '8.4' ] @@ -240,7 +240,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ 'ubuntu-latest' ] + os: [ 'ubuntu-24.04' ] php: [ '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ] db-type: [ 'mysql' ] db-version: [ '5.7', '8.0', '8.4', '9.1' ] @@ -285,7 +285,7 @@ jobs: failed-workflow: name: Failed workflow tasks - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: actions: write needs: [ slack-notifications ] From a2b20266eaccb2f40f711a133c55679b0ac37327 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Tue, 28 Jan 2025 16:18:04 +0000 Subject: [PATCH 252/323] Build/Test Tools: Adjust the check for runner type when creating a ZIP file. Because the build process test workflow accepts an input for runner image, older workflows still use `ubuntu-latest`. This adjusts a conditional check to be more broad, allowing any `ubuntu-` image to match. Follow up to [59720]. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59722 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-test-core-build-process.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reusable-test-core-build-process.yml b/.github/workflows/reusable-test-core-build-process.yml index 653dcd902757c..68482db544585 100644 --- a/.github/workflows/reusable-test-core-build-process.yml +++ b/.github/workflows/reusable-test-core-build-process.yml @@ -98,7 +98,7 @@ jobs: run: git diff --exit-code - name: Create ZIP of built files - if: ${{ inputs.directory == 'build' && 'ubuntu-24.04' == inputs.os }} + if: ${{ inputs.directory == 'build' && contains( inputs.os, 'ubuntu-' ) }} run: zip -r wordpress.zip build/. - name: Clean after building to run from ${{ inputs.directory }} From 1a8297e40b7a0b591d2ec2ee5af1d5caf290f070 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Tue, 28 Jan 2025 22:43:54 +0000 Subject: [PATCH 253/323] Coding Standards: Use strict comparison in `wp_xmlrpc_server::mw_editPost()`. Follow-up to [5281], [19914], [31983]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59723 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-xmlrpc-server.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index 2a1815e5aa15d..93c9333d59871 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -5790,7 +5790,7 @@ public function mw_editPost( $args ) { } // Thwart attempt to change the post type. - if ( ! empty( $content_struct['post_type'] ) && ( $content_struct['post_type'] != $postdata['post_type'] ) ) { + if ( ! empty( $content_struct['post_type'] ) && ( $content_struct['post_type'] !== $postdata['post_type'] ) ) { return new IXR_Error( 401, __( 'The post type may not be changed.' ) ); } @@ -5843,10 +5843,10 @@ public function mw_editPost( $args ) { $post_author = $postdata['post_author']; - // If an author id was provided then use it instead. + // If an author ID was provided then use it instead. if ( isset( $content_struct['wp_author_id'] ) ) { // Check permissions if attempting to switch author to or from another user. - if ( $user->ID != $content_struct['wp_author_id'] || $user->ID != $post_author ) { + if ( $user->ID !== (int) $content_struct['wp_author_id'] || $user->ID !== (int) $post_author ) { switch ( $post_type ) { case 'post': if ( ! current_user_can( 'edit_others_posts' ) ) { From 784e60bb5a2d0419ab47ff963d69d756aa7bde81 Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Tue, 28 Jan 2025 23:20:48 +0000 Subject: [PATCH 254/323] Security: Always include the `no-store` and `private` directives in the `Cache-Control` header when setting headers that prevent caching. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The intention of these headers is to prevent any form of caching, whether that's in the browser or in an intermediate cache such as a proxy server. These directives instruct an intermediate cache to not store the response in their cache for any user – not just for logged-in users. This does not affect the caching behaviour of assets within a page such as images, CSS, and JavaScript files. Props kkmuffme, devansh2002, johnbillion. Fixes #61942 git-svn-id: https://develop.svn.wordpress.org/trunk@59724 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/functions.php | 8 +++---- .../cache-control-headers-directives.test.js | 22 +++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/functions.php b/src/wp-includes/functions.php index f46de3a2821ba..fd772424abce4 100644 --- a/src/wp-includes/functions.php +++ b/src/wp-includes/functions.php @@ -1489,18 +1489,18 @@ function status_header( $code, $description = '' ) { * Gets the HTTP header information to prevent caching. * * The several different headers cover the different ways cache prevention - * is handled by different browsers. + * is handled by different browsers or intermediate caches such as proxy servers. * * @since 2.8.0 * @since 6.3.0 The `Cache-Control` header for logged in users now includes the * `no-store` and `private` directives. + * @since 6.8.0 The `Cache-Control` header now includes the `no-store` and `private` + * directives regardless of whether a user is logged in. * * @return array The associative array of header names and field values. */ function wp_get_nocache_headers() { - $cache_control = ( function_exists( 'is_user_logged_in' ) && is_user_logged_in() ) - ? 'no-cache, must-revalidate, max-age=0, no-store, private' - : 'no-cache, must-revalidate, max-age=0'; + $cache_control = 'no-cache, must-revalidate, max-age=0, no-store, private'; $headers = array( 'Expires' => 'Wed, 11 Jan 1984 05:00:00 GMT', diff --git a/tests/e2e/specs/cache-control-headers-directives.test.js b/tests/e2e/specs/cache-control-headers-directives.test.js index 427188915098a..4d0dada8f0a70 100644 --- a/tests/e2e/specs/cache-control-headers-directives.test.js +++ b/tests/e2e/specs/cache-control-headers-directives.test.js @@ -27,6 +27,7 @@ test.describe( 'Cache Control header directives', () => { // Dispose context once it's no longer needed. await context.close(); + expect( responseHeaders ).toEqual( expect.not.objectContaining( { "cache-control": "no-cache" } ) ); expect( responseHeaders ).toEqual( expect.not.objectContaining( { "cache-control": "no-store" } ) ); expect( responseHeaders ).toEqual( expect.not.objectContaining( { "cache-control": "private" } ) ); } ); @@ -40,6 +41,27 @@ test.describe( 'Cache Control header directives', () => { const response = await page.goto( '/wp-admin' ); const responseHeaders = response.headers(); + expect( responseHeaders[ 'cache-control' ] ).toContain( 'no-cache' ); + expect( responseHeaders[ 'cache-control' ] ).toContain( 'no-store' ); + expect( responseHeaders[ 'cache-control' ] ).toContain( 'private' ); + } ); + + test( + 'Correct directives present in cache control header when not logged in on 404 page.', + async ( { browser } + ) => { + const context = await browser.newContext(); + const loggedOutPage = await context.newPage(); + + const response = await loggedOutPage.goto( '/this-does-not-exist/' ); + const responseHeaders = response.headers(); + const responseStatus = response.status(); + + // Dispose context once it's no longer needed. + await context.close(); + + expect( responseStatus ).toBe( 404 ); + expect( responseHeaders[ 'cache-control' ] ).toContain( 'no-cache' ); expect( responseHeaders[ 'cache-control' ] ).toContain( 'no-store' ); expect( responseHeaders[ 'cache-control' ] ).toContain( 'private' ); } ); From d73702aa216345400929f735f992b91c8cd2faec Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Tue, 28 Jan 2025 23:47:49 +0000 Subject: [PATCH 255/323] Build/Test Tools: Add some more `paths` restrictions to GitHub Actions workflow files to minimise unnecessary workflow runs. Props mukesh27, johnbillion See #62280 git-svn-id: https://develop.svn.wordpress.org/trunk@59725 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/end-to-end-tests.yml | 17 +++++++++++++++++ .github/workflows/javascript-tests.yml | 5 ++++- .../workflows/local-docker-environment.yml | 10 ++++++++-- .github/workflows/performance.yml | 17 +++++++++++++++++ .github/workflows/phpunit-tests.yml | 19 +++++++++++++++++++ .github/workflows/test-build-processes.yml | 17 +++++++++++++++++ 6 files changed, 82 insertions(+), 3 deletions(-) diff --git a/.github/workflows/end-to-end-tests.yml b/.github/workflows/end-to-end-tests.yml index 06d6ac8e43a76..cc8f34810106c 100644 --- a/.github/workflows/end-to-end-tests.yml +++ b/.github/workflows/end-to-end-tests.yml @@ -17,6 +17,23 @@ on: - trunk - '5.[3-9]' - '[6-9].[0-9]' + paths: + # Any change to a PHP, CSS, or JavaScript file should run checks. + - '**.css' + - '**.js' + - '**.php' + # These files configure npm and the task runner. Changes could affect the outcome. + - 'package*.json' + - 'Gruntfile.js' + - 'webpack.config.js' + - 'tools/webpack/**' + # These files configure Composer. Changes could affect the outcome. + - 'composer.*' + # This files affect the e2e tests. Changes could affect the outcome. + - 'tests/e2e/**' + # Confirm any changes to relevant workflow files. + - '.github/workflows/end-to-end-tests.yml' + - '.github/workflows/reusable-end-to-end-tests-*.yml' workflow_dispatch: # Cancels all previous workflow runs for pull requests that have not completed. diff --git a/.github/workflows/javascript-tests.yml b/.github/workflows/javascript-tests.yml index 54a78fcf42df4..989f2d8aa8ccc 100644 --- a/.github/workflows/javascript-tests.yml +++ b/.github/workflows/javascript-tests.yml @@ -19,8 +19,11 @@ on: paths: # Any change to a JavaScript file should run tests. - '**.js' - # These files configure npm. Changes could affect the outcome. + # These files configure npm and the task runner. Changes could affect the outcome. - 'package*.json' + - 'Gruntfile.js' + - 'webpack.config.js' + - 'tools/webpack/**' # This file configures ESLint. Changes could affect the outcome. - '.eslintignore' # This file configures JSHint. Changes could affect the outcome. diff --git a/.github/workflows/local-docker-environment.yml b/.github/workflows/local-docker-environment.yml index a7bdc38f16bf4..288a03fd4dc16 100644 --- a/.github/workflows/local-docker-environment.yml +++ b/.github/workflows/local-docker-environment.yml @@ -12,8 +12,11 @@ on: - 'docker-compose.yml' # Any changes to local environment related files - 'tools/local-env/**' - # These files manage packages used by the local environment. + # These files configure npm and the task runner. Changes could affect the outcome. - 'package*.json' + - 'Gruntfile.js' + - 'webpack.config.js' + - 'tools/webpack/**' # These files configure Composer. Changes could affect the local environment. - 'composer.*' # These files define the versions to test. @@ -33,8 +36,11 @@ on: - 'docker-compose.yml' # Any changes to local environment related files - 'tools/local-env/**' - # These files manage packages used by the local environment. + # These files configure npm and the task runner. Changes could affect the outcome. - 'package*.json' + - 'Gruntfile.js' + - 'webpack.config.js' + - 'tools/webpack/**' # These files configure Composer. Changes could affect the local environment. - 'composer.*' # These files define the versions to test. diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index 1b4190293ebd8..fc29f0c015ee1 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -16,6 +16,23 @@ on: - trunk - '6.[2-9]' - '[7-9].[0-9]' + paths: + # Any change to a PHP, CSS, or JavaScript file should run checks. + - '**.css' + - '**.js' + - '**.php' + # These files configure npm and the task runner. Changes could affect the outcome. + - 'package*.json' + - 'Gruntfile.js' + - 'webpack.config.js' + - 'tools/webpack/**' + # These files configure Composer. Changes could affect the outcome. + - 'composer.*' + # This files affect the performance tests. Changes could affect the outcome. + - 'tests/performance/**' + # Confirm any changes to relevant workflow files. + - '.github/workflows/performance.yml' + - '.github/workflows/reusable-performance.yml' workflow_dispatch: # Cancels all previous workflow runs for pull requests that have not completed. diff --git a/.github/workflows/phpunit-tests.yml b/.github/workflows/phpunit-tests.yml index bcd8b3ef93ade..44c1476980fde 100644 --- a/.github/workflows/phpunit-tests.yml +++ b/.github/workflows/phpunit-tests.yml @@ -14,6 +14,25 @@ on: - trunk - '3.[7-9]' - '[4-9].[0-9]' + paths: + # Any change to a PHP, CSS, JavaScript, JSON, HTML, or otherwise tested file should run checks. + - '**.css' + - '**.html' + - '**.js' + - '**.json' + - '**.php' + - 'src/license.txt' + - 'src/SECURITY.md' + # These files configure npm and the task runner. Changes could affect the outcome. + - 'package*.json' + - 'Gruntfile.js' + # These files configure Composer. Changes could affect the outcome. + - 'composer.*' + # This files affect the phpunit tests. Changes could affect the outcome. + - 'tests/phpunit/**' + # Confirm any changes to relevant workflow files. + - '.github/workflows/phpunit-tests.yml' + - '.github/workflows/reusable-phpunit-tests-*.yml' workflow_dispatch: # Once weekly On Sundays at 00:00 UTC. schedule: diff --git a/.github/workflows/test-build-processes.yml b/.github/workflows/test-build-processes.yml index b44d09101d060..2170bc689b8c3 100644 --- a/.github/workflows/test-build-processes.yml +++ b/.github/workflows/test-build-processes.yml @@ -14,6 +14,23 @@ on: - trunk - '3.[7-9]' - '[4-9].[0-9]' + paths: + # Any change to a PHP, CSS, JavaScript, or JSON file should run checks. + - '**.css' + - '**.js' + - '**.json' + - '**.php' + # These files configure npm and the task runner. Changes could affect the outcome. + - 'package*.json' + - 'Gruntfile.js' + - 'webpack.config.js' + - 'tools/webpack/**' + # These files configure Composer. Changes could affect the outcome. + - 'composer.*' + # Confirm any changes to relevant workflow files. + - '.github/workflows/test-build-processes.yml' + - '.github/workflows/reusable-test-core-build-process.yml' + - '.github/workflows/reusable-test-gutenberg-build-process.yml' workflow_dispatch: # Cancels all previous workflow runs for pull requests that have not completed. From 8246f316e48b47af4ab177cdc1b1891f5150009f Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Wed, 29 Jan 2025 14:44:32 +0000 Subject: [PATCH 256/323] Coding Standards: Use strict comparison in `wp_xmlrpc_server::set_custom_fields()`. Follow-up to [40692]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59726 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-xmlrpc-server.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index 93c9333d59871..a342ce5f2f6ff 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -426,7 +426,7 @@ public function set_custom_fields( $post_id, $fields ) { $meta['id'] = (int) $meta['id']; $pmeta = get_metadata_by_mid( 'post', $meta['id'] ); - if ( ! $pmeta || $pmeta->post_id != $post_id ) { + if ( ! $pmeta || (int) $pmeta->post_id !== $post_id ) { continue; } From 382211aef258a972d34beab0dc9f653db7dd5978 Mon Sep 17 00:00:00 2001 From: Joe Dolson <joedolson@git.wordpress.org> Date: Wed, 29 Jan 2025 17:38:49 +0000 Subject: [PATCH 257/323] Administration: Fix pagination in categories, tags, and plugins tables. Fix an issue introduced in [59134] that prevented manual entry of a page number in the pagination input field from navigating pages. Requiring validation of the bulk actions input also impacted other inputs nested in the same form. Also fixes a pre-existing bug where it was not possible to navigate to page 1 using the input field. Props ffffelix, im3dabasia1, apermo, rishavdutta, joedolson, swissspidy, jorbin, joedolson. Fixes #62534. git-svn-id: https://develop.svn.wordpress.org/trunk@59727 602fd350-edb4-49c9-b593-d223f7449a82 --- src/js/_enqueues/admin/common.js | 9 +++++++++ src/wp-admin/edit-tags.php | 3 +++ 2 files changed, 12 insertions(+) diff --git a/src/js/_enqueues/admin/common.js b/src/js/_enqueues/admin/common.js index 1aa35a37dba29..c7415d02c38da 100644 --- a/src/js/_enqueues/admin/common.js +++ b/src/js/_enqueues/admin/common.js @@ -1310,10 +1310,19 @@ $( function() { $document.trigger( 'wp-notice-added' ); }; + // Stores initial pagination value for comparison. + var initialPagedValue = document.querySelector( '#current-page-selector' ).value; + $( '.bulkactions' ).parents( 'form' ).on( 'submit', function( event ) { var form = this, submitterName = event.originalEvent && event.originalEvent.submitter ? event.originalEvent.submitter.name : false; + var currentPagedValue = form.querySelector( '#current-page-selector' ).value; + + if ( initialPagedValue !== currentPagedValue ) { + return; // Pagination form submission. + } + // Observe submissions from posts lists for 'bulk_action' or users lists for 'new_role'. var bulkFieldRelations = { 'bulk_action' : 'action', diff --git a/src/wp-admin/edit-tags.php b/src/wp-admin/edit-tags.php index a0a38d917d594..74381c0ec8d25 100644 --- a/src/wp-admin/edit-tags.php +++ b/src/wp-admin/edit-tags.php @@ -216,6 +216,9 @@ if ( $pagenum > 1 ) { $location = add_query_arg( 'paged', $pagenum, $location ); // $pagenum takes care of $total_pages. } + if ( 1 === $pagenum ) { + $location = remove_query_arg( 'paged', $location ); + } /** * Filters the taxonomy redirect destination URL. From 4863a926efbf210f0773b190d06765a5c731dfc3 Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Wed, 29 Jan 2025 18:10:47 +0000 Subject: [PATCH 258/323] Posts, Post Types: Add no-cache headers to password protected posts. This instructs an intermediate cache, for example a proxy server, to not cache a password protected post both before and after a visitor has entered a password. Props brevilo, haozi, ironprogrammer, narenin Fixes #61711 git-svn-id: https://develop.svn.wordpress.org/trunk@59728 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp.php | 5 +++ tests/phpunit/tests/wp/sendHeaders.php | 43 ++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/src/wp-includes/class-wp.php b/src/wp-includes/class-wp.php index ce88c102cfade..f2b114e708002 100644 --- a/src/wp-includes/class-wp.php +++ b/src/wp-includes/class-wp.php @@ -545,6 +545,11 @@ public function send_headers() { if ( $post && pings_open( $post ) ) { $headers['X-Pingback'] = get_bloginfo( 'pingback_url', 'display' ); } + + // Send nocache headers for password protected posts to avoid unwanted caching. + if ( ! empty( $post->post_password ) ) { + $headers = array_merge( $headers, wp_get_nocache_headers() ); + } } /** diff --git a/tests/phpunit/tests/wp/sendHeaders.php b/tests/phpunit/tests/wp/sendHeaders.php index b5fc56bf20e2a..4974d74caf8fc 100644 --- a/tests/phpunit/tests/wp/sendHeaders.php +++ b/tests/phpunit/tests/wp/sendHeaders.php @@ -6,6 +6,7 @@ * @covers WP::send_headers */ class Tests_WP_SendHeaders extends WP_UnitTestCase { + protected $headers_sent = array(); /** * @ticket 56068 @@ -35,4 +36,46 @@ function ( $headers ) { $post_id = self::factory()->post->create(); $this->go_to( get_permalink( $post_id ) ); } + + /** + * @ticket 61711 + */ + public function test_send_headers_sets_cache_control_header_for_password_protected_posts() { + $password = 'password'; + + add_filter( + 'wp_headers', + function ( $headers ) { + $this->headers_sent = $headers; + return $headers; + } + ); + + $post_id = self::factory()->post->create( + array( + 'post_password' => $password, + ) + ); + $this->go_to( get_permalink( $post_id ) ); + + $headers_without_password = $this->headers_sent; + $password_status_without_password = post_password_required( $post_id ); + + require_once ABSPATH . WPINC . '/class-phpass.php'; + + $hash = ( new PasswordHash( 8, true ) )->HashPassword( $password ); + + $_COOKIE[ 'wp-postpass_' . COOKIEHASH ] = $hash; + + $this->go_to( get_permalink( $post_id ) ); + + $headers_with_password = $this->headers_sent; + $password_status_with_password = post_password_required( $post_id ); + + $this->assertTrue( $password_status_without_password ); + $this->assertArrayHasKey( 'Cache-Control', $headers_without_password ); + + $this->assertFalse( $password_status_with_password ); + $this->assertArrayHasKey( 'Cache-Control', $headers_with_password ); + } } From 9acdbb9d8db4eba90d623eefd5ad312cde140593 Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Wed, 29 Jan 2025 18:17:34 +0000 Subject: [PATCH 259/323] Build/Test Tools: Add a retry mechanism for tests that perform external HTTP requests. While the `skipTestOnTimeout()` method will catch a timeout and prevent it from causing a test to fail, other errors such as a failed DNS lookup or HTTPS handshake can still cause a test to unnecessarily fail. This introduces a simple retry mechanism that will hopefully further reduce the flakiness of tests that perform HTTP API requests. Fixes #62830 git-svn-id: https://develop.svn.wordpress.org/trunk@59729 602fd350-edb4-49c9-b593-d223f7449a82 --- tests/phpunit/includes/abstract-testcase.php | 115 +++++++++++++++++++ tests/phpunit/tests/http/base.php | 69 ++++------- tests/phpunit/tests/http/functions.php | 27 ++--- tests/phpunit/tests/readme.php | 3 +- 4 files changed, 148 insertions(+), 66 deletions(-) diff --git a/tests/phpunit/includes/abstract-testcase.php b/tests/phpunit/includes/abstract-testcase.php index 224929eb377a8..b6c82cc066efd 100644 --- a/tests/phpunit/includes/abstract-testcase.php +++ b/tests/phpunit/includes/abstract-testcase.php @@ -1694,4 +1694,119 @@ public static function touch( $file ) { touch( $file ); } + + /** + * Wrapper for `wp_safe_remote_request()` that retries on error and skips the test on timeout. + * + * @param string $url URL to retrieve. + * @param array $args Optional. Request arguments. Default empty array. + * @return array|WP_Error The response or WP_Error on failure. + */ + protected function wp_safe_remote_request( $url, $args = array() ) { + return self::retry_on_error( 'wp_safe_remote_request', $url, $args ); + } + + /** + * Wrapper for `wp_safe_remote_get()` that retries on error and skips the test on timeout. + * + * @param string $url URL to retrieve. + * @param array $args Optional. Request arguments. Default empty array. + * @return array|WP_Error The response or WP_Error on failure. + */ + protected function wp_safe_remote_get( $url, $args = array() ) { + return self::retry_on_error( 'wp_safe_remote_get', $url, $args ); + } + + /** + * Wrapper for `wp_safe_remote_post()` that retries on error and skips the test on timeout. + * + * @param string $url URL to retrieve. + * @param array $args Optional. Request arguments. Default empty array. + * @return array|WP_Error The response or WP_Error on failure. + */ + protected function wp_safe_remote_post( $url, $args = array() ) { + return self::retry_on_error( 'wp_safe_remote_post', $url, $args ); + } + + /** + * Wrapper for `wp_safe_remote_head()` that retries on error and skips the test on timeout. + * + * @param string $url URL to retrieve. + * @param array $args Optional. Request arguments. Default empty array. + * @return array|WP_Error The response or WP_Error on failure. + */ + protected function wp_safe_remote_head( $url, $args = array() ) { + return self::retry_on_error( 'wp_safe_remote_head', $url, $args ); + } + + /** + * Wrapper for `wp_remote_request()` that retries on error and skips the test on timeout. + * + * @param string $url URL to retrieve. + * @param array $args Optional. Request arguments. Default empty array. + * @return array|WP_Error The response or WP_Error on failure. + */ + protected function wp_remote_request( $url, $args = array() ) { + return self::retry_on_error( 'wp_remote_request', $url, $args ); + } + + /** + * Wrapper for `wp_remote_get()` that retries on error and skips the test on timeout. + * + * @param string $url URL to retrieve. + * @param array $args Optional. Request arguments. Default empty array. + * @return array|WP_Error The response or WP_Error on failure. + */ + protected function wp_remote_get( $url, $args = array() ) { + return self::retry_on_error( 'wp_remote_get', $url, $args ); + } + + /** + * Wrapper for `wp_remote_post()` that retries on error and skips the test on timeout. + * + * @param string $url URL to retrieve. + * @param array $args Optional. Request arguments. Default empty array. + * @return array|WP_Error The response or WP_Error on failure. + */ + protected function wp_remote_post( $url, $args = array() ) { + return self::retry_on_error( 'wp_remote_post', $url, $args ); + } + + /** + * Wrapper for `wp_remote_head()` that retries on error and skips the test on timeout. + * + * @param string $url URL to retrieve. + * @param array $args Optional. Request arguments. Default empty array. + * @return array|WP_Error The response or WP_Error on failure. + */ + protected function wp_remote_head( $url, $args = array() ) { + return self::retry_on_error( 'wp_remote_head', $url, $args ); + } + + /** + * Retries an HTTP API request up to three times and skips the test on timeout. + * + * @param callable $callback The HTTP API request function to call. + * @param string $url URL to retrieve. + * @param array $args Request arguments. + * @return array|WP_Error The response or WP_Error on failure. + */ + private function retry_on_error( callable $callback, $url, $args ) { + $attempts = 0; + + while ( $attempts < 3 ) { + $result = call_user_func( $callback, $url, $args ); + + if ( ! is_wp_error( $result ) ) { + return $result; + } + + ++$attempts; + sleep( 5 ); + } + + $this->skipTestOnTimeout( $result ); + + return $result; + } } diff --git a/tests/phpunit/tests/http/base.php b/tests/phpunit/tests/http/base.php index 2e73b0de94431..49e4672ad2941 100644 --- a/tests/phpunit/tests/http/base.php +++ b/tests/phpunit/tests/http/base.php @@ -44,9 +44,8 @@ public function filter_http_request_args( array $args ) { */ public function test_redirect_on_301() { // 5 : 5 & 301. - $res = wp_remote_request( $this->redirection_script . '?code=301&rt=' . 5, array( 'redirection' => 5 ) ); + $res = $this->wp_remote_request( $this->redirection_script . '?code=301&rt=' . 5, array( 'redirection' => 5 ) ); - $this->skipTestOnTimeout( $res ); $this->assertNotWPError( $res ); $this->assertSame( 200, (int) $res['response']['code'] ); } @@ -56,9 +55,8 @@ public function test_redirect_on_301() { */ public function test_redirect_on_302() { // 5 : 5 & 302. - $res = wp_remote_request( $this->redirection_script . '?code=302&rt=' . 5, array( 'redirection' => 5 ) ); + $res = $this->wp_remote_request( $this->redirection_script . '?code=302&rt=' . 5, array( 'redirection' => 5 ) ); - $this->skipTestOnTimeout( $res ); $this->assertNotWPError( $res ); $this->assertSame( 200, (int) $res['response']['code'] ); } @@ -70,9 +68,8 @@ public function test_redirect_on_302() { */ public function test_redirect_on_301_no_redirect() { // 5 > 0 & 301. - $res = wp_remote_request( $this->redirection_script . '?code=301&rt=' . 5, array( 'redirection' => 0 ) ); + $res = $this->wp_remote_request( $this->redirection_script . '?code=301&rt=' . 5, array( 'redirection' => 0 ) ); - $this->skipTestOnTimeout( $res ); $this->assertNotWPError( $res ); $this->assertSame( 301, (int) $res['response']['code'] ); } @@ -84,9 +81,8 @@ public function test_redirect_on_301_no_redirect() { */ public function test_redirect_on_302_no_redirect() { // 5 > 0 & 302. - $res = wp_remote_request( $this->redirection_script . '?code=302&rt=' . 5, array( 'redirection' => 0 ) ); + $res = $this->wp_remote_request( $this->redirection_script . '?code=302&rt=' . 5, array( 'redirection' => 0 ) ); - $this->skipTestOnTimeout( $res ); $this->assertNotWPError( $res ); $this->assertSame( 302, (int) $res['response']['code'] ); } @@ -96,9 +92,8 @@ public function test_redirect_on_302_no_redirect() { */ public function test_redirections_equal() { // 5 - 5. - $res = wp_remote_request( $this->redirection_script . '?rt=' . 5, array( 'redirection' => 5 ) ); + $res = $this->wp_remote_request( $this->redirection_script . '?rt=' . 5, array( 'redirection' => 5 ) ); - $this->skipTestOnTimeout( $res ); $this->assertNotWPError( $res ); $this->assertSame( 200, (int) $res['response']['code'] ); } @@ -108,9 +103,8 @@ public function test_redirections_equal() { */ public function test_no_head_redirections() { // No redirections on HEAD request. - $res = wp_remote_request( $this->redirection_script . '?code=302&rt=' . 1, array( 'method' => 'HEAD' ) ); + $res = $this->wp_remote_request( $this->redirection_script . '?code=302&rt=' . 1, array( 'method' => 'HEAD' ) ); - $this->skipTestOnTimeout( $res ); $this->assertNotWPError( $res ); $this->assertSame( 302, (int) $res['response']['code'] ); } @@ -122,7 +116,7 @@ public function test_no_head_redirections() { */ public function test_redirect_on_head() { // Redirections on HEAD request when Requested. - $res = wp_remote_request( + $res = $this->wp_remote_request( $this->redirection_script . '?rt=' . 5, array( 'redirection' => 5, @@ -130,7 +124,6 @@ public function test_redirect_on_head() { ) ); - $this->skipTestOnTimeout( $res ); $this->assertNotWPError( $res ); $this->assertSame( 200, (int) $res['response']['code'] ); } @@ -140,9 +133,8 @@ public function test_redirect_on_head() { */ public function test_redirections_greater() { // 10 > 5. - $res = wp_remote_request( $this->redirection_script . '?rt=' . 10, array( 'redirection' => 5 ) ); + $res = $this->wp_remote_request( $this->redirection_script . '?rt=' . 10, array( 'redirection' => 5 ) ); - $this->skipTestOnTimeout( $res ); $this->assertWPError( $res ); } @@ -151,9 +143,8 @@ public function test_redirections_greater() { */ public function test_redirections_greater_edgecase() { // 6 > 5 (close edge case). - $res = wp_remote_request( $this->redirection_script . '?rt=' . 6, array( 'redirection' => 5 ) ); + $res = $this->wp_remote_request( $this->redirection_script . '?rt=' . 6, array( 'redirection' => 5 ) ); - $this->skipTestOnTimeout( $res ); $this->assertWPError( $res ); } @@ -162,9 +153,8 @@ public function test_redirections_greater_edgecase() { */ public function test_redirections_less_edgecase() { // 4 < 5 (close edge case). - $res = wp_remote_request( $this->redirection_script . '?rt=' . 4, array( 'redirection' => 5 ) ); + $res = $this->wp_remote_request( $this->redirection_script . '?rt=' . 4, array( 'redirection' => 5 ) ); - $this->skipTestOnTimeout( $res ); $this->assertNotWPError( $res ); } @@ -175,9 +165,8 @@ public function test_redirections_less_edgecase() { */ public function test_redirections_zero_redirections_specified() { // 0 redirections asked for, should return the document? - $res = wp_remote_request( $this->redirection_script . '?code=302&rt=' . 5, array( 'redirection' => 0 ) ); + $res = $this->wp_remote_request( $this->redirection_script . '?code=302&rt=' . 5, array( 'redirection' => 0 ) ); - $this->skipTestOnTimeout( $res ); $this->assertNotWPError( $res ); $this->assertSame( 302, (int) $res['response']['code'] ); } @@ -191,9 +180,8 @@ public function test_redirections_zero_redirections_specified() { */ public function test_location_header_on_201() { // Prints PASS on initial load, FAIL if the client follows the specified redirection. - $res = wp_remote_request( $this->redirection_script . '?201-location=true' ); + $res = $this->wp_remote_request( $this->redirection_script . '?201-location=true' ); - $this->skipTestOnTimeout( $res ); $this->assertNotWPError( $res ); $this->assertSame( 'PASS', $res['body'] ); } @@ -210,7 +198,7 @@ public function test_no_redirection_on_PUT() { $url = 'http://api.wordpress.org/core/tests/1.0/redirection.php?201-location=1'; // Test 301 - POST to POST. - $res = wp_remote_request( + $res = $this->wp_remote_request( $url, array( 'method' => 'PUT', @@ -218,7 +206,6 @@ public function test_no_redirection_on_PUT() { ) ); - $this->skipTestOnTimeout( $res ); $this->assertNotWPError( $res ); $this->assertSame( 'PASS', wp_remote_retrieve_body( $res ) ); $this->assertNotEmpty( $res['headers']['location'] ); @@ -236,9 +223,8 @@ public function test_send_headers() { 'test2' => 0, 'test3' => '', ); - $res = wp_remote_request( $this->redirection_script . '?header-check', array( 'headers' => $headers ) ); + $res = $this->wp_remote_request( $this->redirection_script . '?header-check', array( 'headers' => $headers ) ); - $this->skipTestOnTimeout( $res ); $this->assertNotWPError( $res ); $headers = array(); @@ -267,7 +253,7 @@ public function test_send_headers() { public function test_file_stream() { $url = $this->file_stream_url; $size = 153204; - $res = wp_remote_request( + $res = $this->wp_remote_request( $url, array( 'stream' => true, @@ -281,7 +267,6 @@ public function test_file_stream() { unlink( $res['filename'] ); } - $this->skipTestOnTimeout( $res ); $this->assertNotWPError( $res ); $this->assertSame( '', $res['body'] ); // The body should be empty. $this->assertEquals( $size, $res['headers']['Content-Length'] ); // Check the headers are returned (and the size is the same). @@ -297,7 +282,7 @@ public function test_file_stream() { public function test_file_stream_limited_size() { $url = $this->file_stream_url; $size = 10000; - $res = wp_remote_request( + $res = $this->wp_remote_request( $url, array( 'stream' => true, @@ -312,7 +297,6 @@ public function test_file_stream_limited_size() { unlink( $res['filename'] ); } - $this->skipTestOnTimeout( $res ); $this->assertNotWPError( $res ); $this->assertSame( $size, $filesize ); // Check that the file is written to disk correctly without any extra characters. } @@ -328,7 +312,7 @@ public function test_request_limited_size() { $url = $this->file_stream_url; $size = 10000; - $res = wp_remote_request( + $res = $this->wp_remote_request( $url, array( 'timeout' => 30, @@ -336,7 +320,6 @@ public function test_request_limited_size() { ) ); - $this->skipTestOnTimeout( $res ); $this->assertNotWPError( $res ); $this->assertSame( $size, strlen( $res['body'] ) ); } @@ -354,9 +337,8 @@ public function test_request_limited_size() { public function test_post_redirect_to_method_300( $response_code, $method ) { $url = 'http://api.wordpress.org/core/tests/1.0/redirection.php?post-redirect-to-method=1'; - $res = wp_remote_post( add_query_arg( 'response_code', $response_code, $url ), array( 'timeout' => 30 ) ); + $res = $this->wp_remote_post( add_query_arg( 'response_code', $response_code, $url ), array( 'timeout' => 30 ) ); - $this->skipTestOnTimeout( $res ); $this->assertNotWPError( $res ); $this->assertSame( $method, wp_remote_retrieve_body( $res ) ); } @@ -405,9 +387,8 @@ public function test_ip_url_with_host_header() { 'redirection' => 0, ); - $res = wp_remote_get( $url, $args ); + $res = $this->wp_remote_get( $url, $args ); - $this->skipTestOnTimeout( $res ); $this->assertNotWPError( $res ); $this->assertSame( 'PASS', wp_remote_retrieve_body( $res ) ); } @@ -427,11 +408,10 @@ public function test_https_url_without_ssl_verification() { add_filter( 'http_request_args', array( $this, 'filter_http_request_args' ) ); - $res = wp_remote_head( $url, $args ); + $res = $this->wp_remote_head( $url, $args ); remove_filter( 'http_request_args', array( $this, 'filter_http_request_args' ) ); - $this->skipTestOnTimeout( $res ); $this->assertNotEmpty( $this->http_request_args['sslcertificates'] ); $this->assertNotWPError( $res ); } @@ -447,9 +427,8 @@ public function test_https_url_without_ssl_verification() { public function test_cookie_handling() { $url = 'http://api.wordpress.org/core/tests/1.0/redirection.php?cookie-test=1'; - $res = wp_remote_get( $url ); + $res = $this->wp_remote_get( $url ); - $this->skipTestOnTimeout( $res ); $this->assertNotWPError( $res ); $this->assertSame( 'PASS', wp_remote_retrieve_body( $res ) ); } @@ -467,9 +446,8 @@ public function test_ssl() { $this->fail( 'This installation of PHP does not support SSL.' ); } - $res = wp_remote_get( 'https://wordpress.org/' ); + $res = $this->wp_remote_get( 'https://wordpress.org/' ); - $this->skipTestOnTimeout( $res ); $this->assertNotWPError( $res ); } @@ -484,9 +462,8 @@ public function test_url_with_double_slashes_path() { $path = parse_url( $url, PHP_URL_PATH ); $url = str_replace( $path, '/' . $path, $url ); - $res = wp_remote_request( $url ); + $res = $this->wp_remote_request( $url ); - $this->skipTestOnTimeout( $res ); $this->assertNotWPError( $res ); } } diff --git a/tests/phpunit/tests/http/functions.php b/tests/phpunit/tests/http/functions.php index 9c3e54a8b8911..96c6e4db2f496 100644 --- a/tests/phpunit/tests/http/functions.php +++ b/tests/phpunit/tests/http/functions.php @@ -12,9 +12,8 @@ class Tests_HTTP_Functions extends WP_UnitTestCase { public function test_head_request() { // This URL gives a direct 200 response. $url = 'https://s.w.org/screenshots/3.9/dashboard.png'; - $response = wp_remote_head( $url ); + $response = $this->wp_remote_head( $url ); - $this->skipTestOnTimeout( $response ); $this->assertNotWPError( $response ); $headers = wp_remote_retrieve_headers( $response ); @@ -31,9 +30,8 @@ public function test_head_request() { public function test_head_redirect() { // This URL will 301 redirect. $url = 'https://wp.org/screenshots/3.9/dashboard.png'; - $response = wp_remote_head( $url ); + $response = $this->wp_remote_head( $url ); - $this->skipTestOnTimeout( $response ); $this->assertNotWPError( $response ); $this->assertSame( 301, wp_remote_retrieve_response_code( $response ) ); } @@ -43,9 +41,8 @@ public function test_head_redirect() { */ public function test_head_404() { $url = 'https://wordpress.org/screenshots/3.9/awefasdfawef.jpg'; - $response = wp_remote_head( $url ); + $response = $this->wp_remote_head( $url ); - $this->skipTestOnTimeout( $response ); $this->assertNotWPError( $response ); $this->assertSame( 404, wp_remote_retrieve_response_code( $response ) ); } @@ -58,9 +55,8 @@ public function test_head_404() { public function test_get_request() { $url = 'https://s.w.org/screenshots/3.9/dashboard.png'; - $response = wp_remote_get( $url ); + $response = $this->wp_remote_get( $url ); - $this->skipTestOnTimeout( $response ); $this->assertNotWPError( $response ); $headers = wp_remote_retrieve_headers( $response ); @@ -80,9 +76,8 @@ public function test_get_redirect() { // This will redirect to wordpress.org. $url = 'https://wp.org/screenshots/3.9/dashboard.png'; - $response = wp_remote_get( $url ); + $response = $this->wp_remote_get( $url ); - $this->skipTestOnTimeout( $response ); $this->assertNotWPError( $response ); $headers = wp_remote_retrieve_headers( $response ); @@ -101,9 +96,8 @@ public function test_get_redirect_limit_exceeded() { $url = 'https://wp.org/screenshots/3.9/dashboard.png'; // Pretend we've already redirected 5 times. - $response = wp_remote_get( $url, array( 'redirection' => -1 ) ); + $response = $this->wp_remote_get( $url, array( 'redirection' => -1 ) ); - $this->skipTestOnTimeout( $response ); $this->assertWPError( $response ); } @@ -118,9 +112,8 @@ public function test_get_redirect_limit_exceeded() { public function test_get_response_cookies() { $url = 'https://login.wordpress.org/wp-login.php'; - $response = wp_remote_head( $url ); + $response = $this->wp_remote_head( $url ); - $this->skipTestOnTimeout( $response ); $this->assertNotWPError( $response ); $cookies = wp_remote_retrieve_cookies( $response ); @@ -152,7 +145,7 @@ public function test_get_response_cookies() { public function test_get_response_cookies_with_wp_http_cookie_object() { $url = 'https://login.wordpress.org/wp-login.php'; - $response = wp_remote_get( + $response = $this->wp_remote_get( $url, array( 'cookies' => array( @@ -166,7 +159,6 @@ public function test_get_response_cookies_with_wp_http_cookie_object() { ) ); - $this->skipTestOnTimeout( $response ); $this->assertNotWPError( $response ); $cookies = wp_remote_retrieve_cookies( $response ); @@ -189,7 +181,7 @@ public function test_get_response_cookies_with_wp_http_cookie_object() { public function test_get_response_cookies_with_name_value_array() { $url = 'https://login.wordpress.org/wp-login.php'; - $response = wp_remote_get( + $response = $this->wp_remote_get( $url, array( 'cookies' => array( @@ -198,7 +190,6 @@ public function test_get_response_cookies_with_name_value_array() { ) ); - $this->skipTestOnTimeout( $response ); $this->assertNotWPError( $response ); $cookies = wp_remote_retrieve_cookies( $response ); diff --git a/tests/phpunit/tests/readme.php b/tests/phpunit/tests/readme.php index 04faecbb368bf..85ffffcdf69e7 100644 --- a/tests/phpunit/tests/readme.php +++ b/tests/phpunit/tests/readme.php @@ -91,9 +91,8 @@ public function test_readme_mariadb_version() { * @return string The response body. */ public function get_response_body( $url ) { - $response = wp_remote_get( $url ); + $response = $this->wp_remote_get( $url ); - $this->skipTestOnTimeout( $response ); $this->assertNotWPError( $response ); $response_code = wp_remote_retrieve_response_code( $response ); From 3fd93789b81fb6ca7fdb5fb2794f41177c967bf4 Mon Sep 17 00:00:00 2001 From: Felix Arntz <flixos90@git.wordpress.org> Date: Wed, 29 Jan 2025 19:39:16 +0000 Subject: [PATCH 260/323] Editor: Relax restrictions around registration of block metadata collections. This changeset allows for block metadata collections to be registered for almost any source, such as MU plugins, themes, or custom directories with e.g. symlinked plugins or symlinked themes. Prior to the change, block metadata collections could only be registered for plugins and WordPress Core. There are still safeguards in place to prevent registration of collections in locations that would cause conflicts. For example, it is not possible to register a collection for the entire `wp-content/plugins` directory or the entire `wp-content/themes` directory, since such a collection would conflict with any specific plugin's or theme's collection. In case developers would like to enable this safeguard for their own custom directories, they can use the new `wp_allowed_block_metadata_collection_roots` filter. Props assassinateur, bowedk, desrosj, dougwollison, flixos90, glynnquelch, gziolo, jorbin, mreishus, swissspidy. Fixes #62140. git-svn-id: https://develop.svn.wordpress.org/trunk@59730 602fd350-edb4-49c9-b593-d223f7449a82 --- .../class-wp-block-metadata-registry.php | 131 ++++++++++++------ .../tests/blocks/wpBlockMetadataRegistry.php | 108 ++++++++++++++- 2 files changed, 190 insertions(+), 49 deletions(-) diff --git a/src/wp-includes/class-wp-block-metadata-registry.php b/src/wp-includes/class-wp-block-metadata-registry.php index 17bbf320d51b5..4b567d7d6f3bd 100644 --- a/src/wp-includes/class-wp-block-metadata-registry.php +++ b/src/wp-includes/class-wp-block-metadata-registry.php @@ -38,20 +38,12 @@ class WP_Block_Metadata_Registry { private static $last_matched_collection = null; /** - * Stores the WordPress 'wp-includes' directory path. + * Stores the default allowed collection root paths. * - * @since 6.7.0 - * @var string|null - */ - private static $wpinc_dir = null; - - /** - * Stores the normalized WordPress plugin directory path. - * - * @since 6.7.0 - * @var string|null + * @since 6.7.2 + * @var string[]|null */ - private static $plugin_dir = null; + private static $default_collection_roots = null; /** * Registers a block metadata collection. @@ -92,29 +84,50 @@ class WP_Block_Metadata_Registry { public static function register_collection( $path, $manifest ) { $path = wp_normalize_path( rtrim( $path, '/' ) ); - $wpinc_dir = self::get_wpinc_dir(); - $plugin_dir = self::get_plugin_dir(); + $collection_roots = self::get_default_collection_roots(); - // Check if the path is valid: - if ( str_starts_with( $path, $plugin_dir ) ) { - // For plugins, ensure the path is within a specific plugin directory and not the base plugin directory. - $relative_path = substr( $path, strlen( $plugin_dir ) + 1 ); - $plugin_name = strtok( $relative_path, '/' ); + /** + * Filters the root directory paths for block metadata collections. + * + * Any block metadata collection that is registered must not use any of these paths, or any parent directory + * path of them. Most commonly, block metadata collections should reside within one of these paths, though in + * some scenarios they may also reside in entirely different directories (e.g. in case of symlinked plugins). + * + * Example: + * * It is allowed to register a collection with path `WP_PLUGIN_DIR . '/my-plugin'`. + * * It is not allowed to register a collection with path `WP_PLUGIN_DIR`. + * * It is not allowed to register a collection with path `dirname( WP_PLUGIN_DIR )`. + * + * The default list encompasses the `wp-includes` directory, as well as the root directories for plugins, + * must-use plugins, and themes. This filter can be used to expand the list, e.g. to custom directories that + * contain symlinked plugins, so that these root directories cannot be used themselves for a block metadata + * collection either. + * + * @since 6.7.2 + * + * @param string[] $collection_roots List of allowed metadata collection root paths. + */ + $collection_roots = apply_filters( 'wp_allowed_block_metadata_collection_roots', $collection_roots ); - if ( empty( $plugin_name ) || $plugin_name === $relative_path ) { - _doing_it_wrong( - __METHOD__, - __( 'Block metadata collections can only be registered for a specific plugin. The provided path is neither a core path nor a valid plugin path.' ), - '6.7.0' - ); - return false; - } - } elseif ( ! str_starts_with( $path, $wpinc_dir ) ) { - // If it's neither a plugin directory path nor within 'wp-includes', the path is invalid. + $collection_roots = array_unique( + array_map( + static function ( $allowed_root ) { + return rtrim( $allowed_root, '/' ); + }, + $collection_roots + ) + ); + + // Check if the path is valid: + if ( ! self::is_valid_collection_path( $path, $collection_roots ) ) { _doing_it_wrong( __METHOD__, - __( 'Block metadata collections can only be registered for a specific plugin. The provided path is neither a core path nor a valid plugin path.' ), - '6.7.0' + sprintf( + /* translators: %s: list of allowed collection roots */ + __( 'Block metadata collections cannot be registered as one of the following directories or their parent directories: %s' ), + esc_html( implode( wp_get_list_item_separator(), $collection_roots ) ) + ), + '6.7.2' ); return false; } @@ -244,30 +257,58 @@ private static function default_identifier_callback( $path ) { } /** - * Gets the WordPress 'wp-includes' directory path. + * Checks whether the given block metadata collection path is valid against the list of collection roots. * - * @since 6.7.0 + * @since 6.7.2 * - * @return string The WordPress 'wp-includes' directory path. + * @param string $path Block metadata collection path, without trailing slash. + * @param string[] $collection_roots List of collection root paths, without trailing slashes. + * @return bool True if the path is allowed, false otherwise. */ - private static function get_wpinc_dir() { - if ( ! isset( self::$wpinc_dir ) ) { - self::$wpinc_dir = wp_normalize_path( ABSPATH . WPINC ); + private static function is_valid_collection_path( $path, $collection_roots ) { + foreach ( $collection_roots as $allowed_root ) { + // If the path matches any root exactly, it is invalid. + if ( $allowed_root === $path ) { + return false; + } + + // If the path is a parent path of any of the roots, it is invalid. + if ( str_starts_with( $allowed_root, $path ) ) { + return false; + } } - return self::$wpinc_dir; + + return true; } /** - * Gets the normalized WordPress plugin directory path. + * Gets the default collection root directory paths. * - * @since 6.7.0 + * @since 6.7.2 * - * @return string The normalized WordPress plugin directory path. + * @return string[] List of directory paths within which metadata collections are allowed. */ - private static function get_plugin_dir() { - if ( ! isset( self::$plugin_dir ) ) { - self::$plugin_dir = wp_normalize_path( WP_PLUGIN_DIR ); + private static function get_default_collection_roots() { + if ( isset( self::$default_collection_roots ) ) { + return self::$default_collection_roots; } - return self::$plugin_dir; + + $collection_roots = array( + wp_normalize_path( ABSPATH . WPINC ), + wp_normalize_path( WP_CONTENT_DIR ), + wp_normalize_path( WPMU_PLUGIN_DIR ), + wp_normalize_path( WP_PLUGIN_DIR ), + ); + + $theme_roots = get_theme_roots(); + if ( ! is_array( $theme_roots ) ) { + $theme_roots = array( $theme_roots ); + } + foreach ( $theme_roots as $theme_root ) { + $collection_roots[] = trailingslashit( wp_normalize_path( WP_CONTENT_DIR ) ) . ltrim( wp_normalize_path( $theme_root ), '/' ); + } + + self::$default_collection_roots = array_unique( $collection_roots ); + return self::$default_collection_roots; } } diff --git a/tests/phpunit/tests/blocks/wpBlockMetadataRegistry.php b/tests/phpunit/tests/blocks/wpBlockMetadataRegistry.php index 3f0ec006b0a0a..bc62131c6aea0 100644 --- a/tests/phpunit/tests/blocks/wpBlockMetadataRegistry.php +++ b/tests/phpunit/tests/blocks/wpBlockMetadataRegistry.php @@ -80,12 +80,112 @@ public function test_register_collection_with_invalid_plugin_path() { $this->assertFalse( $result, 'Invalid plugin path should not be registered' ); } - public function test_register_collection_with_non_existent_path() { - $non_existent_path = '/path/that/does/not/exist'; + /** + * @ticket 62140 + */ + public function test_register_collection_with_valid_muplugin_path() { + $plugin_path = WPMU_PLUGIN_DIR . '/my-plugin/blocks'; + $result = WP_Block_Metadata_Registry::register_collection( $plugin_path, $this->temp_manifest_file ); + $this->assertTrue( $result, 'Valid must-use plugin path should be registered successfully' ); + } + + /** + * @ticket 62140 + */ + public function test_register_collection_with_invalid_muplugin_path() { + $invalid_plugin_path = WPMU_PLUGIN_DIR; + + $this->setExpectedIncorrectUsage( 'WP_Block_Metadata_Registry::register_collection' ); + + $result = WP_Block_Metadata_Registry::register_collection( $invalid_plugin_path, $this->temp_manifest_file ); + $this->assertFalse( $result, 'Invalid must-use plugin path should not be registered' ); + } + + /** + * @ticket 62140 + */ + public function test_register_collection_with_valid_theme_path() { + $theme_path = WP_CONTENT_DIR . '/themes/my-theme/blocks'; + $result = WP_Block_Metadata_Registry::register_collection( $theme_path, $this->temp_manifest_file ); + $this->assertTrue( $result, 'Valid theme path should be registered successfully' ); + } + + /** + * @ticket 62140 + */ + public function test_register_collection_with_invalid_theme_path() { + $invalid_theme_path = WP_CONTENT_DIR . '/themes'; + + $this->setExpectedIncorrectUsage( 'WP_Block_Metadata_Registry::register_collection' ); + + $result = WP_Block_Metadata_Registry::register_collection( $invalid_theme_path, $this->temp_manifest_file ); + $this->assertFalse( $result, 'Invalid theme path should not be registered' ); + } + + /** + * @ticket 62140 + */ + public function test_register_collection_with_arbitrary_path() { + $arbitrary_path = '/var/arbitrary/path'; + $result = WP_Block_Metadata_Registry::register_collection( $arbitrary_path, $this->temp_manifest_file ); + $this->assertTrue( $result, 'Arbitrary path should be registered successfully' ); + } + + /** + * @ticket 62140 + */ + public function test_register_collection_with_arbitrary_path_and_collection_roots_filter() { + $arbitrary_path = '/var/arbitrary/path'; + add_filter( + 'wp_allowed_block_metadata_collection_roots', + static function ( $paths ) use ( $arbitrary_path ) { + $paths[] = $arbitrary_path; + return $paths; + } + ); + + $this->setExpectedIncorrectUsage( 'WP_Block_Metadata_Registry::register_collection' ); + + $result = WP_Block_Metadata_Registry::register_collection( $arbitrary_path, $this->temp_manifest_file ); + $this->assertFalse( $result, 'Arbitrary path should not be registered if it matches a collection root' ); + + $result = WP_Block_Metadata_Registry::register_collection( dirname( $arbitrary_path ), $this->temp_manifest_file ); + $this->assertFalse( $result, 'Arbitrary path should not be registered if it is a parent directory of a collection root' ); + + $result = WP_Block_Metadata_Registry::register_collection( $arbitrary_path . '/my-plugin/blocks', $this->temp_manifest_file ); + $this->assertTrue( $result, 'Arbitrary path should be registered successfully if it is within a collection root' ); + } + + /** + * @ticket 62140 + */ + public function test_register_collection_with_wp_content_parent_directory_path() { + $invalid_path = dirname( WP_CONTENT_DIR ); + + $this->setExpectedIncorrectUsage( 'WP_Block_Metadata_Registry::register_collection' ); + + $result = WP_Block_Metadata_Registry::register_collection( $invalid_path, $this->temp_manifest_file ); + $this->assertFalse( $result, 'Invalid path (parent directory of "wp-content") should not be registered' ); + } + + /** + * @ticket 62140 + */ + public function test_register_collection_with_wp_includes_parent_directory_path() { + $invalid_path = ABSPATH; + + $this->setExpectedIncorrectUsage( 'WP_Block_Metadata_Registry::register_collection' ); + + $result = WP_Block_Metadata_Registry::register_collection( $invalid_path, $this->temp_manifest_file ); + $this->assertFalse( $result, 'Invalid path (parent directory of "wp-includes") should not be registered' ); + } + + public function test_register_collection_with_non_existent_manifest() { + $non_existent_manifest = '/path/that/does/not/exist/block-manifest.php'; $this->setExpectedIncorrectUsage( 'WP_Block_Metadata_Registry::register_collection' ); - $result = WP_Block_Metadata_Registry::register_collection( $non_existent_path, $this->temp_manifest_file ); - $this->assertFalse( $result, 'Non-existent path should not be registered' ); + $result = WP_Block_Metadata_Registry::register_collection( '/var/arbitrary/path', $non_existent_manifest ); + $this->assertFalse( $result, 'Non-existent manifest should not be registered' ); } } From 490b4a3a6c0d3a7ea57e8d00e800984e82c40f4a Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Wed, 29 Jan 2025 21:33:09 +0000 Subject: [PATCH 261/323] Privacy: Replace Policy Name with an auto increment to avoid internationalized plugin name issues. This changeset replaces plugin sanitized names with an auto increment integer to fix an issue with accordions displaying privacy policies for plugins with special characters in their names. Follow-up to [50161]. Props ecgan, sabernhardt, audrasjb. Fixes #62713. git-svn-id: https://develop.svn.wordpress.org/trunk@59732 602fd350-edb4-49c9-b593-d223f7449a82 --- .../includes/class-wp-privacy-policy-content.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/wp-admin/includes/class-wp-privacy-policy-content.php b/src/wp-admin/includes/class-wp-privacy-policy-content.php index 724a0dcf64a99..78669c73519d4 100644 --- a/src/wp-admin/includes/class-wp-privacy-policy-content.php +++ b/src/wp-admin/includes/class-wp-privacy-policy-content.php @@ -381,7 +381,11 @@ public static function privacy_policy_guide() { $content = ''; $date_format = __( 'F j, Y' ); + $i = 0; + foreach ( $content_array as $section ) { + ++$i; + $class = ''; $meta = ''; $removed = ''; @@ -409,11 +413,9 @@ public static function privacy_policy_guide() { } $plugin_name = esc_html( $section['plugin_name'] ); - - $sanitized_policy_name = sanitize_title_with_dashes( $plugin_name ); ?> <h4 class="privacy-settings-accordion-heading"> - <button aria-expanded="false" class="privacy-settings-accordion-trigger" aria-controls="privacy-settings-accordion-block-<?php echo $sanitized_policy_name; ?>" type="button"> + <button aria-expanded="false" class="privacy-settings-accordion-trigger" aria-controls="privacy-settings-accordion-block-<?php echo $i; ?>" type="button"> <span class="title"><?php echo $plugin_name; ?></span> <?php if ( ! empty( $section['removed'] ) || ! empty( $section['updated'] ) ) : ?> <span class="badge <?php echo $badge_class; ?>"> <?php echo $badge_title; ?></span> @@ -421,7 +423,7 @@ public static function privacy_policy_guide() { <span class="icon"></span> </button> </h4> - <div id="privacy-settings-accordion-block-<?php echo $sanitized_policy_name; ?>" class="privacy-settings-accordion-panel privacy-text-box-body" hidden="hidden"> + <div id="privacy-settings-accordion-block-<?php echo $i; ?>" class="privacy-settings-accordion-panel privacy-text-box-body" hidden="hidden"> <?php echo $removed; echo $section['policy_text']; From 95247e36790261f3a41d9c9bd19fb671a3571d44 Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Wed, 29 Jan 2025 21:52:54 +0000 Subject: [PATCH 262/323] Coding standards: Remove unused variables from `privacy_policy_guide()` function. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59733 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/class-wp-privacy-policy-content.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/wp-admin/includes/class-wp-privacy-policy-content.php b/src/wp-admin/includes/class-wp-privacy-policy-content.php index 78669c73519d4..16fe3a689a0b9 100644 --- a/src/wp-admin/includes/class-wp-privacy-policy-content.php +++ b/src/wp-admin/includes/class-wp-privacy-policy-content.php @@ -378,7 +378,6 @@ public static function notice( $post = null ) { public static function privacy_policy_guide() { $content_array = self::get_suggested_policy_text(); - $content = ''; $date_format = __( 'F j, Y' ); $i = 0; @@ -386,10 +385,7 @@ public static function privacy_policy_guide() { foreach ( $content_array as $section ) { ++$i; - $class = ''; - $meta = ''; $removed = ''; - if ( ! empty( $section['removed'] ) ) { $badge_class = ' red'; $date = date_i18n( $date_format, $section['removed'] ); From d11377e16ea0a1ec302fa4acf0b3bc788716223d Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Wed, 29 Jan 2025 23:13:17 +0000 Subject: [PATCH 263/323] Docs: Improve docblock for `rest_menu_read_access` filter. Follow-up to [59718]. See #62281, #54304. git-svn-id: https://develop.svn.wordpress.org/trunk@59734 602fd350-edb4-49c9-b593-d223f7449a82 --- .../endpoints/class-wp-rest-menu-items-controller.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php index 08d21fd090bc2..4851196b41025 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php @@ -84,9 +84,11 @@ protected function check_has_read_only_access( $request ) { * Filters whether the current user has read access to menu items via the REST API. * * @since 6.8.0 - * @param $read_only_access bool Whether the current user has read access to menu items via the REST API. - * @param $request WP_REST_Request Full details about the request. - * @param $this WP_REST_Controller The current instance of the controller. + * + * @param bool $read_only_access Whether the current user has read access to menu items + * via the REST API. + * @param WP_REST_Request $request Full details about the request. + * @param WP_REST_Controller $this The current instance of the controller. */ $read_only_access = apply_filters( 'rest_menu_read_access', false, $request, $this ); if ( $read_only_access ) { From 01e553b0b691d01a122d49af6240c4fe506e5ea9 Mon Sep 17 00:00:00 2001 From: Peter Wilson <peterwilsoncc@git.wordpress.org> Date: Thu, 30 Jan 2025 00:00:18 +0000 Subject: [PATCH 264/323] Options/Meta APIs: Rename `setted_(site_)_transient` to `set_...`. Deprecate the actions `setted_transient` and `setted_site_transient` in favour of `set_transient` and `set_site_transient` respectively. This serves two purposes, the name is consistent with the transient specific actions `set_(site_)_transient_{$transient}`, and to make the names grammatically correct. Props sukhendu2002, swissspidy, johnbillion, peterwilsoncc. Fixes #62849. git-svn-id: https://develop.svn.wordpress.org/trunk@59735 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/option.php | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/option.php b/src/wp-includes/option.php index 4b26504b76356..8114b51bc7499 100644 --- a/src/wp-includes/option.php +++ b/src/wp-includes/option.php @@ -1596,14 +1596,26 @@ function set_transient( $transient, $value, $expiration = 0 ) { /** * Fires after the value for a transient has been set. * + * @since 6.8.0 + * + * @param string $transient The name of the transient. + * @param mixed $value Transient value. + * @param int $expiration Time until expiration in seconds. + */ + do_action( 'set_transient', $transient, $value, $expiration ); + + /** + * Fires after the transient is set. + * * @since 3.0.0 * @since 3.6.0 The `$value` and `$expiration` parameters were added. + * @deprecated 6.8.0 Use {@see 'set_transient'} instead. * * @param string $transient The name of the transient. * @param mixed $value Transient value. * @param int $expiration Time until expiration in seconds. */ - do_action( 'setted_transient', $transient, $value, $expiration ); + do_action_deprecated( 'setted_transient', array( $transient, $value, $expiration ), '6.8.0', 'set_transient' ); } return $result; @@ -2673,16 +2685,28 @@ function set_site_transient( $transient, $value, $expiration = 0 ) { */ do_action( "set_site_transient_{$transient}", $value, $expiration, $transient ); + /** + * Fires after the value for a site transient has been set. + * + * @since 6.8.0 + * + * @param string $transient The name of the site transient. + * @param mixed $value Site transient value. + * @param int $expiration Time until expiration in seconds. + */ + do_action( 'set_site_transient', $transient, $value, $expiration ); + /** * Fires after the value for a site transient has been set. * * @since 3.0.0 + * @deprecated 6.8.0 Use {@see 'set_site_transient'} instead. * * @param string $transient The name of the site transient. * @param mixed $value Site transient value. * @param int $expiration Time until expiration in seconds. */ - do_action( 'setted_site_transient', $transient, $value, $expiration ); + do_action_deprecated( 'setted_site_transient', array( $transient, $value, $expiration ), '6.8.0', 'set_site_transient' ); } return $result; From 23a215a4d023e5226dbf44b933385f2f16f8d46b Mon Sep 17 00:00:00 2001 From: Joe Dolson <joedolson@git.wordpress.org> Date: Thu, 30 Jan 2025 03:54:06 +0000 Subject: [PATCH 265/323] Accessibility: Add invalid password message for post passwords. Display a message notifying the user of an incorrect password when submitting the post password form. Improve the accessibility of the form by adding a required attribute for consistent identification. Props henry.wright, jonnyauk, kreppar, tommusrhodus, joedolson, audrasjb, jdahir0789, parthvataliya, dhruvang21. Fixes #37332. git-svn-id: https://develop.svn.wordpress.org/trunk@59736 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post-template.php | 34 ++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/src/wp-includes/post-template.php b/src/wp-includes/post-template.php index ffcca1647d326..23dbd2c1eee51 100644 --- a/src/wp-includes/post-template.php +++ b/src/wp-includes/post-template.php @@ -1774,11 +1774,33 @@ function prepend_attachment( $content ) { * @return string HTML content for password form for password protected post. */ function get_the_password_form( $post = 0 ) { - $post = get_post( $post ); - $label = 'pwbox-' . ( empty( $post->ID ) ? rand() : $post->ID ); - $output = '<form action="' . esc_url( site_url( 'wp-login.php?action=postpass', 'login_post' ) ) . '" class="post-password-form" method="post"> + $post = get_post( $post ); + $field_id = 'pwbox-' . ( empty( $post->ID ) ? wp_rand() : $post->ID ); + $invalid_password = ''; + $invalid_password_html = ''; + $aria = ''; + $class = ''; + + // If the referrer is the same as the current request, the user has entered an invalid password. + if ( ! empty( $post->ID ) && wp_get_raw_referer() === get_permalink( $post->ID ) && isset( $_COOKIE[ 'wp-postpass_' . COOKIEHASH ] ) ) { + /** + * Filters the invalid password message shown on password-protected posts. + * The filter is only applied if the post is password protected. + * + * @since 6.8.0 + * + * @param string The message shown to users when entering an invalid password. + * @param WP_Post $post Post object. + */ + $invalid_password = apply_filters( 'the_password_form_incorrect_password', __( 'Invalid password.' ), $post ); + $invalid_password_html = '<div class="post-password-form-invalid-password" role="alert"><p id="error-' . $field_id . '">' . $invalid_password . '</p></div>'; + $aria = ' aria-describedby="error-' . $field_id . '"'; + $class = ' password-form-error'; + } + + $output = '<form action="' . esc_url( site_url( 'wp-login.php?action=postpass', 'login_post' ) ) . '" class="post-password-form' . $class . '" method="post">' . $invalid_password_html . ' <p>' . __( 'This content is password protected. To view it please enter your password below:' ) . '</p> - <p><label for="' . $label . '">' . __( 'Password:' ) . ' <input name="post_password" id="' . $label . '" type="password" spellcheck="false" size="20" /></label> <input type="submit" name="Submit" value="' . esc_attr_x( 'Enter', 'post password form' ) . '" /></p></form> + <p><label for="' . $field_id . '">' . __( 'Password:' ) . ' <input name="post_password" id="' . $field_id . '" type="password" spellcheck="false" required size="20"' . $aria . ' /></label> <input type="submit" name="Submit" value="' . esc_attr_x( 'Enter', 'post password form' ) . '" /></p></form> '; /** @@ -1791,11 +1813,13 @@ function get_the_password_form( $post = 0 ) { * * @since 2.7.0 * @since 5.8.0 Added the `$post` parameter. + * @since 6.8.0 Added the `$invalid_password` parameter. * * @param string $output The password form HTML output. * @param WP_Post $post Post object. + * @param string $invalid_password The invalid password message. */ - return apply_filters( 'the_password_form', $output, $post ); + return apply_filters( 'the_password_form', $output, $post, $invalid_password ); } /** From 21be4bc5f1e5af7c96c25d13315a9bf578b4aea7 Mon Sep 17 00:00:00 2001 From: Joe Dolson <joedolson@git.wordpress.org> Date: Thu, 30 Jan 2025 04:06:16 +0000 Subject: [PATCH 266/323] Docs: Add missing `$text` filter argument. Fix omitted filter argument variable name for `the_password_form_incorrect_password`. Follow up to [59736]. Props mukesh27, joedolson. See #37332. git-svn-id: https://develop.svn.wordpress.org/trunk@59737 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post-template.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/post-template.php b/src/wp-includes/post-template.php index 23dbd2c1eee51..598ea3d60865d 100644 --- a/src/wp-includes/post-template.php +++ b/src/wp-includes/post-template.php @@ -1789,8 +1789,8 @@ function get_the_password_form( $post = 0 ) { * * @since 6.8.0 * - * @param string The message shown to users when entering an invalid password. - * @param WP_Post $post Post object. + * @param string $text The message shown to users when entering an invalid password. + * @param WP_Post $post Post object. */ $invalid_password = apply_filters( 'the_password_form_incorrect_password', __( 'Invalid password.' ), $post ); $invalid_password_html = '<div class="post-password-form-invalid-password" role="alert"><p id="error-' . $field_id . '">' . $invalid_password . '</p></div>'; From 6b41380785d2a4d62524800afce23fd921fe214f Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Thu, 30 Jan 2025 11:20:58 +0000 Subject: [PATCH 267/323] Coding Standards: Use strict comparison in `wp_xmlrpc_server::wp_getUsersBlogs()`. Includes a micro-optimization to avoid calling `get_current_network_id()` in a loop. Follow-up to [8075], [9798], [26120], [38814]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59738 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-xmlrpc-server.php | 9 ++++++--- src/wp-includes/ms-functions.php | 6 +++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index a342ce5f2f6ff..81dc57f7d1e15 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -735,17 +735,20 @@ public function wp_getUsersBlogs( $args ) { */ do_action( 'xmlrpc_call', 'wp.getUsersBlogs', $args, $this ); - $blogs = (array) get_blogs_of_user( $user->ID ); - $struct = array(); + $blogs = (array) get_blogs_of_user( $user->ID ); + $struct = array(); + $primary_blog_id = 0; $active_blog = get_active_blog_for_user( $user->ID ); if ( $active_blog ) { $primary_blog_id = (int) $active_blog->blog_id; } + $current_network_id = get_current_network_id(); + foreach ( $blogs as $blog ) { // Don't include blogs that aren't hosted at this site. - if ( get_current_network_id() != $blog->site_id ) { + if ( $blog->site_id !== $current_network_id ) { continue; } diff --git a/src/wp-includes/ms-functions.php b/src/wp-includes/ms-functions.php index 77603313b2a2f..404eb1497a7cc 100644 --- a/src/wp-includes/ms-functions.php +++ b/src/wp-includes/ms-functions.php @@ -76,9 +76,12 @@ function get_active_blog_for_user( $user_id ) { ) { $blogs = get_blogs_of_user( $user_id, true ); // If a user's primary blog is shut down, check their other blogs. $ret = false; + if ( is_array( $blogs ) && count( $blogs ) > 0 ) { + $current_network_id = get_current_network_id(); + foreach ( (array) $blogs as $blog_id => $blog ) { - if ( get_current_network_id() !== $blog->site_id ) { + if ( $blog->site_id !== $current_network_id ) { continue; } @@ -99,6 +102,7 @@ function get_active_blog_for_user( $user_id ) { } else { return; } + return $ret; } else { return $primary; From 439b172d9268a0020e6624bb12d230210b2de9b9 Mon Sep 17 00:00:00 2001 From: Aaron Jorbin <jorbin@git.wordpress.org> Date: Thu, 30 Jan 2025 17:53:00 +0000 Subject: [PATCH 268/323] Build/Test: Update assertions in AtomParser_Parse_Test::test_parse_sets_handlers On some instances of Windows, the assertions seem to find additional nodes. As this test is just about verifying that the handlers get called, not about testing the functionality of the handlers, we can adjust the assertion to look for a minimum number of nodes rather than exact number. Follow-up to [59062]. Props yogeshbhutkar, hellofromTonya, SergeyBiryukov, coquardcyr, jrf, benniledl, desrosj, jorbin. Fixes #62110. See #62061. git-svn-id: https://develop.svn.wordpress.org/trunk@59739 602fd350-edb4-49c9-b593-d223f7449a82 --- tests/phpunit/tests/atomlib/AtomParser_Parse_Test.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/phpunit/tests/atomlib/AtomParser_Parse_Test.php b/tests/phpunit/tests/atomlib/AtomParser_Parse_Test.php index 38ea2d07940f8..6c66b5e9912aa 100644 --- a/tests/phpunit/tests/atomlib/AtomParser_Parse_Test.php +++ b/tests/phpunit/tests/atomlib/AtomParser_Parse_Test.php @@ -68,8 +68,8 @@ public function _default( $parser, $data ) { $this->assertSame( 28, $atom->start_element_call_counter, sprintf( $msg, 'start_element' ) ); $this->assertSame( 28, $atom->end_element_call_counter, sprintf( $msg, 'end_element' ) ); $this->assertSame( 2, $atom->start_ns_call_counter, sprintf( $msg, 'start_ns' ) ); - $this->assertSame( 0, $atom->end_ns_call_counter, sprintf( $msg, 'end_ns' ) ); - $this->assertSame( 57, $atom->cdata_call_counter, sprintf( $msg, 'cdata' ) ); - $this->assertSame( 2, $atom->default_call_counter, sprintf( $msg, '_default' ) ); + $this->assertGreaterThanOrEqual( 0, $atom->end_ns_call_counter, sprintf( $msg, 'end_ns' ) ); + $this->assertGreaterThanOrEqual( 57, $atom->cdata_call_counter, sprintf( $msg, 'cdata' ) ); + $this->assertGreaterThanOrEqual( 2, $atom->default_call_counter, sprintf( $msg, '_default' ) ); } } From 6db1a334029478c96fd380d4ba96d1d48ef55da3 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Thu, 30 Jan 2025 18:51:17 +0000 Subject: [PATCH 269/323] Security: Introduce Grunt task for updating Root Certificates. The Root Certificate bundle maintained by Mozilla ships in WordPress to allow SSL certificates to be verified on hosts with incomplete, outdated, or invalid local SSL configurations. To date, updates have only been merged into Core when problems arise using a highly manual process. This introduces the `certificates:upgrade` Grunt task to automate the process of updating the included bundle with upstream changes using Composer to manage versioning. The legacy 1024bit certificates included for backwards compatibility are now maintained in a separate file that is prepended to the built version of the bundle during the relevant Grunt tasks. Some expired certificates from this list have been removed: - Cybertrust Global Root (expired 2021-12-15) - Thawte Server CA (expired 2020-12-31) - Thawte Premium Server CA (expired 2020-12-31) The Dependabot configuration has also been updated to open pull requests when new releases occur upstream. Going forward, the recommendation is to create a task ticket for updating these certificates with each release when an update is published. See #62811 for an example of this. Props johnbillion, desrosj, whyisjake, ayeshrajans, SergeyBiryukov, swissspidy, skithund, barry. Fixes #62812. See #62811, 50828. git-svn-id: https://develop.svn.wordpress.org/trunk@59740 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/dependabot.yml | 17 + Gruntfile.js | 46 + composer.json | 1 + src/wp-includes/certificates/ca-bundle.crt | 2436 +++++------ src/wp-includes/certificates/cacert.pem | 3611 +++++++++++++++++ .../certificates/legacy-1024bit.pem | 58 + 6 files changed, 4977 insertions(+), 1192 deletions(-) create mode 100644 src/wp-includes/certificates/cacert.pem create mode 100644 src/wp-includes/certificates/legacy-1024bit.pem diff --git a/.github/dependabot.yml b/.github/dependabot.yml index f7e6153cdd677..ae57ff89067f1 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -12,3 +12,20 @@ updates: github-actions: patterns: - "*" + + # Check for updates to Composer packages. + - package-ecosystem: "composer" + directory: "/" + schedule: + interval: "daily" + open-pull-requests-limit: 10 + ignore: + # These dependencies do not currently need to be managed with Dependabot. + - dependency-name: "squizlabs/php_codesniffer" + - dependency-name: "wp-coding-standards/wpcs" + - dependency-name: "phpcompatibility/php-compatibility" + - dependency-name: "yoast/phpunit-polyfills" + groups: + composer-packages: + patterns: + - "composer/ca-bundle" diff --git a/Gruntfile.js b/Gruntfile.js index 10b3bcfbabb8d..1b58ac12b1256 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -211,6 +211,8 @@ module.exports = function(grunt) { src: buildFiles.concat( [ '!wp-includes/assets/**', // Assets is extracted into separate copy tasks. '!js/**', // JavaScript is extracted into separate copy tasks. + '!wp-includes/certificates/cacert.pem*', // Exclude raw root certificate files that are combined into ca-bundle.crt. + '!wp-includes/certificates/legacy-1024bit.pem', '!.{svn,git}', // Exclude version control folders. '!wp-includes/version.php', // Exclude version.php. '!**/*.map', // The build doesn't need .map files. @@ -478,6 +480,10 @@ module.exports = function(grunt) { }, src: '.github/workflows/*.yml', dest: './' + }, + certificates: { + src: 'vendor/composer/ca-bundle/res/cacert.pem', + dest: SOURCE_DIR + 'wp-includes/certificates/cacert.pem' } }, sass: { @@ -859,6 +865,16 @@ module.exports = function(grunt) { WORKING_DIR + 'wp-includes/js/wp-emoji.min.js' ], dest: WORKING_DIR + 'wp-includes/js/wp-emoji-release.min.js' + }, + certificates: { + options: { + separator: '\n\n' + }, + src: [ + SOURCE_DIR + 'wp-includes/certificates/legacy-1024bit.pem', + SOURCE_DIR + 'wp-includes/certificates/cacert.pem' + ], + dest: SOURCE_DIR + 'wp-includes/certificates/ca-bundle.crt' } }, patch:{ @@ -1528,6 +1544,34 @@ module.exports = function(grunt) { 'usebanner' ] ); + grunt.registerTask( 'certificates:update', 'Updates the Composer package responsible for root certificate updates.', function() { + var done = this.async(); + var flags = this.flags; + var args = [ 'update' ]; + + grunt.util.spawn( { + cmd: 'composer', + args: args, + opts: { stdio: 'inherit' } + }, function( error ) { + if ( flags.error && error ) { + done( false ); + } else { + done( true ); + } + } ); + } ); + + grunt.registerTask( 'build:certificates', [ + 'concat:certificates' + ] ); + + grunt.registerTask( 'certificates:upgrade', [ + 'certificates:update', + 'copy:certificates', + 'build:certificates' + ] ); + grunt.registerTask( 'build:files', [ 'clean:files', 'copy:files', @@ -1655,9 +1699,11 @@ module.exports = function(grunt) { grunt.task.run( [ 'build:js', 'build:css', + 'build:certificates' ] ); } else { grunt.task.run( [ + 'build:certificates', 'build:files', 'build:js', 'build:css', diff --git a/composer.json b/composer.json index eb78d144e590c..aea6ea7a42648 100644 --- a/composer.json +++ b/composer.json @@ -17,6 +17,7 @@ "ext-dom": "*" }, "require-dev": { + "composer/ca-bundle": "1.5.5", "squizlabs/php_codesniffer": "3.10.3", "wp-coding-standards/wpcs": "~3.1.0", "phpcompatibility/phpcompatibility-wp": "~2.1.3", diff --git a/src/wp-includes/certificates/ca-bundle.crt b/src/wp-includes/certificates/ca-bundle.crt index c8a4358d3eb5f..0fec8fd07957d 100644 --- a/src/wp-includes/certificates/ca-bundle.crt +++ b/src/wp-includes/certificates/ca-bundle.crt @@ -1,86 +1,10 @@ ## ## Bundle of CA Root Certificates ## -## Certificate data from Mozilla as of: Wed Jul 22 03:12:14 2020 GMT -## Includes a WordPress Modification - We include the 'legacy' 1024bit certificates +## WordPress Modification - We prepend some unexpired 'legacy' 1024bit certificates ## for backward compatibility. See https://core.trac.wordpress.org/ticket/34935#comment:10 ## -## This is a bundle of X.509 certificates of public Certificate Authorities -## (CA). These were automatically extracted from Mozilla's root certificates -## file (certdata.txt). This file can be found in the mozilla source tree: -## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt -## -## It contains the certificates in PEM format and therefore -## can be directly used with curl / libcurl / php_curl, or with -## an Apache+mod_ssl webserver for SSL client authentication. -## Just configure this file as the SSLCACertificateFile. -## -## Conversion done with mk-ca-bundle.pl version 1.27. -## SHA256: fffa309937c3be940649293f749b8207fabc6eb224e50e4bb3f2c5e44e0d6a6b -## -EE Certification Centre Root CA -=============================== ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG -EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy -dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw -MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB -UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy -ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM -TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 -rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw -93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN -P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ -MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF -BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj -xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM -lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU -3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM -dcGWxZ0= ------END CERTIFICATE----- - -Thawte Server CA -================ ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE -AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j -b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV -BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u -c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG -A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 -ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl -/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 -1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR -MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J -GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ -GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -Thawte Premium Server CA -======================== ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE -AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl -ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT -AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU -VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 -aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ -cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 -aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh -Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ -qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm -SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf -8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t -UCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority ======================================================= @@ -117,59 +41,6 @@ MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 -----END CERTIFICATE----- -America Online Root Certification Authority 1 -============================================= ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG -v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z -DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh -sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP -8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z -o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf -GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF -VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft -3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g -Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- - -America Online Root Certification Authority 2 -============================================= ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en -fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 -f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO -qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN -RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 -gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn -6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid -FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 -Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj -B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op -aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY -T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p -+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg -JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy -zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO -ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh -1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf -GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff -Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP -cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= ------END CERTIFICATE----- - Verisign Class 3 Public Primary Certification Authority ======================================================= -----BEGIN CERTIFICATE----- @@ -186,6 +57,29 @@ bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ D/xwzoiQ -----END CERTIFICATE----- + +## +## Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Tue Dec 31 04:12:05 2024 GMT +## +## Find updated versions here: https://curl.se/docs/caextract.html +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## +## Conversion done with mk-ca-bundle.pl version 1.29. +## SHA256: c99d6d3f8d3d4e47719ba2b648992f5b58b150128d3aca3c05c566d8dc98e116 +## + + GlobalSign Root CA ================== -----BEGIN CERTIFICATE----- @@ -207,52 +101,6 @@ hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- -GlobalSign Root CA - R2 -======================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 -ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp -s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN -S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL -TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C -ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i -YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN -BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp -9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu -01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 -9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 -EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc -cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw -EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj -055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f -j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 -xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa -t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - Entrust.net Premium 2048 Secure Server CA ========================================= -----BEGIN CERTIFICATE----- @@ -324,87 +172,6 @@ W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- -GeoTrust Global CA -================== ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw -MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo -BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet -8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc -T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU -vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk -DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q -zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 -d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 -mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p -XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm -Mw== ------END CERTIFICATE----- - -GeoTrust Universal CA -===================== ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 -MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu -Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t -JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e -RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs -7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d -8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V -qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga -Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB -Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu -KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 -ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 -XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB -hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 -qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL -oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK -xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF -KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 -DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK -xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU -p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI -P/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -GeoTrust Universal CA 2 -======================= ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 -MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg -SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 -DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 -j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q -JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a -QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 -WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP -20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn -ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC -SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG -8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 -+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E -BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ -4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ -mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq -A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg -Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP -pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d -FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp -gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm -X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - Comodo AAA Services root ======================== -----BEGIN CERTIFICATE----- @@ -429,38 +196,6 @@ Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- -QuoVadis Root CA -================ ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE -ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz -MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp -cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD -EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk -J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL -F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL -YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen -AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w -PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y -ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 -MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj -YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs -ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW -Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu -BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw -FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 -tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo -fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul -LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x -gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi -5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi -5nrQNiOKSnQ2+Q== ------END CERTIFICATE----- - QuoVadis Root CA 2 ================== -----BEGIN CERTIFICATE----- @@ -527,47 +262,6 @@ vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- -Security Communication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw -8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM -DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX -5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd -DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 -JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g -0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a -mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ -s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ -6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi -FL39vmwLAw== ------END CERTIFICATE----- - -Sonera Class 2 Root CA -====================== ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG -U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw -NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh -IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 -/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT -dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG -f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P -tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH -nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT -XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt -0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI -cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph -Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx -EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH -llpwrN9M ------END CERTIFICATE----- - XRamp Global CA Root ==================== -----BEGIN CERTIFICATE----- @@ -640,36 +334,6 @@ KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- -Taiwan GRCA -=========== ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG -EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X -DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv -dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN -w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 -BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O -1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO -htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov -J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 -Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t -B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB -O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 -lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV -HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 -09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj -Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 -Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU -D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz -DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk -Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk -7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ -CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy -+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS ------END CERTIFICATE----- - DigiCert Assured ID Root CA =========================== -----BEGIN CERTIFICATE----- @@ -798,78 +462,6 @@ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- -GeoTrust Primary Certification Authority -======================================== ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx -CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ -cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN -b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 -nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge -RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt -tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI -hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K -Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN -NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa -Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG -1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -thawte Primary Root CA -====================== ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 -MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg -SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv -KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT -FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs -oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ -1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc -q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K -aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p -afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF -AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE -uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 -jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH -z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G5 -============================================================ ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh -dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz -j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD -Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ -Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r -fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ -BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv -Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG -SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ -X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE -KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC -Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE -ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - SecureTrust CA ============== -----BEGIN CERTIFICATE----- @@ -938,29 +530,6 @@ IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== -----END CERTIFICATE----- -Network Solutions Certificate Authority -======================================= ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG -EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr -IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx -MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx -jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT -aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT -crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc -/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB -AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv -bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA -A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q -4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ -GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD -ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - COMODO ECC Certification Authority ================================== -----BEGIN CERTIFICATE----- @@ -978,29 +547,6 @@ FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- -OISTE WISeKey Global Root GA CA -=============================== ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE -BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG -A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH -bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD -VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw -IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 -IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 -Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg -Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD -d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ -/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R -LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm -MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 -+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY -okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= ------END CERTIFICATE----- - Certigna ======== -----BEGIN CERTIFICATE----- @@ -1023,28 +569,6 @@ PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- -Cybertrust Global Root -====================== ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li -ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 -MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD -ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW -0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL -AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin -89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT -8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 -MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G -A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO -lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi -5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 -hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T -X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - ePKI Root Certification Authority ================================= -----BEGIN CERTIFICATE----- @@ -1096,136 +620,6 @@ vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD -----END CERTIFICATE----- -GeoTrust Primary Certification Authority - G3 -============================================= ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 -IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz -NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo -YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT -LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j -K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE -c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C -IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu -dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr -2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 -cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE -Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s -t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -thawte Primary Root CA - G2 -=========================== ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC -VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu -IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg -Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV -MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG -b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt -IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS -LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 -8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU -mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN -G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K -rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -thawte Primary Root CA - G3 -=========================== ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w -ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD -VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG -A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At -P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC -+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY -7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW -vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ -KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK -A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC -8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm -er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G2 -============================================= ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 -OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl -b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG -BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc -KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ -EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m -ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 -npaqBA+K ------END CERTIFICATE----- - -VeriSign Universal Root Certification Authority -=============================================== ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj -1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP -MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 -9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I -AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR -tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G -CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O -a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 -Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx -Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx -P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P -wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 -mJO37M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G4 -============================================================ ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC -VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 -b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz -ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo -b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 -Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz -rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw -HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u -Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD -A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx -AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - NetLock Arany (Class Gold) Főtanúsítvány ======================================== -----BEGIN CERTIFICATE----- @@ -1250,47 +644,6 @@ NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- -Hongkong Post Root CA 1 -======================= ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT -DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx -NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n -IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 -ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr -auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh -qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY -V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV -HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i -h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio -l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei -IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps -T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT -c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== ------END CERTIFICATE----- - -SecureSign RootCA11 -=================== ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi -SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS -b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw -KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 -cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL -TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO -wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq -g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP -O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA -bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX -t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh -OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r -bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ -Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 -y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 -lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - Microsec e-Szigno Root CA 2009 ============================== -----BEGIN CERTIFICATE----- @@ -1336,39 +689,6 @@ YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r kpeDMdmztcpHWD9f -----END CERTIFICATE----- -Autoridad de Certificacion Firmaprofesional CIF A62634068 -========================================================= ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA -BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw -QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB -NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD -Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P -B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY -7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH -ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI -plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX -MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX -LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK -bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU -vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud -EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH -DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA -bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx -ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx -51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk -R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP -T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f -Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl -osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR -crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR -saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD -KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi -6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - Izenpe.com ========== -----BEGIN CERTIFICATE----- @@ -1401,82 +721,6 @@ Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== -----END CERTIFICATE----- -Chambers of Commerce Root - 2008 -================================ ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy -Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl -ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF -EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl -cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA -XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj -h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ -ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk -NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g -D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 -lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ -0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 -EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI -G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ -BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh -bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh -bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC -CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH -AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 -wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH -3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU -RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 -M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 -YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF -9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK -zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG -nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ ------END CERTIFICATE----- - -Global Chambersign Root - 2008 -============================== ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx -NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg -Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ -QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf -VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf -XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 -ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB -/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA -TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M -H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe -Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF -HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB -AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT -BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE -BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm -aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm -aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp -1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 -dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG -/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 -ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s -dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg -9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH -foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du -qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr -P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq -c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - Go Daddy Root Certificate Authority - G2 ======================================== -----BEGIN CERTIFICATE----- @@ -1693,60 +937,6 @@ tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- -EC-ACC -====== ------BEGIN CERTIFICATE----- -MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE -BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w -ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD -VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE -CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT -BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 -MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt -SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl -Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh -cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK -w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT -ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 -HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a -E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw -0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD -VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 -Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l -dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ -lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa -Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe -l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 -E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D -5EI= ------END CERTIFICATE----- - -Hellenic Academic and Research Institutions RootCA 2011 -======================================================= ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT -O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y -aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT -AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo -IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI -1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa -71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u -8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH -3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ -MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 -MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu -b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt -XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD -/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N -7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - Actalis Authentication Root CA ============================== -----BEGIN CERTIFICATE----- @@ -1778,27 +968,6 @@ OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- -Trustis FPS Root CA -=================== ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG -EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 -IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV -BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ -RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk -H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa -cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt -o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA -AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd -BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c -GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC -yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P -8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV -l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl -iB6XzCGcKQENZetX2fNXlrtIzYE= ------END CERTIFICATE----- - Buypass Class 2 Root CA ======================= -----BEGIN CERTIFICATE----- @@ -1881,30 +1050,6 @@ P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== -----END CERTIFICATE----- -EE Certification Centre Root CA -=============================== ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG -EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy -dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw -MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB -UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy -ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM -TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 -rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw -93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN -P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ -MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF -BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj -xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM -lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU -3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM -dcGWxZ0= ------END CERTIFICATE----- - D-TRUST Root Class 3 CA 2 2009 ============================== -----BEGIN CERTIFICATE----- @@ -2083,40 +1228,6 @@ Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= -----END CERTIFICATE----- -E-Tugra Certification Authority -=============================== ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w -DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls -ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw -NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx -QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl -cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD -DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd -hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K -CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g -ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ -BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 -E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz -rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq -jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 -dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB -/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG -MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK -kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO -XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 -VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo -a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc -dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV -KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT -Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 -8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G -C7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - T-TeleSec GlobalRoot Class 2 ============================ -----BEGIN CERTIFICATE----- @@ -2438,20 +1549,6 @@ HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= -----END CERTIFICATE----- -GlobalSign ECC Root CA - R4 -=========================== ------BEGIN CERTIFICATE----- -MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb -R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD -EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb -R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD -EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl -OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P -AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV -MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF -JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= ------END CERTIFICATE----- - GlobalSign ECC Root CA - R5 =========================== -----BEGIN CERTIFICATE----- @@ -2467,66 +1564,6 @@ uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 -----END CERTIFICATE----- -Staat der Nederlanden Root CA - G3 -================================== ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE -CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g -Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC -TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l -ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y -olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t -x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy -EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K -Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur -mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 -1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp -07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo -FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE -41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu -yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD -U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq -KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 -v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA -8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b -8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r -mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq -1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI -JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV -tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= ------END CERTIFICATE----- - -Staat der Nederlanden EV Root CA -================================ ------BEGIN CERTIFICATE----- -MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE -CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g -RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M -MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl -cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk -SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW -O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r -0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 -Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV -XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr -08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV -0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd -74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx -fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa -ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI -eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu -c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq -5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN -b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN -f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi -5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 -WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK -DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy -eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== ------END CERTIFICATE----- - IdenTrust Commercial Root CA 1 ============================== -----BEGIN CERTIFICATE----- @@ -2978,87 +2015,6 @@ F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== -----END CERTIFICATE----- -TrustCor RootCert CA-1 -====================== ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP -MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig -U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx -MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu -YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe -VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy -dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq -jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4 -pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0 -JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h -gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw -/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j -BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5 -mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf -ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C -qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P -3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk= ------END CERTIFICATE----- - -TrustCor RootCert CA-2 -====================== ------BEGIN CERTIFICATE----- -MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w -DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT -eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0 -eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy -MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h -bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0 -IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb -ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk -RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1 -oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb -XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1 -/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q -jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP -eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg -rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh -8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU -2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h -Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp -kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv -2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3 -S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw -PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv -DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU -RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE -xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX -RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ ------END CERTIFICATE----- - -TrustCor ECA-1 -============== ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP -MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig -U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw -N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5 -MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y -IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR -MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23 -xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc -p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+ -fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj -YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL -f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF -AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u -/ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F -hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs -J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC -jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g== ------END CERTIFICATE----- - SSL.com Root Certification Authority RSA ======================================== -----BEGIN CERTIFICATE----- @@ -3203,96 +2159,6 @@ AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 -----END CERTIFICATE----- -GTS Root R1 -=========== ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG -EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv -b3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG -A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx -9vaMf/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7r -aKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnW -r4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqM -LnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly -4cpk9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr -06zqkUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 -wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om -3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNu -JLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEM -BQADggIBADiWCu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 -d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6ZXPYfcX3v73sv -fuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZRgyFmxhE+885H7pwoHyXa/6xm -ld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9b -gsiG1eGZbYwE8na6SfZu6W0eX6DvJ4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq -4BjFbkerQUIpm/ZgDdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWEr -tXvM+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyyF62ARPBo -pY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9SQ98POyDGCBDTtWTurQ0 -sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdwsE3PYJ/HQcu51OyLemGhmW/HGY0dVHLql -CFF1pkgl ------END CERTIFICATE----- - -GTS Root R2 -=========== ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG -EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv -b3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG -A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTuk -k3LvCvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo -7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWI -m8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5Gm -dFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbu -ak7MkogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscsz -cTJGr61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW -Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73Vululycsl -aVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy -5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEM -BQADggIBALZp8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT -vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiTz9D2PGcDFWEJ -+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiApJiS4wGWAqoC7o87xdFtCjMw -c3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvbpxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3Da -WsYDQvTtN6LwG1BUSw7YhN4ZKJmBR64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5r -n/WkhLx3+WuXrD5RRaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56Gtmwfu -Nmsk0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC5AwiWVIQ -7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiFizoHCBy69Y9Vmhh1fuXs -gWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLnyOd/xCxgXS/Dr55FBcOEArf9LAhST4Ld -o/DUhgkC ------END CERTIFICATE----- - -GTS Root R3 -=========== ------BEGIN CERTIFICATE----- -MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV -UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg -UjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE -ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUU -Rout736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24Cej -QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP -0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFukfCPAlaUs3L6JbyO5o91lAFJekazInXJ0 -glMLfalAvWhgxeG4VDvBNhcl2MG9AjEAnjWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOa -KaqW04MjyaR7YbPMAuhd ------END CERTIFICATE----- - -GTS Root R4 -=========== ------BEGIN CERTIFICATE----- -MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV -UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg -UjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE -ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa -6zzuhXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqj -QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV -2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0CMRw3J5QdCHojXohw0+WbhXRIjVhLfoI -N+4Zba3bssx9BzT1YBkstTTZbyACMANxsbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11x -zPKwTdb+mciUqXWi4w== ------END CERTIFICATE----- - UCA Global G2 Root ================== -----BEGIN CERTIFICATE----- @@ -3492,40 +2358,6 @@ hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB dBb9HxEGmpv0 -----END CERTIFICATE----- -Entrust Root Certification Authority - G4 -========================================= ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAwgb4xCzAJBgNV -BAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3Qu -bmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1 -dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eSAtIEc0MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYT -AlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 -L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3D -umSXbcr3DbVZwbPLqGgZ2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV -3imz/f3ET+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j5pds -8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAMC1rlLAHGVK/XqsEQ -e9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73TDtTUXm6Hnmo9RR3RXRv06QqsYJn7 -ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNXwbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5X -xNMhIWNlUpEbsZmOeX7m640A2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV -7rtNOzK+mndmnqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 -dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwlN4y6mACXi0mW -Hv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNjc0kCAwEAAaNCMEAwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9n -MA0GCSqGSIb3DQEBCwUAA4ICAQAS5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4Q -jbRaZIxowLByQzTSGwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht -7LGrhFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/B7NTeLUK -YvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uIAeV8KEsD+UmDfLJ/fOPt -jqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbwH5Lk6rWS02FREAutp9lfx1/cH6NcjKF+ -m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKW -RGhXxNUzzxkvFMSUHHuk2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjA -JOgc47OlIQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk5F6G -+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuYn/PIjhs4ViFqUZPT -kcpG2om3PVODLAgfi49T3f+sHw== ------END CERTIFICATE----- - Microsoft ECC Root Certificate Authority 2017 ============================================= -----BEGIN CERTIFICATE----- @@ -3617,3 +2449,1223 @@ Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N 0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc= -----END CERTIFICATE----- + +Trustwave Global Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +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 +29FpHOTKyeC2nOnOcXHebD8WpHk= +-----END CERTIFICATE----- + +Trustwave Global ECC P256 Certification Authority +================================================= +-----BEGIN CERTIFICATE----- +MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1 +NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj +43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm +P62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt +0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz +RM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 +-----END CERTIFICATE----- + +Trustwave Global ECC P384 Certification Authority +================================================= +-----BEGIN CERTIFICATE----- +MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4 +NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH +Ba5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr +/TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV +HQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn +ADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl +CrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw== +-----END CERTIFICATE----- + +NAVER Global Root Certification Authority +========================================= +-----BEGIN CERTIFICATE----- +MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEMBQAwaTELMAkG +A1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRGT1JNIENvcnAuMTIwMAYDVQQD +DClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4 +NDJaFw0zNzA4MTgyMzU5NTlaMGkxCzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVT +UyBQTEFURk9STSBDb3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVAiQqrDZBb +UGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH38dq6SZeWYp34+hInDEW ++j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lEHoSTGEq0n+USZGnQJoViAbbJAh2+g1G7 +XNr4rRVqmfeSVPc0W+m/6imBEtRTkZazkVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2 +aacp+yPOiNgSnABIqKYPszuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4 +Yb8ObtoqvC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHfnZ3z +VHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaGYQ5fG8Ir4ozVu53B +A0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo0es+nPxdGoMuK8u180SdOqcXYZai +cdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3aCJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejy +YhbLgGvtPe31HzClrkvJE+2KAQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNV +HQ4EFgQU0p+I36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoNqo0hV4/GPnrK +21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatjcu3cvuzHV+YwIHHW1xDBE1UB +jCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bx +hYTeodoS76TiEJd6eN4MUZeoIUCLhr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTg +E34h5prCy8VCZLQelHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTH +D8z7p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8piKCk5XQ +A76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLRLBT/DShycpWbXgnbiUSY +qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG +I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg +kpzNNIaRkPpkUZ3+/uul9XXeifdy +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM SERVIDORES SEGUROS +=================================== +-----BEGIN CERTIFICATE----- +MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF +UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy +NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4 +MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt +UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB +QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2 +LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG +SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD +zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c= +-----END CERTIFICATE----- + +GlobalSign Root R46 +=================== +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv +b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX +BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es +CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/ +r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje +2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt +bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj +K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4 +12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on +ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls +eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9 +vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM +BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg +JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy +gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92 +CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm +OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq +JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye +qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz +nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7 +DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3 +QEUxeCp6 +-----END CERTIFICATE----- + +GlobalSign Root E46 +=================== +-----BEGIN CERTIFICATE----- +MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT +AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg +RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV +BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB +jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj +QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL +gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk +vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+ +CAezNIm8BZ/3Hobui3A= +-----END CERTIFICATE----- + +GLOBALTRUST 2020 +================ +-----BEGIN CERTIFICATE----- +MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx +IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT +VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh +BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy +MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi +D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO +VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM +CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm +fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA +A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR +JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG +DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU +clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ +mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud +IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA +VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw +4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9 +iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS +8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2 +HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS +vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918 +oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF +YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl +gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== +-----END CERTIFICATE----- + +ANF Secure Server Root CA +========================= +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Certum EC-384 CA +================ +-----BEGIN CERTIFICATE----- +MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ +TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2 +MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh +dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq +vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn +iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo +ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0 +QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= +-----END CERTIFICATE----- + +Certum Trusted Root CA +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +TunTrust Root CA +================ +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +HARICA TLS RSA Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG +EwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz +OFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl +bWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB +IFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN +JLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu +a2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y +Ulhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K +5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv +dmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR +0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH +GjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm +haZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ +CPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU +EapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq +QRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD +QpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR +j88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5 +vZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0 +qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6 +Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/ +PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn +kf3/W9b3raYvAwtt41dU63ZTGI0RmLo= +-----END CERTIFICATE----- + +HARICA TLS ECC Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH +UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD +QTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX +DTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj +IGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv +b3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l +AEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b +ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW +0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi +rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw +CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1Ud +DgQWBBRlzeurNR4APn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4w +gZswgZgGBFUdIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j +b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4A +bwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL +4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDb +LIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1il +I45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZEEAEeiGaP +cjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV1aUsIC+nmCjuRfzxuIgA +LI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2ebKHTEm9caPARYpoKdrcd7b/+A +lun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH +9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpf +NIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqE +ZycPvEJdvSRUDewdcAZfpLz6IHxV +-----END CERTIFICATE----- + +vTrus ECC Root CA +================= +-----BEGIN CERTIFICATE----- +MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkGA1UE +BhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBS +b290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAa +BgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+c +ToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUde4BdS49n +TPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UT +QJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQL +YgmRWAD5Tfs0aNoJrSEGGJTO +-----END CERTIFICATE----- + +vTrus Root CA +============= +-----BEGIN CERTIFICATE----- +MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzELMAkG +A1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZUcnVzIFJv +b3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoG +A1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZots +SKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykUAyyNJJrI +ZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+GrPSbcKvdmaVayqwlHeF +XgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z98Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KA +YPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70 +kLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2 +AXPKBlim0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu +/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu +1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO +9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYg +scasGrz2iTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC +AgEAKbqSSaet8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd +nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjr +jld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4 +8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJn +xDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554Wg +icEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4 +sEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNBUvupLnKW +nyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1PTi07NEPhmg4NpGaXutIc +SkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy6K2ir40zSbofitzmdHxghm+H +l3s= +-----END CERTIFICATE----- + +ISRG Root X2 +============ +-----BEGIN CERTIFICATE----- +MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQGEwJV +UzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElT +UkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVT +MSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNS +RyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H +ttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9ItgKbppb +d9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZIzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtF +cP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5 +U6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tbFfLn +-----END CERTIFICATE----- + +HiPKI Root CA - G1 +================== +-----BEGIN CERTIFICATE----- +MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMMEkhpUEtJ +IFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYT +AlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kg +Um9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0 +o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twvVcg3Px+k +wJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SE +YYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsA +GJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd +hSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj +1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K4 +9a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/ +Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF +8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQD +AgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi +7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSl +tJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE +wx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07Q +JNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv +5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+Gpz +jLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wrkkVbbiVg +hUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+vhV4nYWBSipX3tUZQ9rb +yltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/ +yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R4 +=========================== +-----BEGIN CERTIFICATE----- +MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkW +ymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNVHQ8BAf8E +BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/+wpu+74zyTyjhNUwCgYI +KoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147bmF0774BxL4YSFlhgjICICadVGNA3jdg +UM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm +-----END CERTIFICATE----- + +GTS Root R1 +=========== +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0 +xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+w +B7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXW +nOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk +9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zq +kUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1A +K/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPX +V2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDW +cfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQAD +ggIBAJ+qQibbC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe +QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRi +ClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar +J45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYci +NuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5me +LMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJF +fbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ0E6yove+ +7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm2tIMPNuzjsmhDYAPexZ3 +FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3 +gm3c +-----END CERTIFICATE----- + +GTS Root R2 +=========== +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo7JUl +e3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wb +a96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS ++LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7M +kogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJG +r61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9q +S34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNV +J1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okL +dWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQAD +ggIBAB/Kzt3HvqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 +0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyCB19m3H0Q/gxh +swWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2uNmSRXbBoGOqKYcl3qJfEycel +/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMgyALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVn +jWQye+mew4K6Ki3pHrTgSAai/GevHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y5 +9PYjJbigapordwj6xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M +7YNRTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924SgJPFI/2R8 +0L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV7LXTWtiBmelDGDfrs7vR +WGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjW +HYbL +-----END CERTIFICATE----- + +GTS Root R3 +=========== +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/Eq +Er24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azT +L818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV +11RZt+cRLInUue4X +-----END CERTIFICATE----- + +GTS Root R4 +=========== +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1 +PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C +r8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh +4rsUecrNIdSUtUlD +-----END CERTIFICATE----- + +Telia Root CA v2 +================ +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNVBAYT +AkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2 +MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQK +DBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ7 +6zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9vVYiQJ3q +9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9lRdU2HhE8Qx3FZLgmEKn +pNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTODn3WhUidhOPFZPY5Q4L15POdslv5e2QJl +tI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW +5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNr +RBH0pUPCTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0E +BXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4 +M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbau +BcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7W +xy+G2CQ5MB0GA1UdDgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ +8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5 +tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H +eW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+C +y748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygC +QMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15 +h2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMtTy3EHD70 +sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pTVmBds9hCG1xLEooc6+t9 +xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQ +raVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc= +-----END CERTIFICATE----- + +D-TRUST BR Root CA 1 2020 +========================= +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7 +dPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0QVK5buXu +QqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/VbNafAkl1bK6CKBrqx9t +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70Pvom +AjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87 +-----END CERTIFICATE----- + +D-TRUST EV Root CA 1 2020 +========================= +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8 +ZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rDwpdhQntJ +raOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3OqQo5FD4pPfsazK2/umL +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR +AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW +-----END CERTIFICATE----- + +DigiCert TLS ECC P384 Root G5 +============================= +-----BEGIN CERTIFICATE----- +MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4 +NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg +Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd +lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj +n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB +/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds +Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx +AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA== +-----END CERTIFICATE----- + +DigiCert TLS RSA4096 Root G5 +============================ +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG +EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0 +MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2 +IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8 +7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU +AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces +tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa +zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV +DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q +TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy +z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/ +MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk +wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E +FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw +GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN +lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN +MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/ +u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G +OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh +47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU +FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ +yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP +bEtoL8pU9ozaMv7Da4M/OMZ+ +-----END CERTIFICATE----- + +Certainly Root R1 +================= +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE +BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN +MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy +dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O +5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl +8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl +DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI +XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN +KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ +AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb +rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1 +VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS +p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz +HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d +8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v +MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB +GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+ +gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH +JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7 +fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw +x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S +X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8= +-----END CERTIFICATE----- + +Certainly Root E1 +================= +-----BEGIN CERTIFICATE----- +MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV +UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0 +MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu +bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4 +fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9 +YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E +AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8 +rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR +-----END CERTIFICATE----- + +Security Communication ECC RootCA1 +================================== +-----BEGIN CERTIFICATE----- +MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD +VQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t +dW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL +MAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV +BAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo +5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW +BBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK +BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L +snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e +N9k= +-----END CERTIFICATE----- + +BJCA Global Root CA1 +==================== +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQG +EwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJK +Q0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAzMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkG +A1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQD +DBRCSkNBIEdsb2JhbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFm +CL3ZxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZspDyRhyS +sTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O558dnJCNPYwpj9mZ9S1Wn +P3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgRat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcW +yqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRj +eulumijWML3mG90Vr4TqnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNn +MoH1V6XKV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/pj+b +OT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZOz2nxbkRs1CTqjSSh +GL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXnjSXWgXSHRtQpdaJCbPdzied9v3pK +H9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMB +AAGjQjBAMB0GA1UdDgQWBBTF7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 +YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3KliawLwQ8hOnThJ +dMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u+2D2/VnGKhs/I0qUJDAnyIm8 +60Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuh +TaRjAv04l5U/BXCga99igUOLtFkNSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW +4AB+dAb/OMRyHdOoP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmp +GQrI+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRzznfSxqxx +4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9eVzYH6Eze9mCUAyTF6ps +3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4S +SPfSKcOYKMryMguTjClPPGAyzQWWYezyr/6zcCwupvI= +-----END CERTIFICATE----- + +BJCA Global Root CA2 +==================== +-----BEGIN CERTIFICATE----- +MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQswCQYDVQQGEwJD +TjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJKQ0Eg +R2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgyMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UE +BhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRC +SkNBIEdsb2JhbCBSb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jl +SR9BIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK++kpRuDCK +/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJKsVF/BvDRgh9Obl+rg/xI +1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8 +W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8g +UXOQwKhbYdDFUDn9hf7B43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== +-----END CERTIFICATE----- + +Sectigo Public Server Authentication Root E46 +============================================= +-----BEGIN CERTIFICATE----- +MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQswCQYDVQQGEwJH +QjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBTZXJ2 +ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5 +WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0 +aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUr +gQQAIgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccCWvkEN/U0 +NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+6xnOQ6OjQjBAMB0GA1Ud +DgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAKBggqhkjOPQQDAwNnADBkAjAn7qRaqCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RH +lAFWovgzJQxC36oCMB3q4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21U +SAGKcw== +-----END CERTIFICATE----- + +Sectigo Public Server Authentication Root R46 +============================================= +-----BEGIN CERTIFICATE----- +MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBfMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT +ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1 +OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T +ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3 +DQEBAQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDaef0rty2k +1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnzSDBh+oF8HqcIStw+Kxwf +GExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xfiOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMP +FF1bFOdLvt30yNoDN9HWOaEhUTCDsG3XME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vu +ZDCQOc2TZYEhMbUjUDM3IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5Qaz +Yw6A3OASVYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgESJ/A +wSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu+Zd4KKTIRJLpfSYF +plhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt8uaZFURww3y8nDnAtOFr94MlI1fZ +EoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+LHaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW +6aWWrL3DkJiy4Pmi1KZHQ3xtzwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWI +IUkwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c +mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQYKlJfp/imTYp +E0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52gDY9hAaLMyZlbcp+nv4fjFg4 +exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZAFv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M +0ejf5lG5Nkc/kLnHvALcWxxPDkjBJYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI +84HxZmduTILA7rpXDhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9m +pFuiTdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5dHn5Hrwd +Vw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65LvKRRFHQV80MNNVIIb/b +E/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmm +J1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAYQqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL +-----END CERTIFICATE----- + +SSL.com TLS RSA Root CA 2022 +============================ +-----BEGIN CERTIFICATE----- +MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQG +EwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBSU0Eg +Um9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloXDTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMC +VVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJv +b3QgQ0EgMjAyMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u +9nTPL3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OYt6/wNr/y +7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0insS657Lb85/bRi3pZ7Qcac +oOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3PnxEX4MN8/HdIGkWCVDi1FW24IBydm5M +R7d1VVm0U3TZlMZBrViKMWYPHqIbKUBOL9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDG +D6C1vBdOSHtRwvzpXGk3R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEW +TO6Af77wdr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS+YCk +8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYSd66UNHsef8JmAOSq +g+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoGAtUjHBPW6dvbxrB6y3snm/vg1UYk +7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2fgTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsu +N+7jhHonLs0ZNbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt +hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsMQtfhWsSWTVTN +j8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvfR4iyrT7gJ4eLSYwfqUdYe5by +iB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJDPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjU +o3KUQyxi4U5cMj29TH0ZR6LDSeeWP4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqo +ENjwuSfr98t67wVylrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7Egkaib +MOlqbLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2wAgDHbICi +vRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3qr5nsLFR+jM4uElZI7xc7 +P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sjiMho6/4UIyYOf8kpIEFR3N+2ivEC+5BB0 +9+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA= +-----END CERTIFICATE----- + +SSL.com TLS ECC Root CA 2022 +============================ +-----BEGIN CERTIFICATE----- +MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV +UzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBFQ0MgUm9v +dCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMx +GDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3Qg +Q0EgMjAyMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWy +JGYmacCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFNSeR7T5v1 +5wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSJjy+j6CugFFR7 +81a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NWuCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGG +MAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w +7deedWo1dlJF4AIxAMeNb0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5 +Zn6g6g== +-----END CERTIFICATE----- + +Atos TrustedRoot Root CA ECC TLS 2021 +===================================== +-----BEGIN CERTIFICATE----- +MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4wLAYDVQQDDCVB +dG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQswCQYD +VQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3Mg +VHJ1c3RlZFJvb3QgUm9vdCBDQSBFQ0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYT +AkRFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6K +DP/XtXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4AjJn8ZQS +b+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2KCXWfeBmmnoJsmo7jjPX +NtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIwW5kp85wxtolrbNa9d+F851F+ +uDrNozZffPc8dz7kUK2o59JZDCaOMDtuCCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGY +a3cpetskz2VAv9LcjBHo9H1/IISpQuQo +-----END CERTIFICATE----- + +Atos TrustedRoot Root CA RSA TLS 2021 +===================================== +-----BEGIN CERTIFICATE----- +MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBMMS4wLAYDVQQD +DCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQsw +CQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0 +b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNV +BAYTAkRFMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BB +l01Z4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYvYe+W/CBG +vevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZkmGbzSoXfduP9LVq6hdK +ZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDsGY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt +0xU6kGpn8bRrZtkh68rZYnxGEFzedUlnnkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVK +PNe0OwANwI8f4UDErmwh3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMY +sluMWuPD0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzygeBY +Br3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8ANSbhqRAvNncTFd+ +rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezBc6eUWsuSZIKmAMFwoW4sKeFYV+xa +fJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lIpw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUdEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0G +CSqGSIb3DQEBDAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS +4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPso0UvFJ/1TCpl +Q3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJqM7F78PRreBrAwA0JrRUITWX +AdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuywxfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9G +slA9hGCZcbUztVdF5kJHdWoOsAgMrr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2Vkt +afcxBPTy+av5EzH4AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9q +TFsR0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuYo7Ey7Nmj +1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5dDTedk+SKlOxJTnbPP/l +PqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcEoji2jbDwN/zIIX8/syQbPYtuzE2wFg2W +HYMfRsCbvUOZ58SWLs5fyQ== +-----END CERTIFICATE----- + +TrustAsia Global Root CA G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEMBQAwWjELMAkG +A1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMM +G1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAeFw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEw +MTlaMFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMu +MSQwIgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNST1QY4Sxz +lZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqKAtCWHwDNBSHvBm3dIZwZ +Q0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/V +P68czH5GX6zfZBCK70bwkPAPLfSIC7Epqq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1Ag +dB4SQXMeJNnKziyhWTXAyB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm +9WAPzJMshH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gXzhqc +D0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAvkV34PmVACxmZySYg +WmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msTf9FkPz2ccEblooV7WIQn3MSAPmea +mseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jAuPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCF +TIcQcf+eQxuulXUtgQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj +7zjKsK5Xf/IhMBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E +BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4wM8zAQLpw6o1 +D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2XFNFV1pF1AWZLy4jVe5jaN/T +G3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNj +duMNhXJEIlU/HHzp/LgV6FL6qj6jITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstl +cHboCoWASzY9M/eVVHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys ++TIxxHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1onAX1daBli +2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d7XB4tmBZrOFdRWOPyN9y +aFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2NtjjgKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsAS +ZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV+Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFR +JQJ6+N1rZdVtTTDIZbpoFGWsJwt0ivKH +-----END CERTIFICATE----- + +TrustAsia Global Root CA G4 +=========================== +-----BEGIN CERTIFICATE----- +MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMwWjELMAkGA1UE +BhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMMG1Ry +dXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0yMTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJa +MFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQw +IgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AATxs8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbwLxYI+hW8 +m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJijYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mDpm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/ +pDHel4NZg6ZvccveMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AA +bbd+NvBNEU/zy4k6LHiRUKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xk +dUfFVZDj/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA== +-----END CERTIFICATE----- + +CommScope Public Trust ECC Root-01 +================================== +-----BEGIN CERTIFICATE----- +MIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMwTjELMAkGA1UE +BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz +dCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNaFw00NjA0MjgxNzM1NDJaME4xCzAJBgNVBAYT +AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg +RUNDIFJvb3QtMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16ocNfQj3Rid8NeeqrltqLx +eP0CflfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOcw5tjnSCDPgYLpkJEhRGnSjot +6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggqhkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2 +Jpc1XHvr20v4qotzVRVcrHgpD7oh2MSg2NED3W3ROT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liW +pDVfG2XqYZpwI7UNo5uSUm9poIyNStDuiw7LR47QjRE= +-----END CERTIFICATE----- + +CommScope Public Trust ECC Root-02 +================================== +-----BEGIN CERTIFICATE----- +MIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMwTjELMAkGA1UE +BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz +dCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRaFw00NjA0MjgxNzQ0NTNaME4xCzAJBgNVBAYT +AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg +RUNDIFJvb3QtMDIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l63FRD/cHB8o5mXxO1Q/M +MDALj2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/ubCK1sK9IRQq9qEmUv4RDsNuE +SgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggqhkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9 +Uj/UQQSugEODZXW5hYA4O9Zv5JOGq4/nich/m35rChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs7 +3u1Z/GtMMH9ZzkXpc2AVmkzw5l4lIhVtwodZ0LKOag== +-----END CERTIFICATE----- + +CommScope Public Trust RSA Root-01 +================================== +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQELBQAwTjELMAkG +A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU +cnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1NTRaFw00NjA0MjgxNjQ1NTNaME4xCzAJBgNV +BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1 +c3QgUlNBIFJvb3QtMDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwSGWjDR1C45Ft +nYSkYZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2bKOx7dAvnQmtVzslhsuitQDy6 +uUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBWBB0HW0alDrJLpA6lfO741GIDuZNq +ihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3OjWiE260f6GBfZumbCk6SP/F2krfxQapWs +vCQz0b2If4b19bJzKo98rwjyGpg/qYFlP8GMicWWMJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/c +Zip8UlF1y5mO6D1cv547KI2DAg+pn3LiLCuz3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTif +BSeolz7pUcZsBSjBAg/pGG3svZwG1KdJ9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/kQO9 +lLvkuI6cMmPNn7togbGEW682v3fuHX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JOHg9O5j9ZpSPcPYeo +KFgo0fEbNttPxP/hjFtyjMcmAyejOQoBqsCyMWCDIqFPEgkBEa801M/XrmLTBQe0MXXgDW1XT2mH ++VepuhX2yFJtocucH+X8eKg1mp9BFM6ltM6UCBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm4 +5P3luG0wDQYJKoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6 +NWPxzIHIxgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQnmhUQo8mUuJM +3y+Xpi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+QgvfKNmwrZggvkN80V4aCRck +jXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2vtrV0KnahP/t1MJ+UXjulYPPLXAziDslg+Mkf +Foom3ecnf+slpoq9uC02EJqxWE2aaE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0DLwAHb/W +NyVntHKLr4W96ioDj8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/xBpMu95yo9GA+ +o/E4Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054A5U+1C0wlREQKC6/ +oAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHnYfkUyq+Dj7+vsQpZXdxc +1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVocicCMb3SgazNNtQEo/a2tiRc7ppqEvOuM +6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw +-----END CERTIFICATE----- + +CommScope Public Trust RSA Root-02 +================================== +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQELBQAwTjELMAkG +A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU +cnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2NDNaFw00NjA0MjgxNzE2NDJaME4xCzAJBgNV +BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1 +c3QgUlNBIFJvb3QtMDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDh+g77aAASyE3V +rCLENQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mnG2I81lDnNJUDMrG0kyI9p+Kx +7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0SFHRtI1CrWDaSWqVcN3SAOLMV2MC +e5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxzhkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2W +Wy09X6GDRl224yW4fKcZgBzqZUPckXk2LHR88mcGyYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rp +M9kzXzehxfCrPfp4sOcsn/Y+n2Dg70jpkEUeBVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIf +hs1w/tkuFT0du7jyU1fbzMZ0KZwYszZ1OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5kQMr +eyBUzQ0ZGshBMjTRsJnhkB4BQDa1t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3wNemKfrb3vOTlycE +VS8KbzfFPROvCgCpLIscgSjX74Yxqa7ybrjKaixUR9gqiC6vwQcQeKwRoi9C8DfF8rhW3Q5iLc4t +Vn5V8qdE9isy9COoR+jUKgF4z2rDN6ieZdIs5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7Gx +cJXvYXowDQYJKoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqB +KCh6krm2qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3+VGXu6TwYofF +1gbTl4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbymeAPnCKfWxkxlSaRosTKCL4BWa +MS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3NyqpgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv41xd +gSGn2rtO/+YHqP65DSdsu3BaVXoT6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u5cSoHw2O +HG1QAk8mGEPej1WFsQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FUmrh1CoFSl+Nm +YWvtPjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jauwy8CTl2dlklyALKr +dVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670v64fG9PiO/yzcnMcmyiQ +iRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17Org3bhzjlP1v9mxnhMUF6cKojawHhRUzN +lM47ni3niAIi9G7oyOzWPPO5std3eqx7 +-----END CERTIFICATE----- + +Telekom Security TLS ECC Root 2020 +================================== +-----BEGIN CERTIFICATE----- +MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQswCQYDVQQGEwJE +RTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJUZWxl +a29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIwMB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIz +NTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkg +R21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqG +SM49AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/OtdKPD/M1 +2kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDPf8iAC8GXs7s1J8nCG6NC +MEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6fMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZ +Mo7k+5Dck2TOrbRBR2Diz6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdU +ga/sf+Rn27iQ7t0l +-----END CERTIFICATE----- + +Telekom Security TLS RSA Root 2023 +================================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +FIRMAPROFESIONAL CA ROOT-A WEB +============================== +-----BEGIN CERTIFICATE----- +MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQswCQYDVQQGEwJF +UzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4 +MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENBIFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2 +WhcNNDcwMzMxMDkwMTM2WjBuMQswCQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25h +bCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFM +IENBIFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zfe9MEkVz6 +iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6CcyvHZpsKjECcfIr28jlg +st7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FD +Y1w8ndYn81LsF7Kpryz3dvgwHQYDVR0OBBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB +/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgL +cFBTApFwhVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dGXSaQ +pYXFuXqUPoeovQA= +-----END CERTIFICATE----- + +TWCA CYBER Root CA +================== +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQMQswCQYDVQQG +EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB +IENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQG +EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB +IENZQkVSIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1s +Ts6P40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxFavcokPFh +V8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/34bKS1PE2Y2yHer43CdT +o0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684iJkXXYJndzk834H/nY62wuFm40AZoNWDT +Nq5xQwTxaWV4fPMf88oon1oglWa0zbfuj3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK +/c/WMw+f+5eesRycnupfXtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkH +IuNZW0CP2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDAS9TM +fAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDAoS/xUgXJP+92ZuJF +2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzCkHDXShi8fgGwsOsVHkQGzaRP6AzR +wyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83 +QOGt4A1WNzAdBgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB +AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0ttGlTITVX1olN +c79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn68xDiBaiA9a5F/gZbG0jAn/x +X9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNnTKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDR +IG4kqIQnoVesqlVYL9zZyvpoBJ7tRCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq +/p1hvIbZv97Tujqxf36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0R +FxbIQh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz8ppy6rBe +Pm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4NxKfKjLji7gh7MMrZQzv +It6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzXxeSDwWrruoBa3lwtcHb4yOWHh8qgnaHl +IhInD0Q9HWzq1MKLL295q39QpsQZp6F6t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X +-----END CERTIFICATE----- + +SecureSign Root CA12 +==================== +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQELBQAwUTELMAkG +A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT +ZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgwNTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJ +BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU +U2VjdXJlU2lnbiBSb290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3 +emhFKxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mtp7JIKwcc +J/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zdJ1M3s6oYwlkm7Fsf0uZl +fO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gurFzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBF +EaCeVESE99g2zvVQR9wsMJvuwPWW0v4JhscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1Uef +NzFJM3IFTQy2VYzxV4+Kh9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsFAAOC +AQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6LdmmQOmFxv3Y67ilQi +LUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJmBClnW8Zt7vPemVV2zfrPIpyMpce +mik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPS +vWKErI4cqc1avTc7bgoitPQV55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhga +aaI5gdka9at/yOPiZwud9AzqVN/Ssq+xIvEg37xEHA== +-----END CERTIFICATE----- + +SecureSign Root CA14 +==================== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEMBQAwUTELMAkG +A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT +ZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgwNzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJ +BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU +U2VjdXJlU2lnbiBSb290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh +1oq/FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOgvlIfX8xn +bacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy6pJxaeQp8E+BgQQ8sqVb +1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa +/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9JkdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOE +kJTRX45zGRBdAuVwpcAQ0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSx +jVIHvXiby8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac18iz +ju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs0Wq2XSqypWa9a4X0 +dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIABSMbHdPTGrMNASRZhdCyvjG817XsY +AFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVLApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeq +YR3r6/wtbyPk86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E +rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ibed87hwriZLoA +ymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopTzfFP7ELyk+OZpDc8h7hi2/Ds +Hzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHSDCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPG +FrojutzdfhrGe0K22VoF3Jpf1d+42kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6q +nsb58Nn4DSEC5MUoFlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/ +OfVyK4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6dB7h7sxa +OgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtlLor6CZpO2oYofaphNdgO +pygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB365jJ6UeTo3cKXhZ+PmhIIynJkBugnLN +eLLIjzwec+fBH7/PzqUqm9tEZDKgu39cJRNItX+S +-----END CERTIFICATE----- + +SecureSign Root CA15 +==================== +-----BEGIN CERTIFICATE----- +MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMwUTELMAkGA1UE +BhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRTZWN1 +cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMyNTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNV +BAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2Vj +dXJlU2lnbiBSb290IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5G +dCx4wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSRZHX+AezB +2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT9DAKBggqhkjOPQQDAwNoADBlAjEA2S6J +fl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJ +SwdLZrWeqrqgHkHZAXQ6bkU6iYAZezKYVWOr62Nuk22rGwlgMU4= +-----END CERTIFICATE----- diff --git a/src/wp-includes/certificates/cacert.pem b/src/wp-includes/certificates/cacert.pem new file mode 100644 index 0000000000000..e8cc6c1c094f8 --- /dev/null +++ b/src/wp-includes/certificates/cacert.pem @@ -0,0 +1,3611 @@ +## +## Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Tue Dec 31 04:12:05 2024 GMT +## +## Find updated versions here: https://curl.se/docs/caextract.html +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## +## Conversion done with mk-ca-bundle.pl version 1.29. +## SHA256: c99d6d3f8d3d4e47719ba2b648992f5b58b150128d3aca3c05c566d8dc98e116 +## + + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ +KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy +T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT +J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e +nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +======================================== +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM +BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE +AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky +MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz +IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ +wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa +by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 +zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f +YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 +oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l +EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 +hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 +EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 +jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY +iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI +WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 +JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx +K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ +Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC +4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo +2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz +lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem +OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 +vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 EV 2009 +================================= +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv +w9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +CA Disig Root R2 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV +7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +ACCVRAIZ1 +========= +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p +EfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +TWCA Global Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= +-----END CERTIFICATE----- + +TeliaSonera Root CA v1 +====================== +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE +CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 +MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW +VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ +6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA +3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k +B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn +Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH +oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 +F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ +oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 +gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc +TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB +AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW +DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm +zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW +pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV +G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc +c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT +JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 +qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 +Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems +WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 2 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx +MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ +SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F +vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 +2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV +WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy +YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 +r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf +vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR +3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== +-----END CERTIFICATE----- + +Atos TrustedRoot 2011 +===================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU +cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 +MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG +A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV +hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr +54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ +DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 +HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR +z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R +l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ +bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h +k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh +TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 +61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G +3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +QuoVadis Root CA 1 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE +PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm +PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 +Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN +ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l +g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV +7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX +9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f +iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg +t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI +hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 +GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct +Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP ++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh +3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa +wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 +O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 +FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV +hMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +QuoVadis Root CA 2 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh +ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY +NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t +oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o +MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l +V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo +L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ +sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD +6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh +lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI +hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K +pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 +x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz +dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X +U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw +mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD +zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN +JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr +O3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +QuoVadis Root CA 3 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 +IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL +Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe +6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 +I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U +VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 +5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi +Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM +dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt +rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI +hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS +t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ +TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du +DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib +Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD +hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX +0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW +dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 +PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +DigiCert Assured ID Root G2 +=========================== +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw +MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH +35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq +bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw +VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP +YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn +lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO +w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv +0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz +d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW +hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M +jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +DigiCert Assured ID Root G3 +=========================== +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD +VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb +RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs +KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF +UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy +YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy +1vUhZscv6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +DigiCert Global Root G2 +======================= +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx +MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ +kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO +3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV +BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM +UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu +5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr +F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U +WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH +QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ +iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +DigiCert Global Root G3 +======================= +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD +VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw +MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k +aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C +AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O +YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp +Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y +3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 +VOKa5Vt8sycX +-----END CERTIFICATE----- + +DigiCert Trusted Root G4 +======================== +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw +HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp +pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o +k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa +vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY +QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 +MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm +mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 +f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH +dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 +oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY +ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr +yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy +7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah +ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN +5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb +/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa +5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK +G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP +82Z+ +-----END CERTIFICATE----- + +COMODO RSA Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn +dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ +FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ +5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG +x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX +2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL +OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 +sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C +GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 +WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt +rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ +nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg +tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW +sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp +pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA +zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq +ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 +7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I +LaZRfyHBNVOFBkpdn627G190 +-----END CERTIFICATE----- + +USERTrust RSA Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +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 +Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +USERTrust ECC Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 +0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez +nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV +HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB +HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu +9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R5 +=========================== +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 +SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS +h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx +uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 +yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +IdenTrust Commercial Root CA 1 +============================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS +b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES +MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB +IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld +hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ +mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi +1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C +XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl +3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy +NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV +WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg +xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix +uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI +hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg +ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt +ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV +YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX +feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro +kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe +2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz +Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R +cGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +IdenTrust Public Sector Root CA 1 +================================= +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv +ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV +UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS +b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy +P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 +Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI +rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf +qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS +mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn +ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh +LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v +iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL +4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B +Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw +DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A +mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt +GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt +m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx +NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 +Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI +ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC +ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ +3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy +bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug +b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw +HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT +DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx +OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP +/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz +HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU +s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y +TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx +AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 +0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z +iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi +nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ +vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO +e4pIb4tF9g== +-----END CERTIFICATE----- + +Entrust Root Certification Authority - EC1 +========================================== +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx +FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn +YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw +FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs +LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy +AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef +9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h +vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 +kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +CFCA EV ROOT +============ +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE +CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB +IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw +MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD +DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV +BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD +7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN +uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW +ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 +xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f +py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K +gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol +hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ +tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf +BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q +ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua +4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG +E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX +BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn +aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy +PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX +kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C +ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GB CA +=============================== +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG +EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw +MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds +b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX +scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP +rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk +9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o +Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg +GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI +hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD +dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 +VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui +HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +SZAFIR ROOT CA2 +=============== +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG +A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV +BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ +BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD +VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q +qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK +DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE +2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ +ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi +ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC +AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 +O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 +oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul +4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 ++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +Certum Trusted Network CA 2 +=========================== +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE +BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 +bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y +ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ +TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB +IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 +7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o +CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b +Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p +uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 +GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ +9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB +Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye +hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM +BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI +hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW +Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA +L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo +clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM +pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb +w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo +J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm +ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX +is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 +zAYspsbiDrW5viSP +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2015 +======================================================= +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT +BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 +aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx +MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg +QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV +BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw +MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv +bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh +iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ +6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd +FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr +i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F +GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 +fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu +iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI +hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ +D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM +d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y +d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn +82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb +davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F +Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt +J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa +JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q +p/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions ECC RootCA 2015 +=========================================================== +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 +aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw +MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj +IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD +VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 +Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP +dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK +Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA +GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn +dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +ISRG Root X1 +============ +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE +BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD +EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG +EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT +DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r +Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 +3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K +b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN +Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ +4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf +1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu +hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH +usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r +OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY +9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV +0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt +hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw +TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx +e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA +JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD +YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n +JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ +m+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM +================ +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT +AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw +MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD +TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf +qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr +btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL +j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou +08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw +WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT +tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ +47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC +ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa +i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o +dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s +D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ +j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT +Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW ++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 +Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d +8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm +5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG +rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +Amazon Root CA 1 +================ +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 +MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH +FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ +gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t +dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce +VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 +DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM +CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy +8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa +2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 +xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +Amazon Root CA 2 +================ +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 +MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 +kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp +N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 +AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd +fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx +kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS +btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 +Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN +c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ +3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw +DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA +A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE +YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW +xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ +gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW +aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV +Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 +KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi +JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= +-----END CERTIFICATE----- + +Amazon Root CA 3 +================ +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB +f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr +Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 +rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc +eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +Amazon Root CA 4 +================ +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN +/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri +83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA +MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 +AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT +D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr +IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g +TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp +ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD +VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt +c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth +bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 +IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 +6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc +wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 +3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 +WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU +ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc +lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R +e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j +q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +GDCA TrustAUTH R5 ROOT +====================== +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw +BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD +DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow +YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs +AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p +OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr +pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ +9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ +xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM +R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ +D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 +oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx +9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 +H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 +6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd ++PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ +HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD +F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ +8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv +/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT +aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +SSL.com Root Certification Authority RSA +======================================== +-----BEGIN CERTIFICATE----- +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 +WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +SSL.com Root Certification Authority ECC +======================================== +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv +BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy +MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO +BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ +8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR +hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT +jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW +e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z +5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority RSA R2 +============================================== +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w +DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u +MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI +DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD +VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh +hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w +cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO +Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ +B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh +CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim +9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto +RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm +JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 ++qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp +qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 +++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx +Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G +guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz +OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 +CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq +lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR +rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 +hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX +9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority ECC +=========================================== +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy +BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw +MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx +EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM +LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy +3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O +BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe +5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ +N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm +m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +GlobalSign Root CA - R6 +======================= +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX +R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i +YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs +U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss +grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE +3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF +vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM +PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ +azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O +WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy +CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP +0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN +b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV +HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 +lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY +BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym +Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr +3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 +0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T +uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK +oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t +JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GC CA +=============================== +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD +SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo +MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa +Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL +ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr +VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab +NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E +AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk +AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +UCA Global G2 Root +================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x +NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU +cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT +oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV +8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS +h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o +LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/ +R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe +KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa +4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc +OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97 +8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo +5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A +Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9 +yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX +c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo +jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk +bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x +ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn +RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A== +-----END CERTIFICATE----- + +UCA Extended Validation Root +============================ +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u +IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G +A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs +iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF +Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu +eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR +59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH +0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR +el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv +B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth +WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS +NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS +3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL +BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM +aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4 +dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb ++7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW +F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi +GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc +GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi +djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr +dhh2n1ax +-----END CERTIFICATE----- + +Certigna Root CA +================ +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE +BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ +MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda +MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz +MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX +stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz +KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8 +JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16 +XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq +4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej +wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ +lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI +jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/ +/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy +dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h +LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl +cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt +OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP +TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq +7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3 +4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd +8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS +6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY +tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS +aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde +E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +emSign Root CA - G1 +=================== +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET +MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl +ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx +ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk +aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN +LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1 +cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW +DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ +6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH +hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2 +vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q +NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q ++Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih +U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +emSign ECC Root CA - G3 +======================= +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG +A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg +MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4 +MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11 +ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc +58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr +MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D +CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7 +jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +emSign Root CA - C1 +=================== +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx +EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp +Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD +ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up +ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/ +Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX +OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V +I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms +lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+ +XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD +ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp +/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1 +NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9 +wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ +BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +emSign ECC Root CA - C3 +======================= +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG +A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF +Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD +ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd +6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9 +SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA +B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA +MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU +ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +Hongkong Post Root CA 3 +======================= +-----BEGIN CERTIFICATE----- +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 +dBb9HxEGmpv0 +-----END CERTIFICATE----- + +Microsoft ECC Root Certificate Authority 2017 +============================================= +-----BEGIN CERTIFICATE----- +MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND +IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4 +MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw +NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6 +thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB +eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM ++Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf +Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR +eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= +-----END CERTIFICATE----- + +Microsoft RSA Root Certificate Authority 2017 +============================================= +-----BEGIN CERTIFICATE----- +MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG +EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg +UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw +NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u +MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml +7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e +S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7 +1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+ +dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F +yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS +MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr +lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ +0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ +ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og +6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80 +dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk ++ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex +/2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy +AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW +ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE +7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT +c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D +5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E +-----END CERTIFICATE----- + +e-Szigno Root CA 2017 +===================== +-----BEGIN CERTIFICATE----- +MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw +DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt +MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa +Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE +CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp +Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx +s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G +A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv +vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA +tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO +svxyqltZ+efcMQ== +-----END CERTIFICATE----- + +certSIGN Root CA G2 +=================== +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw +EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy +MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH +TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05 +N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk +abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg +wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp +dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh +ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732 +jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf +95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc +z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL +iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud +DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB +ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB +/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5 +8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5 +BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW +atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU +Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M +NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N +0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc= +-----END CERTIFICATE----- + +Trustwave Global Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +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 +29FpHOTKyeC2nOnOcXHebD8WpHk= +-----END CERTIFICATE----- + +Trustwave Global ECC P256 Certification Authority +================================================= +-----BEGIN CERTIFICATE----- +MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1 +NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj +43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm +P62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt +0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz +RM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 +-----END CERTIFICATE----- + +Trustwave Global ECC P384 Certification Authority +================================================= +-----BEGIN CERTIFICATE----- +MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4 +NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH +Ba5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr +/TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV +HQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn +ADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl +CrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw== +-----END CERTIFICATE----- + +NAVER Global Root Certification Authority +========================================= +-----BEGIN CERTIFICATE----- +MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEMBQAwaTELMAkG +A1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRGT1JNIENvcnAuMTIwMAYDVQQD +DClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4 +NDJaFw0zNzA4MTgyMzU5NTlaMGkxCzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVT +UyBQTEFURk9STSBDb3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVAiQqrDZBb +UGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH38dq6SZeWYp34+hInDEW ++j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lEHoSTGEq0n+USZGnQJoViAbbJAh2+g1G7 +XNr4rRVqmfeSVPc0W+m/6imBEtRTkZazkVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2 +aacp+yPOiNgSnABIqKYPszuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4 +Yb8ObtoqvC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHfnZ3z +VHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaGYQ5fG8Ir4ozVu53B +A0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo0es+nPxdGoMuK8u180SdOqcXYZai +cdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3aCJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejy +YhbLgGvtPe31HzClrkvJE+2KAQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNV +HQ4EFgQU0p+I36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoNqo0hV4/GPnrK +21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatjcu3cvuzHV+YwIHHW1xDBE1UB +jCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bx +hYTeodoS76TiEJd6eN4MUZeoIUCLhr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTg +E34h5prCy8VCZLQelHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTH +D8z7p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8piKCk5XQ +A76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLRLBT/DShycpWbXgnbiUSY +qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG +I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg +kpzNNIaRkPpkUZ3+/uul9XXeifdy +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM SERVIDORES SEGUROS +=================================== +-----BEGIN CERTIFICATE----- +MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF +UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy +NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4 +MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt +UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB +QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2 +LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG +SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD +zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c= +-----END CERTIFICATE----- + +GlobalSign Root R46 +=================== +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv +b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX +BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es +CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/ +r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje +2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt +bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj +K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4 +12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on +ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls +eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9 +vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM +BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg +JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy +gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92 +CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm +OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq +JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye +qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz +nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7 +DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3 +QEUxeCp6 +-----END CERTIFICATE----- + +GlobalSign Root E46 +=================== +-----BEGIN CERTIFICATE----- +MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT +AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg +RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV +BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB +jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj +QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL +gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk +vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+ +CAezNIm8BZ/3Hobui3A= +-----END CERTIFICATE----- + +GLOBALTRUST 2020 +================ +-----BEGIN CERTIFICATE----- +MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx +IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT +VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh +BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy +MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi +D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO +VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM +CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm +fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA +A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR +JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG +DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU +clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ +mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud +IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA +VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw +4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9 +iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS +8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2 +HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS +vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918 +oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF +YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl +gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== +-----END CERTIFICATE----- + +ANF Secure Server Root CA +========================= +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Certum EC-384 CA +================ +-----BEGIN CERTIFICATE----- +MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ +TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2 +MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh +dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq +vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn +iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo +ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0 +QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= +-----END CERTIFICATE----- + +Certum Trusted Root CA +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +TunTrust Root CA +================ +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +HARICA TLS RSA Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG +EwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz +OFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl +bWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB +IFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN +JLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu +a2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y +Ulhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K +5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv +dmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR +0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH +GjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm +haZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ +CPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU +EapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq +QRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD +QpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR +j88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5 +vZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0 +qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6 +Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/ +PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn +kf3/W9b3raYvAwtt41dU63ZTGI0RmLo= +-----END CERTIFICATE----- + +HARICA TLS ECC Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH +UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD +QTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX +DTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj +IGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv +b3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l +AEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b +ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW +0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi +rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw +CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1Ud +DgQWBBRlzeurNR4APn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4w +gZswgZgGBFUdIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j +b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4A +bwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL +4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDb +LIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1il +I45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZEEAEeiGaP +cjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV1aUsIC+nmCjuRfzxuIgA +LI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2ebKHTEm9caPARYpoKdrcd7b/+A +lun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH +9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpf +NIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqE +ZycPvEJdvSRUDewdcAZfpLz6IHxV +-----END CERTIFICATE----- + +vTrus ECC Root CA +================= +-----BEGIN CERTIFICATE----- +MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkGA1UE +BhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBS +b290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAa +BgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+c +ToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUde4BdS49n +TPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UT +QJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQL +YgmRWAD5Tfs0aNoJrSEGGJTO +-----END CERTIFICATE----- + +vTrus Root CA +============= +-----BEGIN CERTIFICATE----- +MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzELMAkG +A1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZUcnVzIFJv +b3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoG +A1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZots +SKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykUAyyNJJrI +ZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+GrPSbcKvdmaVayqwlHeF +XgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z98Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KA +YPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70 +kLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2 +AXPKBlim0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu +/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu +1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO +9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYg +scasGrz2iTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC +AgEAKbqSSaet8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd +nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjr +jld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4 +8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJn +xDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554Wg +icEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4 +sEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNBUvupLnKW +nyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1PTi07NEPhmg4NpGaXutIc +SkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy6K2ir40zSbofitzmdHxghm+H +l3s= +-----END CERTIFICATE----- + +ISRG Root X2 +============ +-----BEGIN CERTIFICATE----- +MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQGEwJV +UzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElT +UkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVT +MSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNS +RyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H +ttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9ItgKbppb +d9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZIzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtF +cP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5 +U6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tbFfLn +-----END CERTIFICATE----- + +HiPKI Root CA - G1 +================== +-----BEGIN CERTIFICATE----- +MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMMEkhpUEtJ +IFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYT +AlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kg +Um9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0 +o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twvVcg3Px+k +wJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SE +YYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsA +GJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd +hSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj +1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K4 +9a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/ +Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF +8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQD +AgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi +7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSl +tJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE +wx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07Q +JNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv +5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+Gpz +jLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wrkkVbbiVg +hUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+vhV4nYWBSipX3tUZQ9rb +yltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/ +yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R4 +=========================== +-----BEGIN CERTIFICATE----- +MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkW +ymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNVHQ8BAf8E +BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/+wpu+74zyTyjhNUwCgYI +KoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147bmF0774BxL4YSFlhgjICICadVGNA3jdg +UM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm +-----END CERTIFICATE----- + +GTS Root R1 +=========== +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0 +xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+w +B7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXW +nOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk +9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zq +kUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1A +K/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPX +V2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDW +cfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQAD +ggIBAJ+qQibbC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe +QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRi +ClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar +J45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYci +NuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5me +LMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJF +fbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ0E6yove+ +7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm2tIMPNuzjsmhDYAPexZ3 +FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3 +gm3c +-----END CERTIFICATE----- + +GTS Root R2 +=========== +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo7JUl +e3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wb +a96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS ++LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7M +kogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJG +r61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9q +S34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNV +J1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okL +dWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQAD +ggIBAB/Kzt3HvqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 +0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyCB19m3H0Q/gxh +swWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2uNmSRXbBoGOqKYcl3qJfEycel +/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMgyALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVn +jWQye+mew4K6Ki3pHrTgSAai/GevHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y5 +9PYjJbigapordwj6xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M +7YNRTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924SgJPFI/2R8 +0L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV7LXTWtiBmelDGDfrs7vR +WGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjW +HYbL +-----END CERTIFICATE----- + +GTS Root R3 +=========== +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/Eq +Er24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azT +L818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV +11RZt+cRLInUue4X +-----END CERTIFICATE----- + +GTS Root R4 +=========== +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1 +PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C +r8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh +4rsUecrNIdSUtUlD +-----END CERTIFICATE----- + +Telia Root CA v2 +================ +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNVBAYT +AkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2 +MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQK +DBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ7 +6zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9vVYiQJ3q +9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9lRdU2HhE8Qx3FZLgmEKn +pNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTODn3WhUidhOPFZPY5Q4L15POdslv5e2QJl +tI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW +5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNr +RBH0pUPCTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0E +BXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4 +M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbau +BcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7W +xy+G2CQ5MB0GA1UdDgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ +8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5 +tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H +eW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+C +y748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygC +QMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15 +h2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMtTy3EHD70 +sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pTVmBds9hCG1xLEooc6+t9 +xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQ +raVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc= +-----END CERTIFICATE----- + +D-TRUST BR Root CA 1 2020 +========================= +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7 +dPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0QVK5buXu +QqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/VbNafAkl1bK6CKBrqx9t +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70Pvom +AjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87 +-----END CERTIFICATE----- + +D-TRUST EV Root CA 1 2020 +========================= +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8 +ZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rDwpdhQntJ +raOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3OqQo5FD4pPfsazK2/umL +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR +AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW +-----END CERTIFICATE----- + +DigiCert TLS ECC P384 Root G5 +============================= +-----BEGIN CERTIFICATE----- +MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4 +NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg +Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd +lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj +n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB +/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds +Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx +AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA== +-----END CERTIFICATE----- + +DigiCert TLS RSA4096 Root G5 +============================ +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG +EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0 +MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2 +IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8 +7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU +AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces +tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa +zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV +DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q +TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy +z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/ +MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk +wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E +FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw +GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN +lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN +MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/ +u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G +OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh +47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU +FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ +yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP +bEtoL8pU9ozaMv7Da4M/OMZ+ +-----END CERTIFICATE----- + +Certainly Root R1 +================= +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE +BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN +MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy +dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O +5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl +8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl +DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI +XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN +KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ +AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb +rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1 +VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS +p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz +HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d +8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v +MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB +GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+ +gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH +JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7 +fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw +x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S +X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8= +-----END CERTIFICATE----- + +Certainly Root E1 +================= +-----BEGIN CERTIFICATE----- +MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV +UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0 +MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu +bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4 +fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9 +YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E +AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8 +rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR +-----END CERTIFICATE----- + +Security Communication ECC RootCA1 +================================== +-----BEGIN CERTIFICATE----- +MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD +VQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t +dW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL +MAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV +BAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo +5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW +BBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK +BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L +snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e +N9k= +-----END CERTIFICATE----- + +BJCA Global Root CA1 +==================== +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQG +EwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJK +Q0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAzMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkG +A1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQD +DBRCSkNBIEdsb2JhbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFm +CL3ZxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZspDyRhyS +sTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O558dnJCNPYwpj9mZ9S1Wn +P3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgRat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcW +yqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRj +eulumijWML3mG90Vr4TqnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNn +MoH1V6XKV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/pj+b +OT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZOz2nxbkRs1CTqjSSh +GL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXnjSXWgXSHRtQpdaJCbPdzied9v3pK +H9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMB +AAGjQjBAMB0GA1UdDgQWBBTF7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 +YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3KliawLwQ8hOnThJ +dMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u+2D2/VnGKhs/I0qUJDAnyIm8 +60Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuh +TaRjAv04l5U/BXCga99igUOLtFkNSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW +4AB+dAb/OMRyHdOoP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmp +GQrI+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRzznfSxqxx +4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9eVzYH6Eze9mCUAyTF6ps +3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4S +SPfSKcOYKMryMguTjClPPGAyzQWWYezyr/6zcCwupvI= +-----END CERTIFICATE----- + +BJCA Global Root CA2 +==================== +-----BEGIN CERTIFICATE----- +MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQswCQYDVQQGEwJD +TjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJKQ0Eg +R2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgyMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UE +BhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRC +SkNBIEdsb2JhbCBSb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jl +SR9BIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK++kpRuDCK +/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJKsVF/BvDRgh9Obl+rg/xI +1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8 +W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8g +UXOQwKhbYdDFUDn9hf7B43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== +-----END CERTIFICATE----- + +Sectigo Public Server Authentication Root E46 +============================================= +-----BEGIN CERTIFICATE----- +MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQswCQYDVQQGEwJH +QjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBTZXJ2 +ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5 +WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0 +aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUr +gQQAIgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccCWvkEN/U0 +NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+6xnOQ6OjQjBAMB0GA1Ud +DgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAKBggqhkjOPQQDAwNnADBkAjAn7qRaqCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RH +lAFWovgzJQxC36oCMB3q4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21U +SAGKcw== +-----END CERTIFICATE----- + +Sectigo Public Server Authentication Root R46 +============================================= +-----BEGIN CERTIFICATE----- +MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBfMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT +ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1 +OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T +ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3 +DQEBAQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDaef0rty2k +1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnzSDBh+oF8HqcIStw+Kxwf +GExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xfiOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMP +FF1bFOdLvt30yNoDN9HWOaEhUTCDsG3XME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vu +ZDCQOc2TZYEhMbUjUDM3IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5Qaz +Yw6A3OASVYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgESJ/A +wSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu+Zd4KKTIRJLpfSYF +plhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt8uaZFURww3y8nDnAtOFr94MlI1fZ +EoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+LHaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW +6aWWrL3DkJiy4Pmi1KZHQ3xtzwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWI +IUkwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c +mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQYKlJfp/imTYp +E0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52gDY9hAaLMyZlbcp+nv4fjFg4 +exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZAFv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M +0ejf5lG5Nkc/kLnHvALcWxxPDkjBJYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI +84HxZmduTILA7rpXDhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9m +pFuiTdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5dHn5Hrwd +Vw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65LvKRRFHQV80MNNVIIb/b +E/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmm +J1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAYQqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL +-----END CERTIFICATE----- + +SSL.com TLS RSA Root CA 2022 +============================ +-----BEGIN CERTIFICATE----- +MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQG +EwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBSU0Eg +Um9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloXDTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMC +VVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJv +b3QgQ0EgMjAyMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u +9nTPL3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OYt6/wNr/y +7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0insS657Lb85/bRi3pZ7Qcac +oOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3PnxEX4MN8/HdIGkWCVDi1FW24IBydm5M +R7d1VVm0U3TZlMZBrViKMWYPHqIbKUBOL9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDG +D6C1vBdOSHtRwvzpXGk3R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEW +TO6Af77wdr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS+YCk +8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYSd66UNHsef8JmAOSq +g+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoGAtUjHBPW6dvbxrB6y3snm/vg1UYk +7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2fgTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsu +N+7jhHonLs0ZNbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt +hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsMQtfhWsSWTVTN +j8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvfR4iyrT7gJ4eLSYwfqUdYe5by +iB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJDPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjU +o3KUQyxi4U5cMj29TH0ZR6LDSeeWP4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqo +ENjwuSfr98t67wVylrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7Egkaib +MOlqbLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2wAgDHbICi +vRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3qr5nsLFR+jM4uElZI7xc7 +P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sjiMho6/4UIyYOf8kpIEFR3N+2ivEC+5BB0 +9+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA= +-----END CERTIFICATE----- + +SSL.com TLS ECC Root CA 2022 +============================ +-----BEGIN CERTIFICATE----- +MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV +UzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBFQ0MgUm9v +dCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMx +GDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3Qg +Q0EgMjAyMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWy +JGYmacCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFNSeR7T5v1 +5wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSJjy+j6CugFFR7 +81a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NWuCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGG +MAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w +7deedWo1dlJF4AIxAMeNb0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5 +Zn6g6g== +-----END CERTIFICATE----- + +Atos TrustedRoot Root CA ECC TLS 2021 +===================================== +-----BEGIN CERTIFICATE----- +MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4wLAYDVQQDDCVB +dG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQswCQYD +VQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3Mg +VHJ1c3RlZFJvb3QgUm9vdCBDQSBFQ0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYT +AkRFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6K +DP/XtXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4AjJn8ZQS +b+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2KCXWfeBmmnoJsmo7jjPX +NtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIwW5kp85wxtolrbNa9d+F851F+ +uDrNozZffPc8dz7kUK2o59JZDCaOMDtuCCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGY +a3cpetskz2VAv9LcjBHo9H1/IISpQuQo +-----END CERTIFICATE----- + +Atos TrustedRoot Root CA RSA TLS 2021 +===================================== +-----BEGIN CERTIFICATE----- +MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBMMS4wLAYDVQQD +DCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQsw +CQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0 +b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNV +BAYTAkRFMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BB +l01Z4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYvYe+W/CBG +vevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZkmGbzSoXfduP9LVq6hdK +ZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDsGY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt +0xU6kGpn8bRrZtkh68rZYnxGEFzedUlnnkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVK +PNe0OwANwI8f4UDErmwh3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMY +sluMWuPD0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzygeBY +Br3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8ANSbhqRAvNncTFd+ +rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezBc6eUWsuSZIKmAMFwoW4sKeFYV+xa +fJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lIpw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUdEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0G +CSqGSIb3DQEBDAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS +4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPso0UvFJ/1TCpl +Q3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJqM7F78PRreBrAwA0JrRUITWX +AdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuywxfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9G +slA9hGCZcbUztVdF5kJHdWoOsAgMrr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2Vkt +afcxBPTy+av5EzH4AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9q +TFsR0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuYo7Ey7Nmj +1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5dDTedk+SKlOxJTnbPP/l +PqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcEoji2jbDwN/zIIX8/syQbPYtuzE2wFg2W +HYMfRsCbvUOZ58SWLs5fyQ== +-----END CERTIFICATE----- + +TrustAsia Global Root CA G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEMBQAwWjELMAkG +A1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMM +G1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAeFw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEw +MTlaMFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMu +MSQwIgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNST1QY4Sxz +lZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqKAtCWHwDNBSHvBm3dIZwZ +Q0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/V +P68czH5GX6zfZBCK70bwkPAPLfSIC7Epqq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1Ag +dB4SQXMeJNnKziyhWTXAyB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm +9WAPzJMshH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gXzhqc +D0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAvkV34PmVACxmZySYg +WmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msTf9FkPz2ccEblooV7WIQn3MSAPmea +mseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jAuPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCF +TIcQcf+eQxuulXUtgQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj +7zjKsK5Xf/IhMBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E +BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4wM8zAQLpw6o1 +D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2XFNFV1pF1AWZLy4jVe5jaN/T +G3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNj +duMNhXJEIlU/HHzp/LgV6FL6qj6jITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstl +cHboCoWASzY9M/eVVHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys ++TIxxHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1onAX1daBli +2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d7XB4tmBZrOFdRWOPyN9y +aFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2NtjjgKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsAS +ZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV+Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFR +JQJ6+N1rZdVtTTDIZbpoFGWsJwt0ivKH +-----END CERTIFICATE----- + +TrustAsia Global Root CA G4 +=========================== +-----BEGIN CERTIFICATE----- +MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMwWjELMAkGA1UE +BhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMMG1Ry +dXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0yMTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJa +MFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQw +IgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AATxs8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbwLxYI+hW8 +m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJijYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mDpm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/ +pDHel4NZg6ZvccveMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AA +bbd+NvBNEU/zy4k6LHiRUKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xk +dUfFVZDj/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA== +-----END CERTIFICATE----- + +CommScope Public Trust ECC Root-01 +================================== +-----BEGIN CERTIFICATE----- +MIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMwTjELMAkGA1UE +BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz +dCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNaFw00NjA0MjgxNzM1NDJaME4xCzAJBgNVBAYT +AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg +RUNDIFJvb3QtMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16ocNfQj3Rid8NeeqrltqLx +eP0CflfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOcw5tjnSCDPgYLpkJEhRGnSjot +6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggqhkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2 +Jpc1XHvr20v4qotzVRVcrHgpD7oh2MSg2NED3W3ROT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liW +pDVfG2XqYZpwI7UNo5uSUm9poIyNStDuiw7LR47QjRE= +-----END CERTIFICATE----- + +CommScope Public Trust ECC Root-02 +================================== +-----BEGIN CERTIFICATE----- +MIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMwTjELMAkGA1UE +BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz +dCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRaFw00NjA0MjgxNzQ0NTNaME4xCzAJBgNVBAYT +AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg +RUNDIFJvb3QtMDIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l63FRD/cHB8o5mXxO1Q/M +MDALj2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/ubCK1sK9IRQq9qEmUv4RDsNuE +SgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggqhkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9 +Uj/UQQSugEODZXW5hYA4O9Zv5JOGq4/nich/m35rChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs7 +3u1Z/GtMMH9ZzkXpc2AVmkzw5l4lIhVtwodZ0LKOag== +-----END CERTIFICATE----- + +CommScope Public Trust RSA Root-01 +================================== +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQELBQAwTjELMAkG +A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU +cnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1NTRaFw00NjA0MjgxNjQ1NTNaME4xCzAJBgNV +BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1 +c3QgUlNBIFJvb3QtMDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwSGWjDR1C45Ft +nYSkYZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2bKOx7dAvnQmtVzslhsuitQDy6 +uUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBWBB0HW0alDrJLpA6lfO741GIDuZNq +ihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3OjWiE260f6GBfZumbCk6SP/F2krfxQapWs +vCQz0b2If4b19bJzKo98rwjyGpg/qYFlP8GMicWWMJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/c +Zip8UlF1y5mO6D1cv547KI2DAg+pn3LiLCuz3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTif +BSeolz7pUcZsBSjBAg/pGG3svZwG1KdJ9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/kQO9 +lLvkuI6cMmPNn7togbGEW682v3fuHX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JOHg9O5j9ZpSPcPYeo +KFgo0fEbNttPxP/hjFtyjMcmAyejOQoBqsCyMWCDIqFPEgkBEa801M/XrmLTBQe0MXXgDW1XT2mH ++VepuhX2yFJtocucH+X8eKg1mp9BFM6ltM6UCBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm4 +5P3luG0wDQYJKoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6 +NWPxzIHIxgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQnmhUQo8mUuJM +3y+Xpi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+QgvfKNmwrZggvkN80V4aCRck +jXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2vtrV0KnahP/t1MJ+UXjulYPPLXAziDslg+Mkf +Foom3ecnf+slpoq9uC02EJqxWE2aaE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0DLwAHb/W +NyVntHKLr4W96ioDj8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/xBpMu95yo9GA+ +o/E4Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054A5U+1C0wlREQKC6/ +oAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHnYfkUyq+Dj7+vsQpZXdxc +1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVocicCMb3SgazNNtQEo/a2tiRc7ppqEvOuM +6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw +-----END CERTIFICATE----- + +CommScope Public Trust RSA Root-02 +================================== +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQELBQAwTjELMAkG +A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU +cnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2NDNaFw00NjA0MjgxNzE2NDJaME4xCzAJBgNV +BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1 +c3QgUlNBIFJvb3QtMDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDh+g77aAASyE3V +rCLENQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mnG2I81lDnNJUDMrG0kyI9p+Kx +7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0SFHRtI1CrWDaSWqVcN3SAOLMV2MC +e5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxzhkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2W +Wy09X6GDRl224yW4fKcZgBzqZUPckXk2LHR88mcGyYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rp +M9kzXzehxfCrPfp4sOcsn/Y+n2Dg70jpkEUeBVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIf +hs1w/tkuFT0du7jyU1fbzMZ0KZwYszZ1OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5kQMr +eyBUzQ0ZGshBMjTRsJnhkB4BQDa1t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3wNemKfrb3vOTlycE +VS8KbzfFPROvCgCpLIscgSjX74Yxqa7ybrjKaixUR9gqiC6vwQcQeKwRoi9C8DfF8rhW3Q5iLc4t +Vn5V8qdE9isy9COoR+jUKgF4z2rDN6ieZdIs5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7Gx +cJXvYXowDQYJKoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqB +KCh6krm2qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3+VGXu6TwYofF +1gbTl4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbymeAPnCKfWxkxlSaRosTKCL4BWa +MS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3NyqpgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv41xd +gSGn2rtO/+YHqP65DSdsu3BaVXoT6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u5cSoHw2O +HG1QAk8mGEPej1WFsQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FUmrh1CoFSl+Nm +YWvtPjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jauwy8CTl2dlklyALKr +dVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670v64fG9PiO/yzcnMcmyiQ +iRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17Org3bhzjlP1v9mxnhMUF6cKojawHhRUzN +lM47ni3niAIi9G7oyOzWPPO5std3eqx7 +-----END CERTIFICATE----- + +Telekom Security TLS ECC Root 2020 +================================== +-----BEGIN CERTIFICATE----- +MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQswCQYDVQQGEwJE +RTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJUZWxl +a29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIwMB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIz +NTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkg +R21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqG +SM49AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/OtdKPD/M1 +2kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDPf8iAC8GXs7s1J8nCG6NC +MEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6fMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZ +Mo7k+5Dck2TOrbRBR2Diz6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdU +ga/sf+Rn27iQ7t0l +-----END CERTIFICATE----- + +Telekom Security TLS RSA Root 2023 +================================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +FIRMAPROFESIONAL CA ROOT-A WEB +============================== +-----BEGIN CERTIFICATE----- +MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQswCQYDVQQGEwJF +UzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4 +MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENBIFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2 +WhcNNDcwMzMxMDkwMTM2WjBuMQswCQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25h +bCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFM +IENBIFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zfe9MEkVz6 +iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6CcyvHZpsKjECcfIr28jlg +st7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FD +Y1w8ndYn81LsF7Kpryz3dvgwHQYDVR0OBBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB +/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgL +cFBTApFwhVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dGXSaQ +pYXFuXqUPoeovQA= +-----END CERTIFICATE----- + +TWCA CYBER Root CA +================== +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQMQswCQYDVQQG +EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB +IENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQG +EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB +IENZQkVSIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1s +Ts6P40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxFavcokPFh +V8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/34bKS1PE2Y2yHer43CdT +o0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684iJkXXYJndzk834H/nY62wuFm40AZoNWDT +Nq5xQwTxaWV4fPMf88oon1oglWa0zbfuj3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK +/c/WMw+f+5eesRycnupfXtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkH +IuNZW0CP2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDAS9TM +fAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDAoS/xUgXJP+92ZuJF +2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzCkHDXShi8fgGwsOsVHkQGzaRP6AzR +wyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83 +QOGt4A1WNzAdBgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB +AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0ttGlTITVX1olN +c79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn68xDiBaiA9a5F/gZbG0jAn/x +X9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNnTKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDR +IG4kqIQnoVesqlVYL9zZyvpoBJ7tRCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq +/p1hvIbZv97Tujqxf36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0R +FxbIQh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz8ppy6rBe +Pm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4NxKfKjLji7gh7MMrZQzv +It6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzXxeSDwWrruoBa3lwtcHb4yOWHh8qgnaHl +IhInD0Q9HWzq1MKLL295q39QpsQZp6F6t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X +-----END CERTIFICATE----- + +SecureSign Root CA12 +==================== +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQELBQAwUTELMAkG +A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT +ZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgwNTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJ +BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU +U2VjdXJlU2lnbiBSb290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3 +emhFKxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mtp7JIKwcc +J/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zdJ1M3s6oYwlkm7Fsf0uZl +fO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gurFzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBF +EaCeVESE99g2zvVQR9wsMJvuwPWW0v4JhscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1Uef +NzFJM3IFTQy2VYzxV4+Kh9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsFAAOC +AQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6LdmmQOmFxv3Y67ilQi +LUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJmBClnW8Zt7vPemVV2zfrPIpyMpce +mik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPS +vWKErI4cqc1avTc7bgoitPQV55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhga +aaI5gdka9at/yOPiZwud9AzqVN/Ssq+xIvEg37xEHA== +-----END CERTIFICATE----- + +SecureSign Root CA14 +==================== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEMBQAwUTELMAkG +A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT +ZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgwNzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJ +BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU +U2VjdXJlU2lnbiBSb290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh +1oq/FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOgvlIfX8xn +bacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy6pJxaeQp8E+BgQQ8sqVb +1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa +/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9JkdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOE +kJTRX45zGRBdAuVwpcAQ0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSx +jVIHvXiby8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac18iz +ju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs0Wq2XSqypWa9a4X0 +dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIABSMbHdPTGrMNASRZhdCyvjG817XsY +AFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVLApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeq +YR3r6/wtbyPk86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E +rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ibed87hwriZLoA +ymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopTzfFP7ELyk+OZpDc8h7hi2/Ds +Hzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHSDCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPG +FrojutzdfhrGe0K22VoF3Jpf1d+42kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6q +nsb58Nn4DSEC5MUoFlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/ +OfVyK4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6dB7h7sxa +OgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtlLor6CZpO2oYofaphNdgO +pygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB365jJ6UeTo3cKXhZ+PmhIIynJkBugnLN +eLLIjzwec+fBH7/PzqUqm9tEZDKgu39cJRNItX+S +-----END CERTIFICATE----- + +SecureSign Root CA15 +==================== +-----BEGIN CERTIFICATE----- +MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMwUTELMAkGA1UE +BhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRTZWN1 +cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMyNTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNV +BAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2Vj +dXJlU2lnbiBSb290IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5G +dCx4wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSRZHX+AezB +2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT9DAKBggqhkjOPQQDAwNoADBlAjEA2S6J +fl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJ +SwdLZrWeqrqgHkHZAXQ6bkU6iYAZezKYVWOr62Nuk22rGwlgMU4= +-----END CERTIFICATE----- diff --git a/src/wp-includes/certificates/legacy-1024bit.pem b/src/wp-includes/certificates/legacy-1024bit.pem new file mode 100644 index 0000000000000..8499bd777b760 --- /dev/null +++ b/src/wp-includes/certificates/legacy-1024bit.pem @@ -0,0 +1,58 @@ +## +## Bundle of CA Root Certificates +## +## WordPress Modification - We prepend some unexpired 'legacy' 1024bit certificates +## for backward compatibility. See https://core.trac.wordpress.org/ticket/34935#comment:10 +## + + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA +TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah +WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf +Tqj/ZA1k +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO +FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 +lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT +1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD +Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky +CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX +bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ +D/xwzoiQ +-----END CERTIFICATE----- From 0dea78f34950c38477a0b3f0d10d999d33fffff9 Mon Sep 17 00:00:00 2001 From: Felix Arntz <flixos90@git.wordpress.org> Date: Thu, 30 Jan 2025 21:17:04 +0000 Subject: [PATCH 270/323] Editor: Fix block template registration failing for custom post types containing underscore characters. Custom post types may contain underscores, however block template registration has been using a regular expression that disallows underscores. Since the block template name for certain templates is directly associated with which post type it applies to, this regular expression was causing unexpected failures. This changeset adjusts the regular expression to allow block template names with underscore characters, effectively allowing block templates to be registered for any custom post type. Props alexandrebuffet, ankitkumarshah, gaambo, jorbin, karthickmurugan, oglekler, poena, sukhendu2002. Fixes #62523. git-svn-id: https://develop.svn.wordpress.org/trunk@59742 602fd350-edb4-49c9-b593-d223f7449a82 --- .../class-wp-block-templates-registry.php | 2 +- .../WpBlockTemplatesRegistry.php | 47 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/class-wp-block-templates-registry.php b/src/wp-includes/class-wp-block-templates-registry.php index 368c517fc9e27..1a1c259dba1dc 100644 --- a/src/wp-includes/class-wp-block-templates-registry.php +++ b/src/wp-includes/class-wp-block-templates-registry.php @@ -50,7 +50,7 @@ public function register( $template_name, $args = array() ) { } elseif ( preg_match( '/[A-Z]+/', $template_name ) ) { $error_message = __( 'Template names must not contain uppercase characters.' ); $error_code = 'template_name_no_uppercase'; - } elseif ( ! preg_match( '/^[a-z0-9-]+\/\/[a-z0-9-]+$/', $template_name ) ) { + } elseif ( ! preg_match( '/^[a-z0-9_\-]+\/\/[a-z0-9_\-]+$/', $template_name ) ) { $error_message = __( 'Template names must contain a namespace prefix. Example: my-plugin//my-custom-template' ); $error_code = 'template_no_prefix'; } elseif ( $this->is_registered( $template_name ) ) { diff --git a/tests/phpunit/tests/block-templates/WpBlockTemplatesRegistry.php b/tests/phpunit/tests/block-templates/WpBlockTemplatesRegistry.php index cc44d265e9dc3..a2b1d16eef618 100644 --- a/tests/phpunit/tests/block-templates/WpBlockTemplatesRegistry.php +++ b/tests/phpunit/tests/block-templates/WpBlockTemplatesRegistry.php @@ -267,4 +267,51 @@ public function test_unregister() { $this->assertEquals( $template, $unregistered_template, 'Unregistered template should be the same as the registered one.' ); $this->assertFalse( self::$registry->is_registered( $template_name ), 'Template should not be registered after unregistering.' ); } + + /** + * Data provider for test_template_name_validation. + * + * @return array[] Test data. + */ + public static function data_template_name_validation() { + return array( + 'valid_simple_name' => array( + 'my-plugin//my-template', + true, + 'Valid template name with simple characters should be accepted', + ), + 'valid_with_underscores' => array( + 'my-plugin//my_template', + true, + 'Template name with underscores should be accepted', + ), + 'valid_cpt_archive' => array( + 'my-plugin//archive-my_post_type', + true, + 'Template name for CPT archive with underscore should be accepted', + ), + ); + } + + /** + * Tests template name validation with various inputs. + * + * @ticket 62523 + * + * @dataProvider data_template_name_validation + * + * @param string $template_name The template name to test. + * @param bool $expected Expected validation result. + * @param string $message Test assertion message. + */ + public function test_template_name_validation( $template_name, $expected, $message ) { + $result = self::$registry->register( $template_name, array() ); + + if ( $expected ) { + self::$registry->unregister( $template_name ); + $this->assertNotWPError( $result, $message ); + } else { + $this->assertWPError( $result, $message ); + } + } } From 7c6678f2c20a09edc10d10ab14665d26ebb01754 Mon Sep 17 00:00:00 2001 From: Joe Dolson <joedolson@git.wordpress.org> Date: Thu, 30 Jan 2025 23:36:38 +0000 Subject: [PATCH 271/323] Administration: Fix undefined element JS error in pagination handler. Follow up to [59727]. Handle cases where the `#current-page-selector` is not present on the page to prevent a JS warning. Props tobiasbg, mamaduka, jorbin, joedolson. See #62534. git-svn-id: https://develop.svn.wordpress.org/trunk@59746 602fd350-edb4-49c9-b593-d223f7449a82 --- src/js/_enqueues/admin/common.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/js/_enqueues/admin/common.js b/src/js/_enqueues/admin/common.js index c7415d02c38da..590796f4b2a04 100644 --- a/src/js/_enqueues/admin/common.js +++ b/src/js/_enqueues/admin/common.js @@ -1310,16 +1310,12 @@ $( function() { $document.trigger( 'wp-notice-added' ); }; - // Stores initial pagination value for comparison. - var initialPagedValue = document.querySelector( '#current-page-selector' ).value; - $( '.bulkactions' ).parents( 'form' ).on( 'submit', function( event ) { var form = this, - submitterName = event.originalEvent && event.originalEvent.submitter ? event.originalEvent.submitter.name : false; - - var currentPagedValue = form.querySelector( '#current-page-selector' ).value; + submitterName = event.originalEvent && event.originalEvent.submitter ? event.originalEvent.submitter.name : false, + currentPageSelector = form.querySelector( '#current-page-selector' ); - if ( initialPagedValue !== currentPagedValue ) { + if ( currentPageSelector && currentPageSelector.defaultValue !== currentPageSelector.value ) { return; // Pagination form submission. } From c5755bea94b47f366a9a998fd4367af4e2dd1781 Mon Sep 17 00:00:00 2001 From: Aaron Jorbin <jorbin@git.wordpress.org> Date: Fri, 31 Jan 2025 02:20:54 +0000 Subject: [PATCH 272/323] Documentation: Update `@since` to reflect version this might ship in. When originally committed, this code was targeting 6.7.1. However, it was not backported and included in 6.7.1. Will this be followed up by another version change? You'll need to stay tuned to next week's episode of "As the WordPress Turns" to find out! Follow-up to [59285] and [59364]. See #62270. git-svn-id: https://develop.svn.wordpress.org/trunk@59747 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/html-api/class-wp-html-processor.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/html-api/class-wp-html-processor.php b/src/wp-includes/html-api/class-wp-html-processor.php index 2bc38b305a9f2..d64574e2a8db2 100644 --- a/src/wp-includes/html-api/class-wp-html-processor.php +++ b/src/wp-includes/html-api/class-wp-html-processor.php @@ -749,7 +749,7 @@ public function next_tag( $query = null ): bool { * WP_HTML_Tag_Processor instead. * * @since 6.5.0 Added for internal support; do not use. - * @since 6.7.1 Refactored so subclasses may extend. + * @since 6.7.2 Refactored so subclasses may extend. * * @return bool Whether a token was parsed. */ @@ -770,7 +770,7 @@ public function next_token(): bool { * this method similarly to how {@see WP_HTML_Tag_Processor::next_token()} * calls the {@see WP_HTML_Tag_Processor::base_class_next_token()} method. * - * @since 6.7.1 Added for internal support. + * @since 6.7.2 Added for internal support. * * @access private * From bb0725000d7ceac8d5e75c4bf16fe948520aac1d Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Fri, 31 Jan 2025 21:52:07 +0000 Subject: [PATCH 273/323] Coding Standards: Replace loose comparison in `wp_xmlrpc_server::wp_setOptions()`. Follow-up to [8114]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59748 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-xmlrpc-server.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index 81dc57f7d1e15..a406b63105d6e 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -4330,7 +4330,7 @@ public function wp_setOptions( $args ) { continue; } - if ( true == $this->blog_options[ $o_name ]['readonly'] ) { + if ( $this->blog_options[ $o_name ]['readonly'] ) { continue; } From 1111166932c228163f512ae47e559a4fda6aa806 Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Sat, 1 Feb 2025 20:15:09 +0000 Subject: [PATCH 274/323] Build/Test Tools: Parallelise the performance tests. This change introduces a job matrix for the "current", "before", and "base" performance tests to replace the current behaviour of running them sequentially in a single job. This speeds up the overall performance testing workflow and also reduces the chance of any given test interfering with another, for example by making a change to data in the database that affects a subsequent test. Props johnbillion, swissspidy, dmsnell, joemcgill. See #62221 git-svn-id: https://develop.svn.wordpress.org/trunk@59749 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/performance.yml | 68 ++++- .../reusable-performance-report-v2.yml | 114 ++++++++ .../reusable-performance-test-v2.yml | 270 ++++++++++++++++++ 3 files changed, 449 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/reusable-performance-report-v2.yml create mode 100644 .github/workflows/reusable-performance-test-v2.yml diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index fc29f0c015ee1..27339c1eefc41 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -33,6 +33,7 @@ on: # Confirm any changes to relevant workflow files. - '.github/workflows/performance.yml' - '.github/workflows/reusable-performance.yml' + - '.github/workflows/reusable-performance-*.yml' workflow_dispatch: # Cancels all previous workflow runs for pull requests that have not completed. @@ -47,21 +48,82 @@ concurrency: permissions: {} jobs: + determine-matrix: + name: Determine Matrix + runs-on: ubuntu-24.04 + if: ${{ ( github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' ) && ! contains( github.event.before, '00000000' ) }} + permissions: {} + env: + TARGET_SHA: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }} + outputs: + subjects: ${{ steps.set-subjects.outputs.result }} + target_sha: ${{ env.TARGET_SHA }} + steps: + # The `workflow_dispatch` event is the only one missing the needed SHA to target. + - name: Retrieve previous commit SHA (if necessary) + if: ${{ github.event_name == 'workflow_dispatch' }} + run: echo "TARGET_SHA=$(git rev-parse HEAD^1)" >> "$GITHUB_ENV" + + - name: Set subjects + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + id: set-subjects + with: + script: | + const artifacts = await github.rest.actions.listArtifactsForRepo({ + owner: context.repo.owner, + repo: context.repo.repo, + name: 'wordpress-build-' + process.env.TARGET_SHA, + }); + const has_previous_build = !! artifacts.data.artifacts[0]; + + const subjects = [ + 'current', + ]; + + if ( context.eventName === 'push' && context.ref === 'refs/heads/trunk' ) { + subjects.push( 'base' ); + } else if ( has_previous_build ) { + subjects.push( 'before' ); + } + + return subjects; + # Runs the performance test suite. performance: - name: ${{ matrix.multisite && 'Multisite' || 'Single site' }} - uses: ./.github/workflows/reusable-performance.yml + name: ${{ matrix.multisite && 'Multisite' || 'Single Site' }} ${{ matrix.memcached && 'Memcached' || 'Default' }} + uses: ./.github/workflows/reusable-performance-test-v2.yml + needs: [ determine-matrix ] + permissions: + contents: read + strategy: + fail-fast: false + matrix: + memcached: [ true, false ] + multisite: [ true, false ] + subject: ${{ fromJson( needs.determine-matrix.outputs.subjects ) }} + with: + memcached: ${{ matrix.memcached }} + multisite: ${{ matrix.multisite }} + subject: ${{ matrix.subject }} + TARGET_SHA: ${{ needs.determine-matrix.outputs.target_sha }} + + compare: + name: ${{ matrix.label }} + uses: ./.github/workflows/reusable-performance-report-v2.yml + needs: [ determine-matrix, performance ] permissions: contents: read - if: ${{ ( github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' ) }} strategy: fail-fast: false matrix: memcached: [ true, false ] multisite: [ true, false ] + label: [ Compare ] with: memcached: ${{ matrix.memcached }} multisite: ${{ matrix.multisite }} + BASE_TAG: ${{ needs.performance.outputs.BASE_TAG }} + publish: ${{ contains( fromJson( needs.determine-matrix.outputs.subjects ), 'base' ) && ! matrix.memcached && ! matrix.multisite }} secrets: CODEVITALS_PROJECT_TOKEN: ${{ secrets.CODEVITALS_PROJECT_TOKEN }} diff --git a/.github/workflows/reusable-performance-report-v2.yml b/.github/workflows/reusable-performance-report-v2.yml new file mode 100644 index 0000000000000..880945541e4e8 --- /dev/null +++ b/.github/workflows/reusable-performance-report-v2.yml @@ -0,0 +1,114 @@ +## +# A reusable workflow that compares and publishes the performance tests. +## +name: Compare and publish performance Tests + +on: + workflow_call: + inputs: + BASE_TAG: + description: 'The version being used for baseline measurements.' + required: true + type: string + memcached: + description: 'Whether to enable memcached.' + required: false + type: boolean + default: false + multisite: + description: 'Whether to use Multisite.' + required: false + type: boolean + default: false + publish: + description: 'Whether to publish the results to Code Vitals.' + required: false + type: boolean + default: false + secrets: + CODEVITALS_PROJECT_TOKEN: + description: 'The authorization token for https://www.codevitals.run/project/wordpress.' + required: false + +env: + BASE_TAG: ${{ inputs.BASE_TAG }} + +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + +jobs: + # Performs the following steps: + # - Checkout repository. + # - Set up Node.js. + # - Download the relevant performance test artifacts. + # - List the downloaded files for debugging. + # - Compare results. + # - Add workflow summary. + # - Determine the sha of the baseline tag if necessary. + # - Publish performance results if necessary. + compare: + name: ${{ inputs.multisite && 'Multisite' || 'Single Site' }} ${{ inputs.memcached && 'Memcached' || 'Default' }} ${{ inputs.publish && '(Publishes)' || '' }} + runs-on: ubuntu-24.04 + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + fetch-depth: ${{ github.event_name == 'workflow_dispatch' && '2' || '1' }} + persist-credentials: false + + - name: Set up Node.js + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + with: + node-version-file: '.nvmrc' + cache: npm + + - name: Download artifacts + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + pattern: performance-${{ inputs.multisite && 'multisite' || 'single' }}-${{ inputs.memcached && 'memcached' || 'default' }}-* + path: artifacts + merge-multiple: true + + - name: List files + run: tree artifacts + + - name: Compare results + run: node ./tests/performance/compare-results.js "${RUNNER_TEMP}/summary.md" + + - name: Add workflow summary + run: cat "${RUNNER_TEMP}/summary.md" >> "$GITHUB_STEP_SUMMARY" + + - name: Set the base sha + # Only needed when publishing results. + if: ${{ inputs.publish }} + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + id: base-sha + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + result-encoding: string + script: | + const baseRef = await github.rest.git.getRef({ + owner: context.repo.owner, + repo: context.repo.repo, + ref: 'tags/' + process.env.BASE_TAG, + }); + return baseRef.data.object.sha; + + - name: Publish performance results + if: ${{ inputs.publish }} + env: + BASE_SHA: ${{ steps.base-sha.outputs.result }} + CODEVITALS_PROJECT_TOKEN: ${{ secrets.CODEVITALS_PROJECT_TOKEN }} + HOST_NAME: www.codevitals.run + run: | + if [ -z "$CODEVITALS_PROJECT_TOKEN" ]; then + echo "Performance results could not be published. 'CODEVITALS_PROJECT_TOKEN' is not set" + exit 1 + fi + COMMITTED_AT="$(git show -s "$GITHUB_SHA" --format='%cI')" + node ./tests/performance/log-results.js "$CODEVITALS_PROJECT_TOKEN" trunk "$GITHUB_SHA" "$BASE_SHA" "$COMMITTED_AT" "$HOST_NAME" diff --git a/.github/workflows/reusable-performance-test-v2.yml b/.github/workflows/reusable-performance-test-v2.yml new file mode 100644 index 0000000000000..421bb129ebe12 --- /dev/null +++ b/.github/workflows/reusable-performance-test-v2.yml @@ -0,0 +1,270 @@ +## +# A reusable workflow that runs the performance test suite. +## +name: Run performance Tests + +on: + workflow_call: + inputs: + subject: + description: Subject of the test. One of `current`, `before`, or `base`. + required: true + type: string + LOCAL_DIR: + description: 'Where to run WordPress from.' + required: false + type: 'string' + default: 'build' + BASE_TAG: + description: 'The version being used for baseline measurements.' + required: false + type: 'string' + default: '6.7.0' + TARGET_SHA: + description: 'SHA hash of the target commit used for "before" measurements.' + required: true + type: 'string' + php-version: + description: 'The PHP version to use.' + required: false + type: 'string' + default: 'latest' + memcached: + description: 'Whether to enable memcached.' + required: false + type: 'boolean' + default: false + multisite: + description: 'Whether to use Multisite.' + required: false + type: 'boolean' + default: false + outputs: + BASE_TAG: + description: 'The version being used for baseline measurements.' + value: ${{ inputs.BASE_TAG }} + secrets: + CODEVITALS_PROJECT_TOKEN: + description: 'The authorization token for https://www.codevitals.run/project/wordpress.' + required: false + +env: + PUPPETEER_SKIP_DOWNLOAD: ${{ true }} + + # Prevent wp-scripts from downloading extra Playwright browsers, + # since Chromium will be installed in its dedicated step already. + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: true + + # Performance testing should be performed in an environment reflecting a standard production environment. + LOCAL_WP_DEBUG: false + LOCAL_SCRIPT_DEBUG: false + LOCAL_SAVEQUERIES: false + LOCAL_WP_DEVELOPMENT_MODE: "''" + + BASE_TAG: ${{ inputs.BASE_TAG }} + TARGET_SHA: ${{ inputs.TARGET_SHA }} + + LOCAL_DIR: ${{ inputs.LOCAL_DIR }} + LOCAL_PHP_MEMCACHED: ${{ inputs.memcached }} + LOCAL_PHP: ${{ inputs.php-version }}${{ 'latest' != inputs.php-version && '-fpm' || '' }} + LOCAL_MULTISITE: ${{ inputs.multisite }} + +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + +jobs: + # Performs the following steps: + # - Configure environment variables. + # - Checkout repository. + # - Set up Node.js. + # - Log debug information. + # - Install npm dependencies. + # - Install Playwright browsers. + # - Build WordPress. + # - Start Docker environment. + # - Put the baseline or target version of WordPress in place if necessary. + # - Install object cache drop-in. + # - Log running Docker containers. + # - Docker debug information. + # - Install WordPress. + # - WordPress debug information. + # - Enable themes on Multisite. + # - Install WordPress Importer plugin. + # - Import mock data. + # - Deactivate WordPress Importer plugin. + # - Update permalink structure. + # - Install additional languages. + # - Disable external HTTP requests. + # - Disable cron. + # - List defined constants. + # - Install MU plugin. + # - Run performance tests. + # - Archive artifacts. + # - Ensure version-controlled files are not modified or deleted. + performance: + name: Test ${{ inputs.subject == 'base' && inputs.BASE_TAG || inputs.subject }} + runs-on: ubuntu-24.04 + permissions: + contents: read + + steps: + - name: Configure environment variables + run: | + echo "PHP_FPM_UID=$(id -u)" >> "$GITHUB_ENV" + echo "PHP_FPM_GID=$(id -g)" >> "$GITHUB_ENV" + + - name: Checkout repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + fetch-depth: ${{ github.event_name == 'workflow_dispatch' && '2' || '1' }} + persist-credentials: false + + - name: Set up Node.js + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + with: + node-version-file: '.nvmrc' + cache: npm + + - name: Log debug information + run: | + npm --version + node --version + curl --version + git --version + locale -a + + - name: Install npm dependencies + run: npm ci + + - name: Install Playwright browsers + run: npx playwright install --with-deps chromium + + - name: Start Docker environment + run: npm run env:start + + - name: Build WordPress + run: npm run build + + - name: Download previous build artifact (target branch or previous commit) + if: ${{ inputs.subject == 'before' }} + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + id: get-previous-build + with: + script: | + const artifacts = await github.rest.actions.listArtifactsForRepo({ + owner: context.repo.owner, + repo: context.repo.repo, + name: 'wordpress-build-' + process.env.TARGET_SHA, + }); + const matchArtifact = artifacts.data.artifacts[0]; + if ( ! matchArtifact ) { + core.setFailed( 'No artifact found!' ); + return false; + } + const download = await github.rest.actions.downloadArtifact( { + owner: context.repo.owner, + repo: context.repo.repo, + artifact_id: matchArtifact.id, + archive_format: 'zip', + } ); + const fs = require( 'fs' ); + fs.writeFileSync( process.env.GITHUB_WORKSPACE + '/before.zip', Buffer.from( download.data ) ) + return true; + + - name: Unzip the previous build + if: ${{ inputs.subject == 'before' }} + run: | + unzip "${GITHUB_WORKSPACE}/before.zip" + unzip -o "${GITHUB_WORKSPACE}/wordpress.zip" + + - name: Set the environment to the baseline version + if: ${{ inputs.subject == 'base' }} + run: | + VERSION="${BASE_TAG%.0}" + npm run env:cli -- core download --version="$VERSION" --force --path="/var/www/${LOCAL_DIR}" + + - name: Install object cache drop-in + if: ${{ inputs.memcached }} + run: cp src/wp-content/object-cache.php build/wp-content/object-cache.php + + - name: Log running Docker containers + run: docker ps -a + + - name: Docker debug information + run: | + docker -v + docker compose run --rm mysql mysql --version + docker compose run --rm php php --version + docker compose run --rm php php -m + docker compose run --rm php php -i + docker compose run --rm php locale -a + + - name: Install WordPress + run: npm run env:install + + - name: Check version number + run: npm run env:cli -- core version --path="/var/www/${LOCAL_DIR}" + + - name: Enable themes on Multisite + if: ${{ inputs.multisite }} + run: | + npm run env:cli -- theme enable twentytwentyone --network --path="/var/www/${LOCAL_DIR}" + npm run env:cli -- theme enable twentytwentythree --network --path="/var/www/${LOCAL_DIR}" + npm run env:cli -- theme enable twentytwentyfour --network --path="/var/www/${LOCAL_DIR}" + npm run env:cli -- theme enable twentytwentyfive --network --path="/var/www/${LOCAL_DIR}" + + - name: Install WordPress Importer plugin + run: npm run env:cli -- plugin install wordpress-importer --activate --path="/var/www/${LOCAL_DIR}" + + - name: Import mock data + run: | + curl -O https://raw.githubusercontent.com/WordPress/theme-test-data/b9752e0533a5acbb876951a8cbb5bcc69a56474c/themeunittestdata.wordpress.xml + npm run env:cli -- import themeunittestdata.wordpress.xml --authors=create --path="/var/www/${LOCAL_DIR}" + rm themeunittestdata.wordpress.xml + + - name: Deactivate WordPress Importer plugin + run: npm run env:cli -- plugin deactivate wordpress-importer --path="/var/www/${LOCAL_DIR}" + + - name: Update permalink structure + run: npm run env:cli -- rewrite structure '/%year%/%monthnum%/%postname%/' --path="/var/www/${LOCAL_DIR}" + + - name: Install additional languages + run: | + npm run env:cli -- language core install de_DE --path="/var/www/${LOCAL_DIR}" + npm run env:cli -- language plugin install de_DE --all --path="/var/www/${LOCAL_DIR}" + npm run env:cli -- language theme install de_DE --all --path="/var/www/${LOCAL_DIR}" + + # Prevent background update checks from impacting test stability. + - name: Disable external HTTP requests + run: npm run env:cli -- config set WP_HTTP_BLOCK_EXTERNAL true --raw --type=constant --path="/var/www/${LOCAL_DIR}" + + # Prevent background tasks from impacting test stability. + - name: Disable cron + run: npm run env:cli -- config set DISABLE_WP_CRON true --raw --type=constant --path="/var/www/${LOCAL_DIR}" + + - name: List defined constants + run: npm run env:cli -- config list --path="/var/www/${LOCAL_DIR}" + + - name: Install MU plugin + run: | + mkdir "./${LOCAL_DIR}/wp-content/mu-plugins" + cp ./tests/performance/wp-content/mu-plugins/server-timing.php "./${LOCAL_DIR}/wp-content/mu-plugins/server-timing.php" + + - name: Run performance tests + run: npm run test:performance + env: + TEST_RESULTS_PREFIX: ${{ inputs.subject != 'current' && inputs.subject || '' }} + + - name: Archive artifacts + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + if: always() + with: + name: performance-${{ inputs.multisite && 'multisite' || 'single' }}-${{ inputs.memcached && 'memcached' || 'default' }}-${{ inputs.subject }} + path: artifacts + if-no-files-found: error + include-hidden-files: true + + - name: Ensure version-controlled files are not modified or deleted + run: git diff --exit-code From 4180ca6425e8113f80991efd432a0fbe173bf29b Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sat, 1 Feb 2025 20:50:13 +0000 Subject: [PATCH 275/323] Coding Standards: Use strict comparison in some legacy media functions. Follow-up to [7062], [8653], [12188]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59750 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/media.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wp-admin/includes/media.php b/src/wp-admin/includes/media.php index 4484d1672519e..0f988a2dac62b 100644 --- a/src/wp-admin/includes/media.php +++ b/src/wp-admin/includes/media.php @@ -93,7 +93,7 @@ function the_media_upload_tabs() { foreach ( $tabs as $callback => $text ) { $class = ''; - if ( $current == $callback ) { + if ( $current === $callback ) { $class = " class='current'"; } @@ -1172,7 +1172,7 @@ function image_align_input_fields( $post, $checked = '' ) { foreach ( $alignments as $name => $label ) { $name = esc_attr( $name ); $output[] = "<input type='radio' name='attachments[{$post->ID}][align]' id='image-align-{$name}-{$post->ID}' value='$name'" . - ( $checked == $name ? " checked='checked'" : '' ) . + ( $checked === $name ? " checked='checked'" : '' ) . " /><label for='image-align-{$name}-{$post->ID}' class='align image-align-{$name}-label'>$label</label>"; } @@ -1222,7 +1222,7 @@ function image_size_input_fields( $post, $check = '' ) { $css_id = "image-size-{$size}-{$post->ID}"; // If this size is the default but that's not available, don't select it. - if ( $size == $check ) { + if ( $size === $check ) { if ( $enabled ) { $checked = " checked='checked'"; } else { From bcdca3f9925f1d3eca7b78d231837c0caf0c8c24 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sun, 2 Feb 2025 11:15:55 +0000 Subject: [PATCH 276/323] Coding Standards: Use strict comparison in `get_media_item()`. Follow-up to [12081], [12351]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59751 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/media.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-admin/includes/media.php b/src/wp-admin/includes/media.php index 0f988a2dac62b..24dfef62f5b8a 100644 --- a/src/wp-admin/includes/media.php +++ b/src/wp-admin/includes/media.php @@ -1762,7 +1762,7 @@ function get_media_item( $attachment_id, $args = null ) { if ( 'image' === $type && $calling_post_id && current_theme_supports( 'post-thumbnails', get_post_type( $calling_post_id ) ) && post_type_supports( get_post_type( $calling_post_id ), 'thumbnail' ) - && get_post_thumbnail_id( $calling_post_id ) != $attachment_id + && get_post_thumbnail_id( $calling_post_id ) !== $attachment_id ) { $calling_post = get_post( $calling_post_id ); From 3ff586a4e38681389d51206245750e5b72887cf6 Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Mon, 3 Feb 2025 13:35:25 +0000 Subject: [PATCH 277/323] Build/Test Tools: Fix the source code path handling when installing the local development environment. This ensures the correct code is used to run the installation depending on whether it should be running from the `src` or `build` directory. Props swissspidy, johnbillion See #62221 git-svn-id: https://develop.svn.wordpress.org/trunk@59752 602fd350-edb4-49c9-b593-d223f7449a82 --- tools/local-env/scripts/install.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/local-env/scripts/install.js b/tools/local-env/scripts/install.js index d924ffc30deba..f8e6285fb9a33 100644 --- a/tools/local-env/scripts/install.js +++ b/tools/local-env/scripts/install.js @@ -12,7 +12,7 @@ dotenvExpand.expand( dotenv.config() ); local_env_utils.determine_auth_option(); // Create wp-config.php. -wp_cli( 'config create --dbname=wordpress_develop --dbuser=root --dbpass=password --dbhost=mysql --path=/var/www/src --force' ); +wp_cli( 'config create --dbname=wordpress_develop --dbuser=root --dbpass=password --dbhost=mysql --force' ); // Add the debug settings to wp-config.php. // Windows requires this to be done as an additional step, rather than using the --extra-php option in the previous step. @@ -24,7 +24,7 @@ wp_cli( `config set WP_ENVIRONMENT_TYPE ${process.env.LOCAL_WP_ENVIRONMENT_TYPE} wp_cli( `config set WP_DEVELOPMENT_MODE ${process.env.LOCAL_WP_DEVELOPMENT_MODE} --type=constant` ); // Move wp-config.php to the base directory, so it doesn't get mixed up in the src or build directories. -renameSync( 'src/wp-config.php', 'wp-config.php' ); +renameSync( `${process.env.LOCAL_DIR}/wp-config.php`, 'wp-config.php' ); install_wp_importer(); @@ -55,7 +55,7 @@ wait_on( { resources: [ `tcp:localhost:${process.env.LOCAL_PORT}`] } ) function wp_cli( cmd ) { const composeFiles = local_env_utils.get_compose_files(); - execSync( `docker compose ${composeFiles} run --quiet-pull --rm cli ${cmd}`, { stdio: 'inherit' } ); + execSync( `docker compose ${composeFiles} run --quiet-pull --rm cli ${cmd} --path=/var/www/${process.env.LOCAL_DIR}`, { stdio: 'inherit' } ); } /** From 8711aa5ab60e35d78dab73e316674b59b90246da Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Mon, 3 Feb 2025 16:53:16 +0000 Subject: [PATCH 278/323] Posts, Post Types: Explicitly pass a redirect URL for the post permalink when submitting the post password form. This allows the subsequent redirect to behave as expected if a site is using a strict referrer policy on the front end which prevents the full referrer from being sent. Props zodiac1978, yogeshbhutkar, hbhalodia, mukesh27. Fixes #62881 git-svn-id: https://develop.svn.wordpress.org/trunk@59753 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post-template.php | 10 +++++++++- src/wp-login.php | 13 +++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/wp-includes/post-template.php b/src/wp-includes/post-template.php index 598ea3d60865d..15dfc67d6f7a1 100644 --- a/src/wp-includes/post-template.php +++ b/src/wp-includes/post-template.php @@ -1780,6 +1780,7 @@ function get_the_password_form( $post = 0 ) { $invalid_password_html = ''; $aria = ''; $class = ''; + $redirect_field = ''; // If the referrer is the same as the current request, the user has entered an invalid password. if ( ! empty( $post->ID ) && wp_get_raw_referer() === get_permalink( $post->ID ) && isset( $_COOKIE[ 'wp-postpass_' . COOKIEHASH ] ) ) { @@ -1798,7 +1799,14 @@ function get_the_password_form( $post = 0 ) { $class = ' password-form-error'; } - $output = '<form action="' . esc_url( site_url( 'wp-login.php?action=postpass', 'login_post' ) ) . '" class="post-password-form' . $class . '" method="post">' . $invalid_password_html . ' + if ( ! empty( $post->ID ) ) { + $redirect_field = sprintf( + '<input type="hidden" name="redirect_to" value="%s" />', + esc_attr( get_permalink( $post->ID ) ) + ); + } + + $output = '<form action="' . esc_url( site_url( 'wp-login.php?action=postpass', 'login_post' ) ) . '" class="post-password-form' . $class . '" method="post">' . $redirect_field . $invalid_password_html . ' <p>' . __( 'This content is password protected. To view it please enter your password below:' ) . '</p> <p><label for="' . $field_id . '">' . __( 'Password:' ) . ' <input name="post_password" id="' . $field_id . '" type="password" spellcheck="false" required size="20"' . $aria . ' /></label> <input type="submit" name="Submit" value="' . esc_attr_x( 'Enter', 'post password form' ) . '" /></p></form> '; diff --git a/src/wp-login.php b/src/wp-login.php index c1b06bbc3bac7..0d824dea655ea 100644 --- a/src/wp-login.php +++ b/src/wp-login.php @@ -764,8 +764,10 @@ function wp_login_viewport_meta() { break; case 'postpass': + $redirect_to = $_POST['redirect_to'] ?? wp_get_referer(); + if ( ! isset( $_POST['post_password'] ) || ! is_string( $_POST['post_password'] ) ) { - wp_safe_redirect( wp_get_referer() ); + wp_safe_redirect( $redirect_to ); exit; } @@ -782,18 +784,17 @@ function wp_login_viewport_meta() { * * @param int $expires The expiry time, as passed to setcookie(). */ - $expire = apply_filters( 'post_password_expires', time() + 10 * DAY_IN_SECONDS ); - $referer = wp_get_referer(); + $expire = apply_filters( 'post_password_expires', time() + 10 * DAY_IN_SECONDS ); - if ( $referer ) { - $secure = ( 'https' === parse_url( $referer, PHP_URL_SCHEME ) ); + if ( $redirect_to ) { + $secure = ( 'https' === parse_url( $redirect_to, PHP_URL_SCHEME ) ); } else { $secure = false; } setcookie( 'wp-postpass_' . COOKIEHASH, $hasher->HashPassword( wp_unslash( $_POST['post_password'] ) ), $expire, COOKIEPATH, COOKIE_DOMAIN, $secure ); - wp_safe_redirect( wp_get_referer() ); + wp_safe_redirect( $redirect_to ); exit; case 'logout': From 85d00ec54c3a552ca28a996f6e1209e45821358a Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Mon, 3 Feb 2025 19:50:50 +0000 Subject: [PATCH 279/323] Security: Add the `SensitiveParameter` attribute to sensitive parameters. Values passed to parameters with this attribute will be redacted if present in a stack trace when using PHP 8.2 or later. This reduces the chance that passwords and security keys get accidentally exposed in debug logs and bug reports. Props petitphp, TobiasBg, jrf, johnbillion. Fixes #57304 git-svn-id: https://develop.svn.wordpress.org/trunk@59754 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/class-wp-importer.php | 8 ++- src/wp-admin/includes/upgrade.php | 19 ++++++- .../class-wp-application-passwords.php | 5 +- src/wp-includes/class-wp-xmlrpc-server.php | 12 ++++- src/wp-includes/class-wpdb.php | 8 ++- src/wp-includes/ms-functions.php | 54 ++++++++++++++++--- src/wp-includes/pluggable-deprecated.php | 17 +++++- src/wp-includes/pluggable.php | 24 +++++++-- .../class-wp-rest-users-controller.php | 7 ++- src/wp-includes/user.php | 53 +++++++++++++++--- 10 files changed, 178 insertions(+), 29 deletions(-) diff --git a/src/wp-admin/includes/class-wp-importer.php b/src/wp-admin/includes/class-wp-importer.php index eca3199a7b5c7..8edef7dba58de 100644 --- a/src/wp-admin/includes/class-wp-importer.php +++ b/src/wp-admin/includes/class-wp-importer.php @@ -195,7 +195,13 @@ public function cmpr_strlen( $a, $b ) { * @param bool $head * @return array */ - public function get_page( $url, $username = '', $password = '', $head = false ) { + public function get_page( + $url, + $username = '', + #[\SensitiveParameter] + $password = '', + $head = false + ) { // Increase the timeout. add_filter( 'http_request_timeout', array( $this, 'bump_request_timeout' ) ); diff --git a/src/wp-admin/includes/upgrade.php b/src/wp-admin/includes/upgrade.php index 068e28b040e33..94f40cda318a1 100644 --- a/src/wp-admin/includes/upgrade.php +++ b/src/wp-admin/includes/upgrade.php @@ -44,7 +44,16 @@ * @type string $password_message The explanatory message regarding the password. * } */ - function wp_install( $blog_title, $user_name, $user_email, $is_public, $deprecated = '', $user_password = '', $language = '' ) { + function wp_install( + $blog_title, + $user_name, + $user_email, + $is_public, + $deprecated = '', + #[\SensitiveParameter] + $user_password = '', + $language = '' + ) { if ( ! empty( $deprecated ) ) { _deprecated_argument( __FUNCTION__, '2.6.0' ); } @@ -563,7 +572,13 @@ function wp_install_maybe_enable_pretty_permalinks() { * @param string $password Administrator's password. Note that a placeholder message is * usually passed instead of the actual password. */ - function wp_new_blog_notification( $blog_title, $blog_url, $user_id, $password ) { + function wp_new_blog_notification( + $blog_title, + $blog_url, + $user_id, + #[\SensitiveParameter] + $password + ) { $user = new WP_User( $user_id ); $email = $user->user_email; $name = $user->user_login; diff --git a/src/wp-includes/class-wp-application-passwords.php b/src/wp-includes/class-wp-application-passwords.php index b76b5c7e2a5ae..43965790594b1 100644 --- a/src/wp-includes/class-wp-application-passwords.php +++ b/src/wp-includes/class-wp-application-passwords.php @@ -459,7 +459,10 @@ protected static function set_user_application_passwords( $user_id, $passwords ) * @param string $raw_password The raw application password. * @return string The chunked password. */ - public static function chunk_password( $raw_password ) { + public static function chunk_password( + #[\SensitiveParameter] + $raw_password + ) { $raw_password = preg_replace( '/[^a-z\d]/i', '', $raw_password ); return trim( chunk_split( $raw_password, 4, ' ' ) ); diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index a406b63105d6e..e69d0eb395acf 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -285,7 +285,11 @@ public function addTwoNumbers( $args ) { * @param string $password User's password. * @return WP_User|false WP_User object if authentication passed, false otherwise. */ - public function login( $username, $password ) { + public function login( + $username, + #[\SensitiveParameter] + $password + ) { if ( ! $this->is_enabled ) { $this->error = new IXR_Error( 405, sprintf( __( 'XML-RPC services are disabled on this site.' ) ) ); return false; @@ -330,7 +334,11 @@ public function login( $username, $password ) { * @param string $password User's password. * @return bool Whether authentication passed. */ - public function login_pass_ok( $username, $password ) { + public function login_pass_ok( + $username, + #[\SensitiveParameter] + $password + ) { return (bool) $this->login( $username, $password ); } diff --git a/src/wp-includes/class-wpdb.php b/src/wp-includes/class-wpdb.php index 69b934ae38ed2..5ace90d490e17 100644 --- a/src/wp-includes/class-wpdb.php +++ b/src/wp-includes/class-wpdb.php @@ -749,7 +749,13 @@ class wpdb { * @param string $dbname Database name. * @param string $dbhost Database host. */ - public function __construct( $dbuser, $dbpassword, $dbname, $dbhost ) { + public function __construct( + $dbuser, + #[\SensitiveParameter] + $dbpassword, + $dbname, + $dbhost + ) { if ( WP_DEBUG && WP_DEBUG_DISPLAY ) { $this->show_errors(); } diff --git a/src/wp-includes/ms-functions.php b/src/wp-includes/ms-functions.php index 404eb1497a7cc..1f890dab69232 100644 --- a/src/wp-includes/ms-functions.php +++ b/src/wp-includes/ms-functions.php @@ -938,7 +938,16 @@ function wpmu_signup_user( $user, $user_email, $meta = array() ) { * @param array $meta Optional. Signup meta data. By default, contains the requested privacy setting and lang_id. * @return bool */ -function wpmu_signup_blog_notification( $domain, $path, $title, $user_login, $user_email, $key, $meta = array() ) { +function wpmu_signup_blog_notification( + $domain, + $path, + $title, + $user_login, + $user_email, + #[\SensitiveParameter] + $key, + $meta = array() +) { /** * Filters whether to bypass the new site email notification. * @@ -1073,7 +1082,13 @@ function wpmu_signup_blog_notification( $domain, $path, $title, $user_login, $us * @param array $meta Optional. Signup meta data. Default empty array. * @return bool */ -function wpmu_signup_user_notification( $user_login, $user_email, $key, $meta = array() ) { +function wpmu_signup_user_notification( + $user_login, + $user_email, + #[\SensitiveParameter] + $key, + $meta = array() +) { /** * Filters whether to bypass the email notification for new user sign-up. * @@ -1175,7 +1190,10 @@ function wpmu_signup_user_notification( $user_login, $user_email, $key, $meta = * @param string $key The activation key provided to the user. * @return array|WP_Error An array containing information about the activated user and/or blog. */ -function wpmu_activate_signup( $key ) { +function wpmu_activate_signup( + #[\SensitiveParameter] + $key +) { global $wpdb; $signup = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->signups WHERE activation_key = %s", $key ) ); @@ -1327,7 +1345,12 @@ function wp_delete_signup_on_user_delete( $id, $reassign, $user ) { * @param string $email The new user's email address. * @return int|false Returns false on failure, or int $user_id on success. */ -function wpmu_create_user( $user_name, $password, $email ) { +function wpmu_create_user( + $user_name, + #[\SensitiveParameter] + $password, + $email +) { $user_name = preg_replace( '/\s+/', '', sanitize_user( $user_name, true ) ); $user_id = wp_create_user( $user_name, $password, $email ); @@ -1611,7 +1634,14 @@ function domain_exists( $domain, $path, $network_id = 1 ) { * @param array $meta Optional. Signup meta data. By default, contains the requested privacy setting and lang_id. * @return bool Whether the email notification was sent. */ -function wpmu_welcome_notification( $blog_id, $user_id, $password, $title, $meta = array() ) { +function wpmu_welcome_notification( + $blog_id, + $user_id, + #[\SensitiveParameter] + $password, + $title, + $meta = array() +) { $current_network = get_network(); /** @@ -1845,7 +1875,12 @@ function wpmu_new_site_admin_notification( $site_id, $user_id ) { * @param array $meta Optional. Signup meta data. Default empty array. * @return bool */ -function wpmu_welcome_user_notification( $user_id, $password, $meta = array() ) { +function wpmu_welcome_user_notification( + $user_id, + #[\SensitiveParameter] + $password, + $meta = array() +) { $current_network = get_network(); /** @@ -2271,7 +2306,12 @@ function add_existing_user_to_blog( $details = false ) { * @param string $password User password. Ignored. * @param array $meta Signup meta data. */ -function add_new_user_to_blog( $user_id, $password, $meta ) { +function add_new_user_to_blog( + $user_id, + #[\SensitiveParameter] + $password, + $meta +) { if ( ! empty( $meta['add_to_blog'] ) ) { $blog_id = $meta['add_to_blog']; $role = $meta['new_role']; diff --git a/src/wp-includes/pluggable-deprecated.php b/src/wp-includes/pluggable-deprecated.php index 11e393ddfdb84..11ccad2e8a57b 100644 --- a/src/wp-includes/pluggable-deprecated.php +++ b/src/wp-includes/pluggable-deprecated.php @@ -101,7 +101,15 @@ function get_user_by_email($email) { * @param string $siteurl Optional. Will be used instead of SITECOOKIEPATH if set * @param bool $remember Optional. Remember that the user is logged in */ -function wp_setcookie($username, $password = '', $already_md5 = false, $home = '', $siteurl = '', $remember = false) { +function wp_setcookie( + $username, + #[\SensitiveParameter] + $password = '', + $already_md5 = false, + $home = '', + $siteurl = '', + $remember = false +) { _deprecated_function( __FUNCTION__, '2.5.0', 'wp_set_auth_cookie()' ); $user = get_user_by('login', $username); wp_set_auth_cookie($user->ID, $remember); @@ -168,7 +176,12 @@ function wp_get_cookie_login() { * @param string $deprecated Not used * @return bool True on successful check, false on login failure. */ -function wp_login($username, $password, $deprecated = '') { +function wp_login( + $username, + #[\SensitiveParameter] + $password, + $deprecated = '' +) { _deprecated_function( __FUNCTION__, '2.5.0', 'wp_signon()' ); global $error; diff --git a/src/wp-includes/pluggable.php b/src/wp-includes/pluggable.php index f4a8d8412e88c..60ad0841ed8ce 100644 --- a/src/wp-includes/pluggable.php +++ b/src/wp-includes/pluggable.php @@ -598,7 +598,11 @@ function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() * @return WP_User|WP_Error WP_User object if the credentials are valid, * otherwise WP_Error. */ - function wp_authenticate( $username, $password ) { + function wp_authenticate( + $username, + #[\SensitiveParameter] + $password + ) { $username = sanitize_user( $username ); $password = trim( $password ); @@ -2631,7 +2635,10 @@ function wp_hash( $data, $scheme = 'auth', $algo = 'md5' ) { * @param string $password Plain text user password to hash. * @return string The hash string of the password. */ - function wp_hash_password( $password ) { + function wp_hash_password( + #[\SensitiveParameter] + $password + ) { global $wp_hasher; if ( empty( $wp_hasher ) ) { @@ -2667,7 +2674,12 @@ function wp_hash_password( $password ) { * @param string|int $user_id Optional. User ID. * @return bool False, if the $password does not match the hashed password. */ - function wp_check_password( $password, $hash, $user_id = '' ) { + function wp_check_password( + #[\SensitiveParameter] + $password, + $hash, + $user_id = '' + ) { global $wp_hasher; // If the hash is still md5... @@ -2863,7 +2875,11 @@ function wp_rand( $min = null, $max = null ) { * @param string $password The plaintext new user password. * @param int $user_id User ID. */ - function wp_set_password( $password, $user_id ) { + function wp_set_password( + #[\SensitiveParameter] + $password, + $user_id + ) { global $wpdb; $old_user_data = get_userdata( $user_id ); diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php index 84bcea052cf32..64578c7810b7b 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php @@ -1310,7 +1310,12 @@ public function check_username( $value, $request, $param ) { * @param string $param The parameter name. * @return string|WP_Error The sanitized password, if valid, otherwise an error. */ - public function check_user_password( $value, $request, $param ) { + public function check_user_password( + #[\SensitiveParameter] + $value, + $request, + $param + ) { $password = (string) $value; if ( empty( $password ) ) { diff --git a/src/wp-includes/user.php b/src/wp-includes/user.php index e4e6f5b652744..ede1330251263 100644 --- a/src/wp-includes/user.php +++ b/src/wp-includes/user.php @@ -150,7 +150,12 @@ function wp_signon( $credentials = array(), $secure_cookie = '' ) { * @param string $password Password for authentication. * @return WP_User|WP_Error WP_User on success, WP_Error on failure. */ -function wp_authenticate_username_password( $user, $username, $password ) { +function wp_authenticate_username_password( + $user, + $username, + #[\SensitiveParameter] + $password +) { if ( $user instanceof WP_User ) { return $user; } @@ -228,7 +233,12 @@ function wp_authenticate_username_password( $user, $username, $password ) { * @param string $password Password for authentication. * @return WP_User|WP_Error WP_User on success, WP_Error on failure. */ -function wp_authenticate_email_password( $user, $email, $password ) { +function wp_authenticate_email_password( + $user, + $email, + #[\SensitiveParameter] + $password +) { if ( $user instanceof WP_User ) { return $user; } @@ -301,7 +311,12 @@ function wp_authenticate_email_password( $user, $email, $password ) { * @param string $password Password. If not empty, cancels the cookie authentication. * @return WP_User|WP_Error WP_User on success, WP_Error on failure. */ -function wp_authenticate_cookie( $user, $username, $password ) { +function wp_authenticate_cookie( + $user, + $username, + #[\SensitiveParameter] + $password +) { global $auth_secure_cookie; if ( $user instanceof WP_User ) { @@ -342,7 +357,12 @@ function wp_authenticate_cookie( $user, $username, $password ) { * @return WP_User|WP_Error|null WP_User on success, WP_Error on failure, null if * null is passed in and this isn't an API request. */ -function wp_authenticate_application_password( $input_user, $username, $password ) { +function wp_authenticate_application_password( + $input_user, + $username, + #[\SensitiveParameter] + $password +) { if ( $input_user instanceof WP_User ) { return $input_user; } @@ -2846,7 +2866,12 @@ function wp_update_user( $userdata ) { * @return int|WP_Error The newly created user's ID or a WP_Error object if the user could not * be created. */ -function wp_create_user( $username, $password, $email = '' ) { +function wp_create_user( + $username, + #[\SensitiveParameter] + $password, + $email = '' +) { $user_login = wp_slash( $username ); $user_email = wp_slash( $email ); $user_pass = $password; @@ -3034,7 +3059,11 @@ function get_password_reset_key( $user ) { * @param string $login The user login. * @return WP_User|WP_Error WP_User object on success, WP_Error object for invalid or expired keys. */ -function check_password_reset_key( $key, $login ) { +function check_password_reset_key( + #[\SensitiveParameter] + $key, + $login +) { global $wp_hasher; $key = preg_replace( '/[^a-z0-9]/i', '', $key ); @@ -3371,7 +3400,11 @@ function retrieve_password( $user_login = '' ) { * @param WP_User $user The user * @param string $new_pass New password for the user in plaintext */ -function reset_password( $user, $new_pass ) { +function reset_password( + $user, + #[\SensitiveParameter] + $new_pass +) { /** * Fires before the user's password is reset. * @@ -4932,7 +4965,11 @@ function wp_generate_user_request_key( $request_id ) { * @param string $key Provided key to validate. * @return true|WP_Error True on success, WP_Error on failure. */ -function wp_validate_user_request_key( $request_id, $key ) { +function wp_validate_user_request_key( + $request_id, + #[\SensitiveParameter] + $key +) { global $wp_hasher; $request_id = absint( $request_id ); From f584f791f3f20cc1d4c9ba10ef498374981ae740 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Mon, 3 Feb 2025 23:41:43 +0000 Subject: [PATCH 280/323] Coding Standards: Use a more meaningful variable name in `WP_List_Table::months_dropdown()`. As per the [https://developer.wordpress.org/coding-standards/wordpress-coding-standards/php/#naming-conventions Naming Conventions]: > Don't abbreviate variable names unnecessarily; let the code be unambiguous and self-documenting. Follow-up to [8646], [15491]. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59755 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/class-wp-list-table.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wp-admin/includes/class-wp-list-table.php b/src/wp-admin/includes/class-wp-list-table.php index a0d4c33bcb317..3a65e015d5694 100644 --- a/src/wp-admin/includes/class-wp-list-table.php +++ b/src/wp-admin/includes/class-wp-list-table.php @@ -763,11 +763,11 @@ protected function months_dropdown( $post_type ) { return; } - $m = isset( $_GET['m'] ) ? (int) $_GET['m'] : 0; + $selected_month = isset( $_GET['m'] ) ? (int) $_GET['m'] : 0; ?> <label for="filter-by-date" class="screen-reader-text"><?php echo get_post_type_object( $post_type )->labels->filter_by_date; ?></label> <select name="m" id="filter-by-date"> - <option<?php selected( $m, 0 ); ?> value="0"><?php _e( 'All dates' ); ?></option> + <option<?php selected( $selected_month, 0 ); ?> value="0"><?php _e( 'All dates' ); ?></option> <?php foreach ( $months as $arc_row ) { if ( 0 === (int) $arc_row->year ) { @@ -779,7 +779,7 @@ protected function months_dropdown( $post_type ) { printf( "<option %s value='%s'>%s</option>\n", - selected( $m, $year . $month, false ), + selected( $selected_month, $year . $month, false ), esc_attr( $arc_row->year . $month ), /* translators: 1: Month name, 2: 4-digit year. */ sprintf( __( '%1$s %2$d' ), $wp_locale->get_month( $month ), $year ) From bce13fd853f42d51d7d213cd383bf3688fd9d5bc Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Tue, 4 Feb 2025 00:30:06 +0000 Subject: [PATCH 281/323] Docs: Correct DocBlock formatting for `the_password_form` filter. Follow-up to [59736], [59737]. See #62281. git-svn-id: https://develop.svn.wordpress.org/trunk@59756 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post-template.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/post-template.php b/src/wp-includes/post-template.php index 15dfc67d6f7a1..d502cf4daa4f8 100644 --- a/src/wp-includes/post-template.php +++ b/src/wp-includes/post-template.php @@ -1823,8 +1823,8 @@ function get_the_password_form( $post = 0 ) { * @since 5.8.0 Added the `$post` parameter. * @since 6.8.0 Added the `$invalid_password` parameter. * - * @param string $output The password form HTML output. - * @param WP_Post $post Post object. + * @param string $output The password form HTML output. + * @param WP_Post $post Post object. * @param string $invalid_password The invalid password message. */ return apply_filters( 'the_password_form', $output, $post, $invalid_password ); From 39b293e51e323fffc58ee318890759dc6039b382 Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Tue, 4 Feb 2025 08:40:40 +0000 Subject: [PATCH 282/323] Editor: Add a fallback to `WP_Block_Styles_Registry` if the label is missing. Both `name` and `label` properties are required when registering a block style. If the label is missing, assign `name` as the value for the `label`, to ensure the property is defined. This avoids a PHP warning in such case. Props poena, Rahmohn, aaronrobertshaw, audrasjb, rinkalpagdar. Fixes #52592. git-svn-id: https://develop.svn.wordpress.org/trunk@59760 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-block-styles-registry.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/wp-includes/class-wp-block-styles-registry.php b/src/wp-includes/class-wp-block-styles-registry.php index 2d16e0e034c07..9a990173b44a4 100644 --- a/src/wp-includes/class-wp-block-styles-registry.php +++ b/src/wp-includes/class-wp-block-styles-registry.php @@ -93,6 +93,11 @@ public function register( $block_name, $style_properties ) { $block_style_name = $style_properties['name']; $block_names = is_string( $block_name ) ? array( $block_name ) : $block_name; + // Ensure there is a label defined. + if ( empty( $style_properties['label'] ) ) { + $style_properties['label'] = $block_style_name; + } + foreach ( $block_names as $name ) { if ( ! isset( $this->registered_block_styles[ $name ] ) ) { $this->registered_block_styles[ $name ] = array(); From 7d10dd7b0fde2a782395887c2d66439481440f9b Mon Sep 17 00:00:00 2001 From: George Mamadashvili <mamaduka@git.wordpress.org> Date: Tue, 4 Feb 2025 08:59:04 +0000 Subject: [PATCH 283/323] Editor: Fix `parents` argument validation for Query block. Allow passing zero (`0`) via the `parents` argument. It is a valid value for hierarchical post types, often used to display top-level items. Props mamaduka, audrasjb, peterwilsoncc. Fixes #62901. git-svn-id: https://develop.svn.wordpress.org/trunk@59761 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/blocks.php | 2 +- tests/phpunit/tests/blocks/wpBlock.php | 33 ++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index 25a4a7e3b29a1..c09321edfa5bd 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -2638,7 +2638,7 @@ static function ( $format ) { $query['s'] = $block->context['query']['search']; } if ( ! empty( $block->context['query']['parents'] ) && is_post_type_hierarchical( $query['post_type'] ) ) { - $query['post_parent__in'] = array_filter( array_map( 'intval', $block->context['query']['parents'] ) ); + $query['post_parent__in'] = array_unique( array_map( 'intval', $block->context['query']['parents'] ) ); } } diff --git a/tests/phpunit/tests/blocks/wpBlock.php b/tests/phpunit/tests/blocks/wpBlock.php index 8eff0e66d013a..bfde02b4dc44c 100644 --- a/tests/phpunit/tests/blocks/wpBlock.php +++ b/tests/phpunit/tests/blocks/wpBlock.php @@ -714,6 +714,39 @@ public function test_build_query_vars_from_query_block_page_with_offset() { ); } + /** + * @ticket 62901 + */ + public function test_build_query_vars_from_query_block_with_top_level_parent() { + $this->registry->register( + 'core/example', + array( 'uses_context' => array( 'query' ) ) + ); + + $parsed_blocks = parse_blocks( '<!-- wp:example {"ok":true} -->a<!-- wp:example /-->b<!-- /wp:example -->' ); + $parsed_block = $parsed_blocks[0]; + $context = array( + 'query' => array( + 'postType' => 'page', + 'parents' => array( 0 ), + ), + ); + $block = new WP_Block( $parsed_block, $context, $this->registry ); + $query = build_query_vars_from_query_block( $block, 1 ); + + $this->assertSame( + array( + 'post_type' => 'page', + 'order' => 'DESC', + 'orderby' => 'date', + 'post__not_in' => array(), + 'tax_query' => array(), + 'post_parent__in' => array( 0 ), + ), + $query + ); + } + /** * @ticket 56467 */ From a11571ed8a3c6e0a1513943f935dccbf69d6c011 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Wed, 5 Feb 2025 23:51:28 +0000 Subject: [PATCH 284/323] Docs: Update comments in `wp-includes/formatting.php` per the documentation standards. Follow-up to [1345], [8662], [8786], [33624], [34761]. Props kapasias, ankitkumarshah, swissspidy, peterwilsoncc. Fixes #62885. git-svn-id: https://develop.svn.wordpress.org/trunk@59765 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/formatting.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/wp-includes/formatting.php b/src/wp-includes/formatting.php index 3ecc352528fec..3ed740901baa6 100644 --- a/src/wp-includes/formatting.php +++ b/src/wp-includes/formatting.php @@ -574,7 +574,7 @@ function wpautop( $text, $br = true ) { // Replace newlines that shouldn't be touched with a placeholder. $text = preg_replace_callback( '/<(script|style|svg|math).*?<\/\\1>/s', '_autop_newline_preservation_helper', $text ); - // Normalize <br> + // Normalize <br>. $text = str_replace( array( '<br>', '<br/>' ), '<br />', $text ); // Replace any new line characters that aren't preceded by a <br /> with a <br />. @@ -621,7 +621,7 @@ function wp_html_split( $input ) { * * @since 4.4.0 * - * @return string The regular expression + * @return string The regular expression. */ function get_html_split_regex() { static $regex; @@ -681,7 +681,7 @@ function get_html_split_regex() { * @since 4.4.0 * * @param string $shortcode_regex Optional. The result from _get_wptexturize_shortcode_regex(). - * @return string The regular expression + * @return string The regular expression. */ function _get_wptexturize_split_regex( $shortcode_regex = '' ) { static $html_regex; @@ -723,7 +723,7 @@ function _get_wptexturize_split_regex( $shortcode_regex = '' ) { * @since 4.4.0 * * @param string[] $tagnames Array of shortcodes to find. - * @return string The regular expression + * @return string The regular expression. */ function _get_wptexturize_shortcode_regex( $tagnames ) { $tagregexp = implode( '|', array_map( 'preg_quote', $tagnames ) ); @@ -877,7 +877,7 @@ function shortcode_unautop( $text ) { * @author bmorel at ssi dot fr (modified) * @since 1.2.1 * - * @param string $str The string to be checked + * @param string $str The string to be checked. * @return bool True if $str fits a UTF-8 model, false otherwise. */ function seems_utf8( $str ) { @@ -904,7 +904,7 @@ function seems_utf8( $str ) { return false; // Does not match any model. } - for ( $j = 0; $j < $n; $j++ ) { // n bytes matching 10bbbbbb follow ? + for ( $j = 0; $j < $n; $j++ ) { // n bytes matching 10bbbbbb follow? if ( ( ++$i === $length ) || ( ( ord( $str[ $i ] ) & 0xC0 ) !== 0x80 ) ) { return false; } @@ -1139,7 +1139,7 @@ function wp_check_invalid_utf8( $text, $strip = false ) { * @since 5.8.3 Added the `encode_ascii_characters` parameter. * * @param string $utf8_string String to encode. - * @param int $length Max length of the string + * @param int $length Max length of the string. * @param bool $encode_ascii_characters Whether to encode ascii characters such as < " ' * @return string String with Unicode encoded for URI. */ @@ -2536,9 +2536,9 @@ function convert_invalid_entities( $content ) { * * @since 0.71 * - * @param string $text Text to be balanced + * @param string $text Text to be balanced. * @param bool $force If true, forces balancing, ignoring the value of the option. Default false. - * @return string Balanced text + * @return string Balanced text. */ function balanceTags( $text, $force = false ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid if ( $force || (int) get_option( 'use_balanceTags' ) === 1 ) { From c22e267ccae50b45e9ae6e4b1e55ce68c408f842 Mon Sep 17 00:00:00 2001 From: Peter Wilson <peterwilsoncc@git.wordpress.org> Date: Thu, 6 Feb 2025 05:02:17 +0000 Subject: [PATCH 285/323] Query: Increase `WP_Query` cache hits for equivalent arguments. Introduces normalization a number of arguments passed to `WP_Query` to increase cache hits for equivalent requests. For example `author__in => [ 1, 2 ]` and `author__in => [ 2, 1 ]` will now hit the same cache. Prior to generating the SQL request and cache key, the following are sorted, made unique and type cast as appropriate. * `post_type` when passed as an array * `post_status` when passed as an array * `term_query`s containing `terms` * `cat` * `category__in` * `category__not_in` * `category__and` * `tag_slug__in` * `tag__in` * `tag__not_in` * `tag__and` * `tag_slug__in` * `tag_slug__and` * `post_parent__not_in` * `author` * `author__not_in` * `author__in` The following are sorted for the purposes of generating the cache key and SQL `WHERE` clause but unmodified for use in the `ORDER BY` SQL clause: * `post_name__in` * `post__in` * `post_parent__in` This commit includes changes to unrelated tests, assertions in `Tests_Query_ParseQuery::test_parse_query_cat_array_mixed()` and `WP_Test_REST_Posts_Controller::test_get_items_not_sticky_with_exclude()` have been modified to account for the sorting of the items above. Props thekt12, peterwilsoncc, spacedmonkey, joemcgill, flixos90, mukesh27, pbearne, swissspidy. Fixes #59516. git-svn-id: https://develop.svn.wordpress.org/trunk@59766 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-query.php | 112 ++++- tests/phpunit/tests/query/cacheResults.php | 414 +++++++++++++++++- tests/phpunit/tests/query/parseQuery.php | 2 +- .../tests/rest-api/rest-posts-controller.php | 2 +- 4 files changed, 495 insertions(+), 35 deletions(-) diff --git a/src/wp-includes/class-wp-query.php b/src/wp-includes/class-wp-query.php index f95cb6149fc43..f088bda6da6d0 100644 --- a/src/wp-includes/class-wp-query.php +++ b/src/wp-includes/class-wp-query.php @@ -474,6 +474,16 @@ class WP_Query { private $compat_methods = array( 'init_query_flags', 'parse_tax_query' ); + /** + * The cache key generated by the query. + * + * The cache key is generated by the method ::generate_cache_key() after the + * query has been normalized. + * + * @var string + */ + private $query_cache_key = ''; + /** * Resets query flags to false. * @@ -1101,7 +1111,8 @@ public function parse_query( $query = '' ) { if ( ! empty( $qv['post_type'] ) ) { if ( is_array( $qv['post_type'] ) ) { - $qv['post_type'] = array_map( 'sanitize_key', $qv['post_type'] ); + $qv['post_type'] = array_map( 'sanitize_key', array_unique( $qv['post_type'] ) ); + sort( $qv['post_type'] ); } else { $qv['post_type'] = sanitize_key( $qv['post_type'] ); } @@ -1109,7 +1120,8 @@ public function parse_query( $query = '' ) { if ( ! empty( $qv['post_status'] ) ) { if ( is_array( $qv['post_status'] ) ) { - $qv['post_status'] = array_map( 'sanitize_key', $qv['post_status'] ); + $qv['post_status'] = array_map( 'sanitize_key', array_unique( $qv['post_status'] ) ); + sort( $qv['post_status'] ); } else { $qv['post_status'] = preg_replace( '|[^a-z0-9_,-]|', '', $qv['post_status'] ); } @@ -1182,9 +1194,12 @@ public function parse_tax_query( &$q ) { $term = $q[ $t->query_var ]; - if ( is_array( $term ) ) { - $term = implode( ',', $term ); + if ( ! is_array( $term ) ) { + $term = explode( ',', $term ); + $term = array_map( 'trim', $term ); } + sort( $term ); + $term = implode( ',', $term ); if ( str_contains( $term, '+' ) ) { $terms = preg_split( '/[+]+/', $term ); @@ -1220,7 +1235,8 @@ public function parse_tax_query( &$q ) { $cat_array = preg_split( '/[,\s]+/', urldecode( $q['cat'] ) ); $cat_array = array_map( 'intval', $cat_array ); - $q['cat'] = implode( ',', $cat_array ); + sort( $cat_array ); + $q['cat'] = implode( ',', $cat_array ); foreach ( $cat_array as $cat ) { if ( $cat > 0 ) { @@ -1262,7 +1278,8 @@ public function parse_tax_query( &$q ) { if ( ! empty( $q['category__in'] ) ) { $q['category__in'] = array_map( 'absint', array_unique( (array) $q['category__in'] ) ); - $tax_query[] = array( + sort( $q['category__in'] ); + $tax_query[] = array( 'taxonomy' => 'category', 'terms' => $q['category__in'], 'field' => 'term_id', @@ -1272,6 +1289,7 @@ public function parse_tax_query( &$q ) { if ( ! empty( $q['category__not_in'] ) ) { $q['category__not_in'] = array_map( 'absint', array_unique( (array) $q['category__not_in'] ) ); + sort( $q['category__not_in'] ); $tax_query[] = array( 'taxonomy' => 'category', 'terms' => $q['category__not_in'], @@ -1282,7 +1300,8 @@ public function parse_tax_query( &$q ) { if ( ! empty( $q['category__and'] ) ) { $q['category__and'] = array_map( 'absint', array_unique( (array) $q['category__and'] ) ); - $tax_query[] = array( + sort( $q['category__and'] ); + $tax_query[] = array( 'taxonomy' => 'category', 'terms' => $q['category__and'], 'field' => 'term_id', @@ -1300,10 +1319,12 @@ public function parse_tax_query( &$q ) { if ( '' !== $q['tag'] && ! $this->is_singular && $this->query_vars_changed ) { if ( str_contains( $q['tag'], ',' ) ) { + // @todo Handle normalizing `tag` query string. $tags = preg_split( '/[,\r\n\t ]+/', $q['tag'] ); foreach ( (array) $tags as $tag ) { $tag = sanitize_term_field( 'slug', $tag, 0, 'post_tag', 'db' ); $q['tag_slug__in'][] = $tag; + sort( $q['tag_slug__in'] ); } } elseif ( preg_match( '/[+\r\n\t ]+/', $q['tag'] ) || ! empty( $q['cat'] ) ) { $tags = preg_split( '/[+\r\n\t ]+/', $q['tag'] ); @@ -1314,6 +1335,7 @@ public function parse_tax_query( &$q ) { } else { $q['tag'] = sanitize_term_field( 'slug', $q['tag'], 0, 'post_tag', 'db' ); $q['tag_slug__in'][] = $q['tag']; + sort( $q['tag_slug__in'] ); } } @@ -1327,7 +1349,8 @@ public function parse_tax_query( &$q ) { if ( ! empty( $q['tag__in'] ) ) { $q['tag__in'] = array_map( 'absint', array_unique( (array) $q['tag__in'] ) ); - $tax_query[] = array( + sort( $q['tag__in'] ); + $tax_query[] = array( 'taxonomy' => 'post_tag', 'terms' => $q['tag__in'], ); @@ -1335,6 +1358,7 @@ public function parse_tax_query( &$q ) { if ( ! empty( $q['tag__not_in'] ) ) { $q['tag__not_in'] = array_map( 'absint', array_unique( (array) $q['tag__not_in'] ) ); + sort( $q['tag__not_in'] ); $tax_query[] = array( 'taxonomy' => 'post_tag', 'terms' => $q['tag__not_in'], @@ -1344,7 +1368,8 @@ public function parse_tax_query( &$q ) { if ( ! empty( $q['tag__and'] ) ) { $q['tag__and'] = array_map( 'absint', array_unique( (array) $q['tag__and'] ) ); - $tax_query[] = array( + sort( $q['tag__and'] ); + $tax_query[] = array( 'taxonomy' => 'post_tag', 'terms' => $q['tag__and'], 'operator' => 'AND', @@ -1353,7 +1378,8 @@ public function parse_tax_query( &$q ) { if ( ! empty( $q['tag_slug__in'] ) ) { $q['tag_slug__in'] = array_map( 'sanitize_title_for_query', array_unique( (array) $q['tag_slug__in'] ) ); - $tax_query[] = array( + sort( $q['tag_slug__in'] ); + $tax_query[] = array( 'taxonomy' => 'post_tag', 'terms' => $q['tag_slug__in'], 'field' => 'slug', @@ -1362,7 +1388,8 @@ public function parse_tax_query( &$q ) { if ( ! empty( $q['tag_slug__and'] ) ) { $q['tag_slug__and'] = array_map( 'sanitize_title_for_query', array_unique( (array) $q['tag_slug__and'] ) ); - $tax_query[] = array( + sort( $q['tag_slug__and'] ); + $tax_query[] = array( 'taxonomy' => 'post_tag', 'terms' => $q['tag_slug__and'], 'field' => 'slug', @@ -2186,8 +2213,11 @@ public function get_posts() { $where .= " AND {$wpdb->posts}.post_name = '" . $q['attachment'] . "'"; } elseif ( is_array( $q['post_name__in'] ) && ! empty( $q['post_name__in'] ) ) { $q['post_name__in'] = array_map( 'sanitize_title_for_query', $q['post_name__in'] ); - $post_name__in = "'" . implode( "','", $q['post_name__in'] ) . "'"; - $where .= " AND {$wpdb->posts}.post_name IN ($post_name__in)"; + // Duplicate array before sorting to allow for the orderby clause. + $post_name__in_for_where = array_unique( $q['post_name__in'] ); + sort( $post_name__in_for_where ); + $post_name__in = "'" . implode( "','", $post_name__in_for_where ) . "'"; + $where .= " AND {$wpdb->posts}.post_name IN ($post_name__in)"; } // If an attachment is requested by number, let it supersede any post number. @@ -2199,9 +2229,14 @@ public function get_posts() { if ( $q['p'] ) { $where .= " AND {$wpdb->posts}.ID = " . $q['p']; } elseif ( $q['post__in'] ) { - $post__in = implode( ',', array_map( 'absint', $q['post__in'] ) ); + // Duplicate array before sorting to allow for the orderby clause. + $post__in_for_where = $q['post__in']; + $post__in_for_where = array_unique( array_map( 'absint', $post__in_for_where ) ); + sort( $post__in_for_where ); + $post__in = implode( ',', array_map( 'absint', $post__in_for_where ) ); $where .= " AND {$wpdb->posts}.ID IN ($post__in)"; } elseif ( $q['post__not_in'] ) { + sort( $q['post__not_in'] ); $post__not_in = implode( ',', array_map( 'absint', $q['post__not_in'] ) ); $where .= " AND {$wpdb->posts}.ID NOT IN ($post__not_in)"; } @@ -2209,9 +2244,14 @@ public function get_posts() { if ( is_numeric( $q['post_parent'] ) ) { $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_parent = %d ", $q['post_parent'] ); } elseif ( $q['post_parent__in'] ) { - $post_parent__in = implode( ',', array_map( 'absint', $q['post_parent__in'] ) ); + // Duplicate array before sorting to allow for the orderby clause. + $post_parent__in_for_where = $q['post_parent__in']; + $post_parent__in_for_where = array_unique( array_map( 'absint', $post_parent__in_for_where ) ); + sort( $post_parent__in_for_where ); + $post_parent__in = implode( ',', array_map( 'absint', $post_parent__in_for_where ) ); $where .= " AND {$wpdb->posts}.post_parent IN ($post_parent__in)"; } elseif ( $q['post_parent__not_in'] ) { + sort( $q['post_parent__not_in'] ); $post_parent__not_in = implode( ',', array_map( 'absint', $q['post_parent__not_in'] ) ); $where .= " AND {$wpdb->posts}.post_parent NOT IN ($post_parent__not_in)"; } @@ -2341,6 +2381,7 @@ public function get_posts() { if ( ! empty( $q['author'] ) && '0' != $q['author'] ) { $q['author'] = addslashes_gpc( '' . urldecode( $q['author'] ) ); $authors = array_unique( array_map( 'intval', preg_split( '/[,\s]+/', $q['author'] ) ) ); + sort( $authors ); foreach ( $authors as $author ) { $key = $author > 0 ? 'author__in' : 'author__not_in'; $q[ $key ][] = abs( $author ); @@ -2349,9 +2390,17 @@ public function get_posts() { } if ( ! empty( $q['author__not_in'] ) ) { - $author__not_in = implode( ',', array_map( 'absint', array_unique( (array) $q['author__not_in'] ) ) ); + if ( is_array( $q['author__not_in'] ) ) { + $q['author__not_in'] = array_unique( array_map( 'absint', $q['author__not_in'] ) ); + sort( $q['author__not_in'] ); + } + $author__not_in = implode( ',', (array) $q['author__not_in'] ); $where .= " AND {$wpdb->posts}.post_author NOT IN ($author__not_in) "; } elseif ( ! empty( $q['author__in'] ) ) { + if ( is_array( $q['author__in'] ) ) { + $q['author__in'] = array_unique( array_map( 'absint', $q['author__in'] ) ); + sort( $q['author__in'] ); + } $author__in = implode( ',', array_map( 'absint', array_unique( (array) $q['author__in'] ) ) ); $where .= " AND {$wpdb->posts}.post_author IN ($author__in) "; } @@ -2588,6 +2637,7 @@ public function get_posts() { if ( ! is_array( $q_status ) ) { $q_status = explode( ',', $q_status ); } + sort( $q_status ); $r_status = array(); $p_status = array(); $e_status = array(); @@ -4902,6 +4952,33 @@ protected function generate_cache_key( array $args, $sql ) { // Sort post types to ensure same cache key generation. sort( $args['post_type'] ); + /* + * Sort arrays that can be used for ordering prior to cache key generation. + * + * These arrays are sorted in the query generator for the purposes of the + * WHERE clause but the arguments are not modified as they can be used for + * the orderby clase. + * + * Their use in the orderby clause will generate a different SQL query so + * they can be sorted for the cache key generation. + */ + $sortable_arrays_with_int_values = array( + 'post__in', + 'post_parent__in', + ); + foreach ( $sortable_arrays_with_int_values as $key ) { + if ( isset( $args[ $key ] ) && is_array( $args[ $key ] ) ) { + $args[ $key ] = array_unique( array_map( 'absint', $args[ $key ] ) ); + sort( $args[ $key ] ); + } + } + + // Sort and unique the 'post_name__in' for cache key generation. + if ( isset( $args['post_name__in'] ) && is_array( $args['post_name__in'] ) ) { + $args['post_name__in'] = array_unique( $args['post_name__in'] ); + sort( $args['post_name__in'] ); + } + if ( isset( $args['post_status'] ) ) { $args['post_status'] = (array) $args['post_status']; // Sort post status to ensure same cache key generation. @@ -4942,7 +5019,8 @@ static function ( &$value ) use ( $wpdb, $placeholder ) { $last_changed .= wp_cache_get_last_changed( 'terms' ); } - return "wp_query:$key:$last_changed"; + $this->query_cache_key = "wp_query:$key:$last_changed"; + return $this->query_cache_key; } /** diff --git a/tests/phpunit/tests/query/cacheResults.php b/tests/phpunit/tests/query/cacheResults.php index 1912f69735034..5fa38a59e73ea 100644 --- a/tests/phpunit/tests/query/cacheResults.php +++ b/tests/phpunit/tests/query/cacheResults.php @@ -200,8 +200,175 @@ public function test_generate_cache_key_unregister_post_type() { $this->assertNotSame( $cache_key_1, $cache_key_2, 'Cache key should differ after unregistering post type.' ); } + /** + * @ticket 59516 + * + * @covers WP_Query::generate_cache_key + */ + public function test_post_in_order_by_clauses_are_not_normalized() { + global $wpdb; + + $post_ids = self::$posts; + + $query_vars1 = array( + 'post__in' => $post_ids, + 'orderby' => 'post__in', + ); + $query_vars2 = array( + 'post__in' => array_reverse( $post_ids ), + 'orderby' => 'post__in', + ); + + $fields = "{$wpdb->posts}.ID"; + $query1 = new WP_Query( $query_vars1 ); + $request1 = str_replace( $fields, "{$wpdb->posts}.*", $query1->request ); + + $query2 = new WP_Query( $query_vars2 ); + $request2 = str_replace( $fields, "{$wpdb->posts}.*", $query2->request ); + + $reflection_q1 = new ReflectionProperty( $query1, 'query_cache_key' ); + $reflection_q1->setAccessible( true ); + + $reflection_q2 = new ReflectionProperty( $query2, 'query_cache_key' ); + $reflection_q2->setAccessible( true ); + + $this->assertNotSame( $request1, $request2, 'Queries should not match' ); + + $cache_key_1 = $reflection_q1->getValue( $query1 ); + $cache_key_2 = $reflection_q2->getValue( $query2 ); + + $this->assertNotSame( $cache_key_1, $cache_key_2, 'Cache key should differ.' ); + $this->assertNotEmpty( $cache_key_1, 'Cache key for query one should not be empty.' ); + $this->assertNotEmpty( $cache_key_2, 'Cache key for query two should not be empty.' ); + + // Test the posts are returned different orders. + $this->assertNotSame( wp_list_pluck( $query1->posts, 'ID' ), wp_list_pluck( $query2->posts, 'ID' ), 'Query one posts should not match the order of query two posts.' ); + // Test the posts are the same sets. + $this->assertSameSets( wp_list_pluck( $query1->posts, 'ID' ), wp_list_pluck( $query2->posts, 'ID' ), 'Query one posts should match the set of query two posts.' ); + } + + /** + * @ticket 59516 + * + * @covers WP_Query::generate_cache_key + */ + public function test_post_parent_in_order_by_clauses_are_not_normalized() { + global $wpdb; + + $parent_pages = self::$pages; + $post_names = array( 'doctor-dillamond', 'elphaba', 'fiyero', 'glinda', 'the-wizard-of-oz' ); + $child_pages = array(); + foreach ( $parent_pages as $key => $parent_page ) { + $child_pages[] = self::factory()->post->create( + array( + 'post_parent' => $parent_page, + 'post_type' => 'page', + 'post_name' => $post_names[ $key ], + ) + ); + } + + $query_vars1 = array( + 'post_parent__in' => $parent_pages, + 'post_type' => 'page', + 'orderby' => 'post_parent__in', + ); + + $query_vars2 = array( + 'post_parent__in' => array_reverse( $parent_pages ), + 'post_type' => 'page', + 'orderby' => 'post_parent__in', + ); + + $fields = "{$wpdb->posts}.ID"; + $query1 = new WP_Query( $query_vars1 ); + $request1 = str_replace( $fields, "{$wpdb->posts}.*", $query1->request ); + + $query2 = new WP_Query( $query_vars2 ); + $request2 = str_replace( $fields, "{$wpdb->posts}.*", $query2->request ); + + $reflection_q1 = new ReflectionProperty( $query1, 'query_cache_key' ); + $reflection_q1->setAccessible( true ); + + $reflection_q2 = new ReflectionProperty( $query2, 'query_cache_key' ); + $reflection_q2->setAccessible( true ); + + $this->assertNotSame( $request1, $request2, 'Queries should not match' ); + + $cache_key_1 = $reflection_q1->getValue( $query1 ); + $cache_key_2 = $reflection_q2->getValue( $query2 ); + + $this->assertNotSame( $cache_key_1, $cache_key_2, 'Cache key should differ.' ); + $this->assertNotEmpty( $cache_key_1, 'Cache key for query one should not be empty.' ); + $this->assertNotEmpty( $cache_key_2, 'Cache key for query two should not be empty.' ); + + // Test the posts are returned in the correct order. + $this->assertSame( array( 'doctor-dillamond', 'elphaba', 'fiyero', 'glinda', 'the-wizard-of-oz' ), wp_list_pluck( $query1->posts, 'post_name' ), 'Query one posts should be in alphabetical order' ); + $this->assertSame( array( 'the-wizard-of-oz', 'glinda', 'fiyero', 'elphaba', 'doctor-dillamond' ), wp_list_pluck( $query2->posts, 'post_name' ), 'Query two posts should be in reverse alphabetical order.' ); + // Test the posts are the same sets. + $this->assertSameSets( wp_list_pluck( $query1->posts, 'ID' ), wp_list_pluck( $query2->posts, 'ID' ), 'Query one posts should match the set of query two posts.' ); + } + + /** + * @ticket 59516 + * + * @covers WP_Query::generate_cache_key + */ + public function test_post_name_in_order_by_clauses_are_not_normalized() { + global $wpdb; + $post_names = array( 'doctor-dillamond', 'elphaba', 'glinda', 'the-wizard-of-oz' ); + $posts = array(); + + foreach ( $post_names as $post_name ) { + $posts[] = self::factory()->post->create( + array( + 'post_name' => $post_name, + ) + ); + } + + $query_vars1 = array( + 'post_name__in' => $post_names, + 'orderby' => 'post_name__in', + ); + + $query_vars2 = array( + 'post_name__in' => array_reverse( $post_names ), + 'orderby' => 'post_name__in', + ); + + $fields = "{$wpdb->posts}.ID"; + $query1 = new WP_Query( $query_vars1 ); + $request1 = str_replace( $fields, "{$wpdb->posts}.*", $query1->request ); + + $query2 = new WP_Query( $query_vars2 ); + $request2 = str_replace( $fields, "{$wpdb->posts}.*", $query2->request ); + + $reflection_q1 = new ReflectionProperty( $query1, 'query_cache_key' ); + $reflection_q1->setAccessible( true ); + + $reflection_q2 = new ReflectionProperty( $query2, 'query_cache_key' ); + $reflection_q2->setAccessible( true ); + + $this->assertNotSame( $request1, $request2, 'Queries should not match' ); + + $cache_key_1 = $reflection_q1->getValue( $query1 ); + $cache_key_2 = $reflection_q2->getValue( $query2 ); + + $this->assertNotSame( $cache_key_1, $cache_key_2, 'Cache key should differ.' ); + $this->assertNotEmpty( $cache_key_1, 'Cache key for query one should not be empty.' ); + $this->assertNotEmpty( $cache_key_2, 'Cache key for query two should not be empty.' ); + + // Test the posts are returned in the correct order. + $this->assertSame( array( 'doctor-dillamond', 'elphaba', 'glinda', 'the-wizard-of-oz' ), wp_list_pluck( $query1->posts, 'post_name' ), 'Query one posts should be in alphabetical order' ); + $this->assertSame( array( 'the-wizard-of-oz', 'glinda', 'elphaba', 'doctor-dillamond' ), wp_list_pluck( $query2->posts, 'post_name' ), 'Query two posts should be in reverse alphabetical order.' ); + // Test the posts are the same sets. + $this->assertSameSets( wp_list_pluck( $query1->posts, 'ID' ), wp_list_pluck( $query2->posts, 'ID' ), 'Query one posts should match the set of query two posts.' ); + } + /** * @ticket 59442 + * @ticket 59516 * * @covers WP_Query::generate_cache_key * @@ -217,15 +384,20 @@ public function test_generate_cache_key_normalize( $query_vars1, $query_vars2 ) $query2 = new WP_Query( $query_vars2 ); $request2 = str_replace( $fields, "{$wpdb->posts}.*", $query2->request ); - $reflection = new ReflectionMethod( $query1, 'generate_cache_key' ); - $reflection->setAccessible( true ); + $reflection_q1 = new ReflectionProperty( $query1, 'query_cache_key' ); + $reflection_q1->setAccessible( true ); + + $reflection_q2 = new ReflectionProperty( $query2, 'query_cache_key' ); + $reflection_q2->setAccessible( true ); $this->assertSame( $request1, $request2, 'Queries should match' ); - $cache_key_1 = $reflection->invoke( $query1, $query_vars1, $request1 ); - $cache_key_2 = $reflection->invoke( $query1, $query_vars2, $request2 ); + $cache_key_1 = $reflection_q1->getValue( $query1 ); + $cache_key_2 = $reflection_q2->getValue( $query2 ); - $this->assertSame( $cache_key_1, $cache_key_2, 'Cache key differs the same paramters.' ); + $this->assertSame( $cache_key_1, $cache_key_2, 'Cache key differs the same effective parameters.' ); + $this->assertNotEmpty( $cache_key_1, 'Cache key for query one should not be empty.' ); + $this->assertNotEmpty( $cache_key_2, 'Cache key for query two should not be empty.' ); } /** @@ -280,19 +452,19 @@ public function test_query_cache( $args ) { */ public function data_query_cache_duplicate() { return array( - 'post type empty' => array( + 'post type empty' => array( 'query_vars1' => array( 'post_type' => '' ), 'query_vars2' => array( 'post_type' => 'post' ), ), - 'post type array' => array( + 'post type array' => array( 'query_vars1' => array( 'post_type' => array( 'page' ) ), 'query_vars2' => array( 'post_type' => 'page' ), ), - 'orderby empty' => array( + 'orderby empty' => array( 'query_vars1' => array( 'orderby' => null ), 'query_vars2' => array( 'orderby' => 'date' ), ), - 'different order parameter' => array( + 'different order parameter' => array( 'query_vars1' => array( 'post_type' => 'post', 'posts_per_page' => 15, @@ -302,31 +474,241 @@ public function data_query_cache_duplicate() { 'post_type' => 'post', ), ), - 'same args' => array( + 'same args' => array( 'query_vars1' => array( 'post_type' => 'post' ), 'query_vars2' => array( 'post_type' => 'post' ), ), - 'same args any' => array( + 'same args any' => array( 'query_vars1' => array( 'post_type' => 'any' ), 'query_vars2' => array( 'post_type' => 'any' ), ), - 'any and post types' => array( + 'any and post types' => array( 'query_vars1' => array( 'post_type' => 'any' ), 'query_vars2' => array( 'post_type' => array( 'post', 'page', 'attachment' ) ), ), - 'different order post type' => array( + 'different order post type' => array( 'query_vars1' => array( 'post_type' => array( 'post', 'page' ) ), 'query_vars2' => array( 'post_type' => array( 'page', 'post' ) ), ), - 'post status array' => array( + 'non-unique post type' => array( + 'query_vars1' => array( 'post_type' => array( 'post', 'page' ) ), + 'query_vars2' => array( 'post_type' => array( 'page', 'post', 'page' ) ), + ), + 'post status array' => array( 'query_vars1' => array( 'post_status' => 'publish' ), 'query_vars2' => array( 'post_status' => array( 'publish' ) ), ), - 'post status order' => array( + 'post status order' => array( 'query_vars1' => array( 'post_status' => array( 'draft', 'publish' ) ), 'query_vars2' => array( 'post_status' => array( 'publish', 'draft' ) ), ), - 'cache parameters' => array( + 'non-unique post status' => array( + 'query_vars1' => array( 'post_status' => array( 'draft', 'publish' ) ), + 'query_vars2' => array( 'post_status' => array( 'draft', 'publish', 'draft' ) ), + ), + 'post id int vs string' => array( + 'query_vars1' => array( 'p' => '1' ), + 'query_vars2' => array( 'p' => 1 ), + ), + 'page id int vs string' => array( + 'query_vars1' => array( 'page_id' => '2' ), + 'query_vars2' => array( 'page_id' => 2 ), + ), + 'attachment id int vs string' => array( + 'query_vars1' => array( 'attachment_id' => '3' ), + 'query_vars2' => array( 'attachment_id' => 3 ), + ), + 'date and time values int vs string' => array( + 'query_vars1' => array( + 'year' => '2013', + 'monthnum' => '12', + 'day' => '12', + 'hour' => '12', + 'minute' => '12', + 'second' => '12', + ), + 'query_vars2' => array( + 'year' => 2013, + 'monthnum' => 12, + 'day' => 12, + 'hour' => 12, + 'minute' => 12, + 'second' => 12, + ), + ), + 'offset value int vs string' => array( + 'query_vars1' => array( 'offset' => '5' ), + 'query_vars2' => array( 'offset' => 5 ), + ), + 'posts per page value int vs string' => array( + 'query_vars1' => array( 'posts_per_page' => '5' ), + 'query_vars2' => array( 'posts_per_page' => 5 ), + ), + 'paged value int vs string' => array( + 'query_vars1' => array( 'paged' => '2' ), + 'query_vars2' => array( 'paged' => 2 ), + ), + 'menu_order value int vs string' => array( + 'query_vars1' => array( 'menu_order' => '2' ), + 'query_vars2' => array( 'menu_order' => 2 ), + ), + 'post__in different order' => array( + 'query_vars1' => array( 'post__in' => array( 1, 2, 3, 4, 5 ) ), + 'query_vars2' => array( 'post__in' => array( 5, 4, 3, 2, 1 ) ), + ), + 'post__in non-unique' => array( + 'query_vars1' => array( 'post__in' => array( 1, 2, 3, 4, 5 ) ), + 'query_vars2' => array( 'post__in' => array( 1, 2, 3, 4, 5, 1, 2, 3 ) ), + ), + 'post_parent__in different order' => array( + 'query_vars1' => array( 'post_parent__in' => array( 1, 2, 3, 4, 5 ) ), + 'query_vars2' => array( 'post_parent__in' => array( 5, 4, 3, 2, 1 ) ), + ), + 'post_parent__in non-unique' => array( + 'query_vars1' => array( 'post_parent__in' => array( 1, 2, 3, 4, 5 ) ), + 'query_vars2' => array( 'post_parent__in' => array( 1, 2, 3, 4, 5, 1, 2, 3 ) ), + ), + 'post_name__in different order' => array( + 'query_vars1' => array( 'post_name__in' => array( 'elphaba', 'glinda', 'the-wizard-of-oz', 'doctor-dillamond' ) ), + 'query_vars2' => array( 'post_name__in' => array( 'doctor-dillamond', 'elphaba', 'the-wizard-of-oz', 'glinda' ) ), + ), + 'post_name__in non-unique' => array( + 'query_vars1' => array( 'post_name__in' => array( 'elphaba', 'glinda', 'the-wizard-of-oz', 'doctor-dillamond' ) ), + 'query_vars2' => array( 'post_name__in' => array( 'elphaba', 'glinda', 'elphaba', 'glinda', 'the-wizard-of-oz', 'doctor-dillamond' ) ), + ), + 'cat different order (array)' => array( + 'query_vars_1' => array( 'cat' => array( '1', '2' ) ), + 'query_vars_2' => array( 'cat' => array( '2', '1' ) ), + ), + 'cat different order (string)' => array( + 'query_vars_1' => array( 'cat' => '2,1' ), + 'query_vars_2' => array( 'cat' => '1,2' ), + ), + 'cat queries int vs string' => array( + 'query_vars_1' => array( 'cat' => '2' ), + 'query_vars_2' => array( 'cat' => 2 ), + ), + 'category__in queries different order (array)' => array( + 'query_vars_1' => array( 'category__in' => array( '1', '2' ) ), + 'query_vars_2' => array( 'category__in' => array( '2', '1' ) ), + ), + 'category__in queries with non-unique array' => array( + 'query_vars_1' => array( 'category__in' => array( '1', '1' ) ), + 'query_vars_2' => array( 'category__in' => array( '1' ) ), + ), + 'category__in queries string vs array (array)' => array( + 'query_vars_1' => array( 'category__in' => array( '1' ) ), + 'query_vars_2' => array( 'category__in' => array( 1 ) ), + ), + 'category__not_in different order (array)' => array( + 'query_vars_1' => array( 'category__not_in' => array( '1', '2' ) ), + 'query_vars_2' => array( 'category__not_in' => array( '2', '1' ) ), + ), + 'category__not_in with non-unique array' => array( + 'query_vars_1' => array( 'category__not_in' => array( '1', '1' ) ), + 'query_vars_2' => array( 'category__not_in' => array( '1' ) ), + ), + 'category__not_in queries string vs array (array)' => array( + 'query_vars_1' => array( 'category__not_in' => array( '1' ) ), + 'query_vars_2' => array( 'category__not_in' => array( 1 ) ), + ), + 'category__and queries width different order (array)' => array( + 'query_vars_1' => array( 'category__and' => array( '1', '2' ) ), + 'query_vars_2' => array( 'category__and' => array( '2', '1' ) ), + ), + 'category__and with non-unique array' => array( + 'query_vars_1' => array( 'category__and' => array( '1', '1', '2' ) ), + 'query_vars_2' => array( 'category__and' => array( '1', '2' ) ), + ), + 'category__and queries string vs array (array)' => array( + 'query_vars_1' => array( 'category__and' => array( '1', '2' ) ), + 'query_vars_2' => array( 'category__and' => array( 1, 2 ) ), + ), + 'author queries different order (string)' => array( + 'query_vars_1' => array( 'author' => '1,2' ), + 'query_vars_2' => array( 'author' => '2,1' ), + ), + 'author with non-unique string' => array( + 'query_vars_1' => array( 'author' => '1,1' ), + 'query_vars_2' => array( 'author' => '1' ), + ), + 'author queries int vs string (string)' => array( + 'query_vars_1' => array( 'author' => 1 ), + 'query_vars_2' => array( 'author' => '1' ), + ), + 'author queries int vs string (array)' => array( + 'query_vars_1' => array( 'author' => array( 1 ) ), + 'query_vars_2' => array( 'author' => array( '1' ) ), + ), + 'author__in different order' => array( + 'query_vars_1' => array( 'author__in' => array( 1, 2 ) ), + 'query_vars_2' => array( 'author__in' => array( 2, 1 ) ), + ), + 'author__in with non-unique array' => array( + 'query_vars_1' => array( 'author__in' => array( 1, 1, 2 ) ), + 'query_vars_2' => array( 'author__in' => array( 1, 2 ) ), + ), + 'author__in queries int vs string (array)' => array( + 'query_vars_1' => array( 'author__in' => array( 1 ) ), + 'query_vars_2' => array( 'author__in' => array( '1' ) ), + ), + 'author__not_in different order (array)' => array( + 'query_vars_1' => array( 'author__not_in' => array( 1, 2 ) ), + 'query_vars_2' => array( 'author__not_in' => array( 2, 1 ) ), + ), + 'author__not_in queries int vs string (array)' => array( + 'query_vars_1' => array( 'author__not_in' => array( 1 ) ), + 'query_vars_2' => array( 'author__not_in' => array( '1' ) ), + ), + 'tag_slug__in order' => array( + 'query_vars_1' => array( 'tag_slug__in' => array( 'foo', 'bar' ) ), + 'query_vars_2' => array( 'tag_slug__in' => array( 'bar', 'foo' ) ), + ), + 'tag_slug__in non-unique vs unique' => array( + 'query_vars_1' => array( 'tag_slug__in' => array( 'foo', 'bar', 'bar' ) ), + 'query_vars_2' => array( 'tag_slug__in' => array( 'foo', 'bar' ) ), + ), + 'tag_slug__and order' => array( + 'query_vars_1' => array( 'tag_slug__and' => array( 'foo', 'bar' ) ), + 'query_vars_2' => array( 'tag_slug__and' => array( 'bar', 'foo' ) ), + ), + 'tag_slug__and non-unique' => array( + 'query_vars_1' => array( 'tag_slug__and' => array( 'foo', 'bar', 'foo' ) ), + 'query_vars_2' => array( 'tag_slug__and' => array( 'bar', 'foo' ) ), + ), + 'tag__in queries different order (array)' => array( + 'query_vars_1' => array( 'tag__in' => array( 1, 2 ) ), + 'query_vars_2' => array( 'tag__in' => array( 2, 1 ) ), + ), + 'tag__in queries non-unique array' => array( + 'query_vars_1' => array( 'tag__in' => array( 1, 2, 1 ) ), + 'query_vars_2' => array( 'tag__in' => array( 2, 1 ) ), + ), + 'tag__in queries int vs string' => array( + 'query_vars_1' => array( 'tag__in' => array( 2, 1 ) ), + 'query_vars_2' => array( 'tag__in' => array( '2', '1' ) ), + ), + 'tag__and queries different order (array)' => array( + 'query_vars_1' => array( 'tag__and' => array( 1, 2 ) ), + 'query_vars_2' => array( 'tag__and' => array( 2, 1 ) ), + ), + 'tag__and queries non-unique array' => array( + 'query_vars_1' => array( 'tag__and' => array( 1, 2, 2 ) ), + 'query_vars_2' => array( 'tag__and' => array( 2, 1 ) ), + ), + 'tag__not_in queries different order (array)' => array( + 'query_vars_1' => array( 'tag__not_in' => array( 1, 2 ) ), + 'query_vars_2' => array( 'tag__not_in' => array( 2, 1 ) ), + ), + 'tag__not_in queries non-unique array' => array( + 'query_vars_1' => array( 'tag__not_in' => array( 1, 2, 2 ) ), + 'query_vars_2' => array( 'tag__not_in' => array( 1, 2 ) ), + ), + 'tag__not_in queries int vs string (array)' => array( + 'query_vars_1' => array( 'tag__not_in' => array( '1' ) ), + 'query_vars_2' => array( 'tag__not_in' => array( 1 ) ), + ), + 'cache parameters' => array( 'query_vars1' => array( 'update_post_meta_cache' => true, 'update_post_term_cache' => true, diff --git a/tests/phpunit/tests/query/parseQuery.php b/tests/phpunit/tests/query/parseQuery.php index bbf3f1217fb2e..94ced1ecd6e75 100644 --- a/tests/phpunit/tests/query/parseQuery.php +++ b/tests/phpunit/tests/query/parseQuery.php @@ -151,7 +151,7 @@ public function test_parse_query_cat_array_mixed() { ) ); - $this->assertSame( '1,-1', $q->query_vars['cat'] ); + $this->assertSame( '-1,1', $q->query_vars['cat'] ); } /** diff --git a/tests/phpunit/tests/rest-api/rest-posts-controller.php b/tests/phpunit/tests/rest-api/rest-posts-controller.php index a1b8de0474359..c42fded13222a 100644 --- a/tests/phpunit/tests/rest-api/rest-posts-controller.php +++ b/tests/phpunit/tests/rest-api/rest-posts-controller.php @@ -1574,7 +1574,7 @@ public function test_get_items_not_sticky_with_exclude() { $this->assertNotContains( $id2, $ids ); $this->assertNotContains( $id3, $ids ); - $this->assertPostsWhere( " AND {posts}.ID NOT IN ($id3,$id2) AND {posts}.post_type = 'post' AND (({posts}.post_status = 'publish'))" ); + $this->assertPostsWhere( " AND {posts}.ID NOT IN ($id2,$id3) AND {posts}.post_type = 'post' AND (({posts}.post_status = 'publish'))" ); } public function test_get_items_not_sticky_with_exclude_no_sticky_posts() { From d5c9ae5bd56bf86259af25c29a19511d4bf1969f Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Thu, 6 Feb 2025 12:22:22 +0000 Subject: [PATCH 286/323] Coding Standards: Use strict comparison in `media_upload_library_form()`. Includes bringing some consistency with a similar fragment in `WP_List_Table::months_dropdown()`. Follow-up to [3724], [7062], [15491], [59755]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59767 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/class-wp-list-table.php | 4 +- src/wp-admin/includes/media.php | 43 +++++++++---------- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/src/wp-admin/includes/class-wp-list-table.php b/src/wp-admin/includes/class-wp-list-table.php index 3a65e015d5694..924cc7db30802 100644 --- a/src/wp-admin/includes/class-wp-list-table.php +++ b/src/wp-admin/includes/class-wp-list-table.php @@ -780,9 +780,9 @@ protected function months_dropdown( $post_type ) { printf( "<option %s value='%s'>%s</option>\n", selected( $selected_month, $year . $month, false ), - esc_attr( $arc_row->year . $month ), + esc_attr( $year . $month ), /* translators: 1: Month name, 2: 4-digit year. */ - sprintf( __( '%1$s %2$d' ), $wp_locale->get_month( $month ), $year ) + esc_html( sprintf( __( '%1$s %2$d' ), $wp_locale->get_month( $month ), $year ) ) ); } ?> diff --git a/src/wp-admin/includes/media.php b/src/wp-admin/includes/media.php index 24dfef62f5b8a..73a2585f84e24 100644 --- a/src/wp-admin/includes/media.php +++ b/src/wp-admin/includes/media.php @@ -2845,38 +2845,37 @@ function media_upload_library_form( $errors ) { <div class="alignleft actions"> <?php + $months = $wpdb->get_results( + "SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month + FROM $wpdb->posts + WHERE post_type = 'attachment' + ORDER BY post_date DESC" + ); - $arc_query = "SELECT DISTINCT YEAR(post_date) AS yyear, MONTH(post_date) AS mmonth FROM $wpdb->posts WHERE post_type = 'attachment' ORDER BY post_date DESC"; - - $arc_result = $wpdb->get_results( $arc_query ); - - $month_count = count( $arc_result ); - $selected_month = isset( $_GET['m'] ) ? $_GET['m'] : 0; + $month_count = count( $months ); + $selected_month = isset( $_GET['m'] ) ? (int) $_GET['m'] : 0; - if ( $month_count && ! ( 1 == $month_count && 0 == $arc_result[0]->mmonth ) ) { + if ( $month_count && ( 1 !== $month_count || 0 !== (int) $months[0]->month ) ) { ?> <select name='m'> - <option<?php selected( $selected_month, 0 ); ?> value='0'><?php _e( 'All dates' ); ?></option> + <option<?php selected( $selected_month, 0 ); ?> value='0'><?php _e( 'All dates' ); ?></option> <?php - - foreach ( $arc_result as $arc_row ) { - if ( 0 == $arc_row->yyear ) { + foreach ( $months as $arc_row ) { + if ( 0 === (int) $arc_row->year ) { continue; } - $arc_row->mmonth = zeroise( $arc_row->mmonth, 2 ); + $month = zeroise( $arc_row->month, 2 ); + $year = $arc_row->year; - if ( $arc_row->yyear . $arc_row->mmonth == $selected_month ) { - $default = ' selected="selected"'; - } else { - $default = ''; - } - - echo "<option$default value='" . esc_attr( $arc_row->yyear . $arc_row->mmonth ) . "'>"; - echo esc_html( $wp_locale->get_month( $arc_row->mmonth ) . " $arc_row->yyear" ); - echo "</option>\n"; + printf( + "<option %s value='%s'>%s</option>\n", + selected( $selected_month, $year . $month, false ), + esc_attr( $year . $month ), + /* translators: 1: Month name, 2: 4-digit year. */ + esc_html( sprintf( __( '%1$s %2$d' ), $wp_locale->get_month( $month ), $year ) ) + ); } - ?> </select> <?php } ?> From 76a89c2f7298e25e6b333426858aedc5748a3027 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Thu, 6 Feb 2025 17:25:01 +0000 Subject: [PATCH 287/323] Build/Test Tools: Configure UglifyJS to preserve previous behavior. As of UglifyJS >= 3.18.0, the default behavior is to process input as an ES module. This updates the relevant configurations to ensure the build process continues to use the previous behavior to avoid JavaScript errors in the minified versions of files. Follow up to [58563], [58586], and [59509]. Props siliconforks, nataliat2004, poena, mai21, SergeyBiryukov. Fixes #62767. See #61519, #62220. git-svn-id: https://develop.svn.wordpress.org/trunk@59768 602fd350-edb4-49c9-b593-d223f7449a82 --- Gruntfile.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Gruntfile.js b/Gruntfile.js index 1b58ac12b1256..954d66599c94f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -774,7 +774,14 @@ module.exports = function(grunt) { }, uglify: { options: { + parse: { + module: false + }, + compress: { + module: false + }, output: { + module: false, ascii_only: true } }, From 5b5d358a577ca3bd2b7b97a528c7597736899655 Mon Sep 17 00:00:00 2001 From: desrosj <desrosj@602fd350-edb4-49c9-b593-d223f7449a82> Date: Thu, 6 Feb 2025 17:51:01 +0000 Subject: [PATCH 288/323] Import: Remove Importer plugin related unit tests. The WordPress Importer plugin has been maintained separately in a repository on GitHub since 2016. However, the unit tests were left in wordpress-develop due to the lack of a CI setup on GitHub. With GitHub Actions set up for the plugin repository, these tests are now running in two locations. Because they are more relevant to the plugin itself, the tests have been synced, will run weekly through a `schedule` event, and are now being removed from wordpress-develop. The only remaining test method in the `import` group covers `get_importers()`, which is a function maintained in WordPress Core itself. Props frank-klein, netweb, dd32, peterwilsoncc, azaozz, desrosj, swissspidy. Fixes #42668. git-svn-id: https://develop.svn.wordpress.org/trunk@59769 602fd350-edb4-49c9-b593-d223f7449a82 --- tests/phpunit/includes/bootstrap.php | 1 - tests/phpunit/tests/import/base.php | 76 ------ tests/phpunit/tests/import/import.php | 268 +------------------ tests/phpunit/tests/import/parser.php | 341 ------------------------ tests/phpunit/tests/import/postmeta.php | 100 ------- tools/local-env/scripts/install.js | 13 - 6 files changed, 1 insertion(+), 798 deletions(-) delete mode 100644 tests/phpunit/tests/import/base.php delete mode 100644 tests/phpunit/tests/import/parser.php delete mode 100644 tests/phpunit/tests/import/postmeta.php diff --git a/tests/phpunit/includes/bootstrap.php b/tests/phpunit/includes/bootstrap.php index c28ddb6eb07b2..d4dd978b379e2 100644 --- a/tests/phpunit/includes/bootstrap.php +++ b/tests/phpunit/includes/bootstrap.php @@ -214,7 +214,6 @@ define( 'WP_TESTS_TABLE_PREFIX', $table_prefix ); define( 'DIR_TESTDATA', __DIR__ . '/../data' ); define( 'DIR_TESTROOT', realpath( dirname( __DIR__ ) ) ); -define( 'IMPORTER_PLUGIN_FOR_TESTS', DIR_TESTDATA . '/plugins/wordpress-importer/wordpress-importer.php' ); define( 'WP_LANG_DIR', realpath( DIR_TESTDATA . '/languages' ) ); diff --git a/tests/phpunit/tests/import/base.php b/tests/phpunit/tests/import/base.php deleted file mode 100644 index 84cb179b97d78..0000000000000 --- a/tests/phpunit/tests/import/base.php +++ /dev/null @@ -1,76 +0,0 @@ -<?php - -abstract class WP_Import_UnitTestCase extends WP_UnitTestCase { - - /** - * Require the WordPress Importer plugin. - * - * Fails the test if the plugin is not installed. - */ - protected function require_importer() { - if ( ! file_exists( IMPORTER_PLUGIN_FOR_TESTS ) ) { - $this->fail( 'This test requires the WordPress Importer plugin to be installed in the test suite. See: https://make.wordpress.org/core/handbook/contribute/git/#unit-tests' ); - } - require_once IMPORTER_PLUGIN_FOR_TESTS; - } - - /** - * Import a WXR file. - * - * The $users parameter provides information on how users specified in the import - * file should be imported. Each key is a user login name and indicates if the user - * should be mapped to an existing user, created as a new user with a particular login - * or imported with the information held in the WXR file. An example of this: - * - * <code> - * $users = array( - * 'alice' => 1, // alice will be mapped to user ID 1. - * 'bob' => 'john', // bob will be transformed into john. - * 'eve' => false // eve will be imported as is. - * );</code> - * - * @param string $filename Full path of the file to import - * @param array $users User import settings - * @param bool $fetch_files Whether or not do download remote attachments - */ - protected function _import_wp( $filename, $users = array(), $fetch_files = true ) { - $this->require_importer(); - - $importer = new WP_Import(); - $file = realpath( $filename ); - - $this->assertNotEmpty( $file, 'Path to import file is empty.' ); - $this->assertTrue( is_file( $file ), 'Import file is not a file.' ); - - $authors = array(); - $mapping = array(); - $new = array(); - $i = 0; - - // Each user is either mapped to a given ID, mapped to a new user - // with given login or imported using details in WXR file. - foreach ( $users as $user => $map ) { - $authors[ $i ] = $user; - if ( is_int( $map ) ) { - $mapping[ $i ] = $map; - } elseif ( is_string( $map ) ) { - $new[ $i ] = $map; - } - - ++$i; - } - - $_POST = array( - 'imported_authors' => $authors, - 'user_map' => $mapping, - 'user_new' => $new, - ); - - ob_start(); - $importer->fetch_attachments = $fetch_files; - $importer->import( $file ); - ob_end_clean(); - - $_POST = array(); - } -} diff --git a/tests/phpunit/tests/import/import.php b/tests/phpunit/tests/import/import.php index f00fb797261c5..be99ea2f2d87d 100644 --- a/tests/phpunit/tests/import/import.php +++ b/tests/phpunit/tests/import/import.php @@ -1,249 +1,9 @@ <?php -require_once __DIR__ . '/base.php'; - /** * @group import */ -class Tests_Import_Import extends WP_Import_UnitTestCase { - public function set_up() { - global $wpdb; - - parent::set_up(); - - if ( ! defined( 'WP_IMPORTING' ) ) { - define( 'WP_IMPORTING', true ); - } - - if ( ! defined( 'WP_LOAD_IMPORTERS' ) ) { - define( 'WP_LOAD_IMPORTERS', true ); - } - - add_filter( 'import_allow_create_users', '__return_true' ); - - $this->require_importer(); - - // Crude but effective: make sure there's no residual data in the main tables. - foreach ( array( 'posts', 'postmeta', 'comments', 'terms', 'term_taxonomy', 'term_relationships', 'users', 'usermeta' ) as $table ) { - $wpdb->query( "DELETE FROM {$wpdb->$table}" ); - } - } - - /** - * @covers WP_Import::import - */ - public function test_small_import() { - global $wpdb; - - $authors = array( - 'admin' => false, - 'editor' => false, - 'author' => false, - ); - $this->_import_wp( DIR_TESTDATA . '/export/small-export.xml', $authors ); - - // Ensure that authors were imported correctly. - $user_count = count_users(); - $this->assertSame( 3, $user_count['total_users'] ); - $admin = get_user_by( 'login', 'admin' ); - $this->assertSame( 'admin', $admin->user_login ); - $this->assertSame( 'local@host.null', $admin->user_email ); - $editor = get_user_by( 'login', 'editor' ); - $this->assertSame( 'editor', $editor->user_login ); - $this->assertSame( 'editor@example.org', $editor->user_email ); - $this->assertSame( 'FirstName', $editor->user_firstname ); - $this->assertSame( 'LastName', $editor->user_lastname ); - $author = get_user_by( 'login', 'author' ); - $this->assertSame( 'author', $author->user_login ); - $this->assertSame( 'author@example.org', $author->user_email ); - - // Check that terms were imported correctly. - $this->assertSame( '30', wp_count_terms( array( 'taxonomy' => 'category' ) ) ); - $this->assertSame( '3', wp_count_terms( array( 'taxonomy' => 'post_tag' ) ) ); - $foo = get_term_by( 'slug', 'foo', 'category' ); - $this->assertSame( 0, $foo->parent ); - $bar = get_term_by( 'slug', 'bar', 'category' ); - $foo_bar = get_term_by( 'slug', 'foo-bar', 'category' ); - $this->assertSame( $bar->term_id, $foo_bar->parent ); - - // Check that posts/pages were imported correctly. - $post_count = wp_count_posts( 'post' ); - $this->assertSame( '5', $post_count->publish ); - $this->assertSame( '1', $post_count->private ); - $page_count = wp_count_posts( 'page' ); - $this->assertSame( '4', $page_count->publish ); - $this->assertSame( '1', $page_count->draft ); - $comment_count = wp_count_comments(); - $this->assertSame( 1, $comment_count->total_comments ); - - $posts = get_posts( - array( - 'numberposts' => 20, - 'post_type' => 'any', - 'post_status' => 'any', - 'orderby' => 'ID', - ) - ); - $this->assertCount( 11, $posts ); - - $post = $posts[0]; - $this->assertSame( 'Many Categories', $post->post_title ); - $this->assertSame( 'many-categories', $post->post_name ); - $this->assertEquals( $admin->ID, $post->post_author ); - $this->assertSame( 'post', $post->post_type ); - $this->assertSame( 'publish', $post->post_status ); - $this->assertSame( 0, $post->post_parent ); - $cats = wp_get_post_categories( $post->ID ); - $this->assertCount( 27, $cats ); - - $post = $posts[1]; - $this->assertSame( 'Non-standard post format', $post->post_title ); - $this->assertSame( 'non-standard-post-format', $post->post_name ); - $this->assertEquals( $admin->ID, $post->post_author ); - $this->assertSame( 'post', $post->post_type ); - $this->assertSame( 'publish', $post->post_status ); - $this->assertSame( 0, $post->post_parent ); - $cats = wp_get_post_categories( $post->ID ); - $this->assertCount( 1, $cats ); - $this->assertTrue( has_post_format( 'aside', $post->ID ) ); - - $post = $posts[2]; - $this->assertSame( 'Top-level Foo', $post->post_title ); - $this->assertSame( 'top-level-foo', $post->post_name ); - $this->assertEquals( $admin->ID, $post->post_author ); - $this->assertSame( 'post', $post->post_type ); - $this->assertSame( 'publish', $post->post_status ); - $this->assertSame( 0, $post->post_parent ); - $cats = wp_get_post_categories( $post->ID, array( 'fields' => 'all' ) ); - $this->assertCount( 1, $cats ); - $this->assertSame( 'foo', $cats[0]->slug ); - - $post = $posts[3]; - $this->assertSame( 'Foo-child', $post->post_title ); - $this->assertSame( 'foo-child', $post->post_name ); - $this->assertEquals( $editor->ID, $post->post_author ); - $this->assertSame( 'post', $post->post_type ); - $this->assertSame( 'publish', $post->post_status ); - $this->assertSame( 0, $post->post_parent ); - $cats = wp_get_post_categories( $post->ID, array( 'fields' => 'all' ) ); - $this->assertCount( 1, $cats ); - $this->assertSame( 'foo-bar', $cats[0]->slug ); - - $post = $posts[4]; - $this->assertSame( 'Private Post', $post->post_title ); - $this->assertSame( 'private-post', $post->post_name ); - $this->assertEquals( $admin->ID, $post->post_author ); - $this->assertSame( 'post', $post->post_type ); - $this->assertSame( 'private', $post->post_status ); - $this->assertSame( 0, $post->post_parent ); - $cats = wp_get_post_categories( $post->ID ); - $this->assertCount( 1, $cats ); - $tags = wp_get_post_tags( $post->ID ); - $this->assertCount( 3, $tags ); - $this->assertSame( 'tag1', $tags[0]->slug ); - $this->assertSame( 'tag2', $tags[1]->slug ); - $this->assertSame( 'tag3', $tags[2]->slug ); - - $post = $posts[5]; - $this->assertSame( '1-col page', $post->post_title ); - $this->assertSame( '1-col-page', $post->post_name ); - $this->assertEquals( $admin->ID, $post->post_author ); - $this->assertSame( 'page', $post->post_type ); - $this->assertSame( 'publish', $post->post_status ); - $this->assertSame( 0, $post->post_parent ); - $this->assertSame( 'onecolumn-page.php', get_post_meta( $post->ID, '_wp_page_template', true ) ); - - $post = $posts[6]; - $this->assertSame( 'Draft Page', $post->post_title ); - $this->assertSame( '', $post->post_name ); - $this->assertEquals( $admin->ID, $post->post_author ); - $this->assertSame( 'page', $post->post_type ); - $this->assertSame( 'draft', $post->post_status ); - $this->assertSame( 0, $post->post_parent ); - $this->assertSame( 'default', get_post_meta( $post->ID, '_wp_page_template', true ) ); - - $post = $posts[7]; - $this->assertSame( 'Parent Page', $post->post_title ); - $this->assertSame( 'parent-page', $post->post_name ); - $this->assertEquals( $admin->ID, $post->post_author ); - $this->assertSame( 'page', $post->post_type ); - $this->assertSame( 'publish', $post->post_status ); - $this->assertSame( 0, $post->post_parent ); - $this->assertSame( 'default', get_post_meta( $post->ID, '_wp_page_template', true ) ); - - $post = $posts[8]; - $this->assertSame( 'Child Page', $post->post_title ); - $this->assertSame( 'child-page', $post->post_name ); - $this->assertEquals( $admin->ID, $post->post_author ); - $this->assertSame( 'page', $post->post_type ); - $this->assertSame( 'publish', $post->post_status ); - $this->assertSame( $posts[7]->ID, $post->post_parent ); - $this->assertSame( 'default', get_post_meta( $post->ID, '_wp_page_template', true ) ); - - $post = $posts[9]; - $this->assertSame( 'Sample Page', $post->post_title ); - $this->assertSame( 'sample-page', $post->post_name ); - $this->assertEquals( $admin->ID, $post->post_author ); - $this->assertSame( 'page', $post->post_type ); - $this->assertSame( 'publish', $post->post_status ); - $this->assertSame( 0, $post->post_parent ); - $this->assertSame( 'default', get_post_meta( $post->ID, '_wp_page_template', true ) ); - - $post = $posts[10]; - $this->assertSame( 'Hello world!', $post->post_title ); - $this->assertSame( 'hello-world', $post->post_name ); - $this->assertEquals( $author->ID, $post->post_author ); - $this->assertSame( 'post', $post->post_type ); - $this->assertSame( 'publish', $post->post_status ); - $this->assertSame( 0, $post->post_parent ); - $cats = wp_get_post_categories( $post->ID ); - $this->assertCount( 1, $cats ); - } - - /** - * @covers WP_Import::import - */ - public function test_double_import() { - $authors = array( - 'admin' => false, - 'editor' => false, - 'author' => false, - ); - $this->_import_wp( DIR_TESTDATA . '/export/small-export.xml', $authors ); - $this->_import_wp( DIR_TESTDATA . '/export/small-export.xml', $authors ); - - $user_count = count_users(); - $this->assertSame( 3, $user_count['total_users'] ); - $admin = get_user_by( 'login', 'admin' ); - $this->assertSame( 'admin', $admin->user_login ); - $this->assertSame( 'local@host.null', $admin->user_email ); - $editor = get_user_by( 'login', 'editor' ); - $this->assertSame( 'editor', $editor->user_login ); - $this->assertSame( 'editor@example.org', $editor->user_email ); - $this->assertSame( 'FirstName', $editor->user_firstname ); - $this->assertSame( 'LastName', $editor->user_lastname ); - $author = get_user_by( 'login', 'author' ); - $this->assertSame( 'author', $author->user_login ); - $this->assertSame( 'author@example.org', $author->user_email ); - - $this->assertSame( '30', wp_count_terms( array( 'taxonomy' => 'category' ) ) ); - $this->assertSame( '3', wp_count_terms( array( 'taxonomy' => 'post_tag' ) ) ); - $foo = get_term_by( 'slug', 'foo', 'category' ); - $this->assertSame( 0, $foo->parent ); - $bar = get_term_by( 'slug', 'bar', 'category' ); - $foo_bar = get_term_by( 'slug', 'foo-bar', 'category' ); - $this->assertSame( $bar->term_id, $foo_bar->parent ); - - $post_count = wp_count_posts( 'post' ); - $this->assertSame( '5', $post_count->publish ); - $this->assertSame( '1', $post_count->private ); - $page_count = wp_count_posts( 'page' ); - $this->assertSame( '4', $page_count->publish ); - $this->assertSame( '1', $page_count->draft ); - $comment_count = wp_count_comments(); - $this->assertSame( 1, $comment_count->total_comments ); - } - +class Tests_Import_Import extends WP_UnitTestCase { /** * @covers ::get_importers */ @@ -269,30 +29,4 @@ public function test_ordering_of_importers() { ); $wp_importers = $_wp_importers; // Restore global state. } - - /** - * @ticket 21007 - * - * @covers WP_Import::import - */ - public function test_slashes_should_not_be_stripped() { - global $wpdb; - - $authors = array( 'admin' => false ); - $this->_import_wp( DIR_TESTDATA . '/export/slashes.xml', $authors ); - - $alpha = get_term_by( 'slug', 'alpha', 'category' ); - $this->assertSame( 'a \"great\" category', $alpha->name ); - - $tag1 = get_term_by( 'slug', 'tag1', 'post_tag' ); - $this->assertSame( "foo\'bar", $tag1->name ); - - $posts = get_posts( - array( - 'post_type' => 'any', - 'post_status' => 'any', - ) - ); - $this->assertSame( 'Slashes aren\\\'t \"cool\"', $posts[0]->post_content ); - } } diff --git a/tests/phpunit/tests/import/parser.php b/tests/phpunit/tests/import/parser.php deleted file mode 100644 index 41bc1d917fd0e..0000000000000 --- a/tests/phpunit/tests/import/parser.php +++ /dev/null @@ -1,341 +0,0 @@ -<?php - -require_once __DIR__ . '/base.php'; - -/** - * @group import - */ -class Tests_Import_Parser extends WP_Import_UnitTestCase { - public function set_up() { - parent::set_up(); - - if ( ! defined( 'WP_IMPORTING' ) ) { - define( 'WP_IMPORTING', true ); - } - - if ( ! defined( 'WP_LOAD_IMPORTERS' ) ) { - define( 'WP_LOAD_IMPORTERS', true ); - } - - $this->require_importer(); - } - - /** - * @covers WXR_Parser_SimpleXML::parse - * @covers WXR_Parser_XML::parse - */ - public function test_malformed_wxr() { - if ( PHP_VERSION_ID >= 80400 ) { - $this->markTestSkipped( 'The Importer plugin is not ready for PHP 8.4 yet. This skip should be removed once it is.' ); - } - - $file = DIR_TESTDATA . '/export/malformed.xml'; - - // Regex based parser cannot detect malformed XML. - foreach ( array( 'WXR_Parser_SimpleXML', 'WXR_Parser_XML' ) as $p ) { - $parser = new $p(); - $result = $parser->parse( $file ); - $this->assertWPError( $result ); - $this->assertSame( 'There was an error when reading this WXR file', $result->get_error_message() ); - } - } - - /** - * @covers WXR_Parser_SimpleXML::parse - * @covers WXR_Parser_XML::parse - * @covers WXR_Parser_Regex::parse - */ - public function test_invalid_wxr() { - if ( PHP_VERSION_ID >= 80400 ) { - $this->markTestSkipped( 'The Importer plugin is not ready for PHP 8.4 yet. This skip should be removed once it is.' ); - } - - $f1 = DIR_TESTDATA . '/export/missing-version-tag.xml'; - $f2 = DIR_TESTDATA . '/export/invalid-version-tag.xml'; - - foreach ( array( 'WXR_Parser_SimpleXML', 'WXR_Parser_XML', 'WXR_Parser_Regex' ) as $p ) { - foreach ( array( $f1, $f2 ) as $file ) { - $parser = new $p(); - $result = $parser->parse( $file ); - $this->assertWPError( $result ); - $this->assertSame( 'This does not appear to be a WXR file, missing/invalid WXR version number', $result->get_error_message() ); - } - } - } - - /** - * @covers WXR_Parser_SimpleXML::parse - * @covers WXR_Parser_XML::parse - * @covers WXR_Parser_Regex::parse - */ - public function test_wxr_version_1_1() { - if ( PHP_VERSION_ID >= 80400 ) { - $this->markTestSkipped( 'The Importer plugin is not ready for PHP 8.4 yet. This skip should be removed once it is.' ); - } - - $file = DIR_TESTDATA . '/export/valid-wxr-1.1.xml'; - - foreach ( array( 'WXR_Parser_SimpleXML', 'WXR_Parser_XML', 'WXR_Parser_Regex' ) as $p ) { - $message = $p . ' failed'; - $parser = new $p(); - $result = $parser->parse( $file ); - - $this->assertIsArray( $result, $message ); - $this->assertSame( 'http://localhost/', $result['base_url'], $message ); - $this->assertEqualSetsWithIndex( - array( - 'author_id' => 2, - 'author_login' => 'john', - 'author_email' => 'johndoe@example.org', - 'author_display_name' => 'John Doe', - 'author_first_name' => 'John', - 'author_last_name' => 'Doe', - ), - $result['authors']['john'], - $message - ); - $this->assertEqualSetsWithIndex( - array( - 'term_id' => 3, - 'category_nicename' => 'alpha', - 'category_parent' => '', - 'cat_name' => 'alpha', - 'category_description' => 'The alpha category', - ), - $result['categories'][0], - $message - ); - $this->assertEqualSetsWithIndex( - array( - 'term_id' => 22, - 'tag_slug' => 'clippable', - 'tag_name' => 'Clippable', - 'tag_description' => 'The Clippable post_tag', - ), - $result['tags'][0], - $message - ); - $this->assertEqualSetsWithIndex( - array( - 'term_id' => 40, - 'term_taxonomy' => 'post_tax', - 'slug' => 'bieup', - 'term_parent' => '', - 'term_name' => 'bieup', - 'term_description' => 'The bieup post_tax', - ), - $result['terms'][0], - $message - ); - - $this->assertCount( 2, $result['posts'], $message ); - $this->assertCount( 19, $result['posts'][0], $message ); - $this->assertCount( 18, $result['posts'][1], $message ); - $this->assertEqualSetsWithIndex( - array( - array( - 'name' => 'alpha', - 'slug' => 'alpha', - 'domain' => 'category', - ), - array( - 'name' => 'Clippable', - 'slug' => 'clippable', - 'domain' => 'post_tag', - ), - array( - 'name' => 'bieup', - 'slug' => 'bieup', - 'domain' => 'post_tax', - ), - ), - $result['posts'][0]['terms'], - $message - ); - $this->assertSame( - array( - array( - 'key' => '_wp_page_template', - 'value' => 'default', - ), - ), - $result['posts'][1]['postmeta'], - $message - ); - } - } - - /** - * @covers WXR_Parser_SimpleXML::parse - * @covers WXR_Parser_XML::parse - * @covers WXR_Parser_Regex::parse - */ - public function test_wxr_version_1_0() { - if ( PHP_VERSION_ID >= 80400 ) { - $this->markTestSkipped( 'The Importer plugin is not ready for PHP 8.4 yet. This skip should be removed once it is.' ); - } - - $file = DIR_TESTDATA . '/export/valid-wxr-1.0.xml'; - - foreach ( array( 'WXR_Parser_SimpleXML', 'WXR_Parser_XML', 'WXR_Parser_Regex' ) as $p ) { - $message = $p . ' failed'; - $parser = new $p(); - $result = $parser->parse( $file ); - - $this->assertIsArray( $result, $message ); - $this->assertSame( 'http://localhost/', $result['base_url'], $message ); - $this->assertSame( $result['categories'][0]['category_nicename'], 'alpha', $message ); - $this->assertSame( $result['categories'][0]['cat_name'], 'alpha', $message ); - $this->assertSame( $result['categories'][0]['category_parent'], '', $message ); - $this->assertSame( $result['categories'][0]['category_description'], 'The alpha category', $message ); - $this->assertSame( $result['tags'][0]['tag_slug'], 'chicken', $message ); - $this->assertSame( $result['tags'][0]['tag_name'], 'chicken', $message ); - - $this->assertCount( 6, $result['posts'], $message ); - $this->assertCount( 19, $result['posts'][0], $message ); - $this->assertCount( 18, $result['posts'][1], $message ); - - $this->assertEquals( - array( - array( - 'name' => 'Uncategorized', - 'slug' => 'uncategorized', - 'domain' => 'category', - ), - ), - $result['posts'][0]['terms'], - $message - ); - $this->assertEquals( - array( - array( - 'name' => 'alpha', - 'slug' => 'alpha', - 'domain' => 'category', - ), - array( - 'name' => 'news', - 'slug' => 'news', - 'domain' => 'tag', - ), - array( - 'name' => 'roar', - 'slug' => 'roar', - 'domain' => 'tag', - ), - ), - $result['posts'][2]['terms'], - $message - ); - $this->assertEquals( - array( - array( - 'name' => 'chicken', - 'slug' => 'chicken', - 'domain' => 'tag', - ), - array( - 'name' => 'child', - 'slug' => 'child', - 'domain' => 'category', - ), - array( - 'name' => 'face', - 'slug' => 'face', - 'domain' => 'tag', - ), - ), - $result['posts'][3]['terms'], - $message - ); - - $this->assertSame( - array( - array( - 'key' => '_wp_page_template', - 'value' => 'default', - ), - ), - $result['posts'][1]['postmeta'], - $message - ); - } - } - - /** - * Test the WXR parser's ability to correctly retrieve content from CDATA - * sections that contain escaped closing tags ("]]>" -> "]]]]><![CDATA[>"). - * - * @link https://core.trac.wordpress.org/ticket/15203 - * - * @covers WXR_Parser_SimpleXML::parse - * @covers WXR_Parser_XML::parse - * @covers WXR_Parser_Regex::parse - */ - public function test_escaped_cdata_closing_sequence() { - if ( PHP_VERSION_ID >= 80400 ) { - $this->markTestSkipped( 'The Importer plugin is not ready for PHP 8.4 yet. This skip should be removed once it is.' ); - } - - $file = DIR_TESTDATA . '/export/crazy-cdata-escaped.xml'; - - foreach ( array( 'WXR_Parser_SimpleXML', 'WXR_Parser_XML', 'WXR_Parser_Regex' ) as $p ) { - $message = 'Parser ' . $p; - $parser = new $p(); - $result = $parser->parse( $file ); - - $post = $result['posts'][0]; - $this->assertSame( 'Content with nested <![CDATA[ tags ]]> :)', $post['post_content'], $message ); - foreach ( $post['postmeta'] as $meta ) { - switch ( $meta['key'] ) { - case 'Plain string': - $value = 'Foo'; - break; - case 'Closing CDATA': - $value = ']]>'; - break; - case 'Alot of CDATA': - $value = 'This has <![CDATA[ opening and ]]> closing <![CDATA[ tags like this: ]]>'; - break; - default: - $this->fail( sprintf( 'Unknown postmeta (%1$s) was parsed out by %2$s.', $meta['key'], $p ) ); - } - $this->assertSame( $value, $meta['value'], $message ); - } - } - } - - /** - * Ensure that the regex parser can still parse invalid CDATA blocks (i.e. those - * with "]]>" unescaped within a CDATA section). - * - * @covers WXR_Parser_Regex::parse - */ - public function test_unescaped_cdata_closing_sequence() { - $file = DIR_TESTDATA . '/export/crazy-cdata.xml'; - - $parser = new WXR_Parser_Regex(); - $result = $parser->parse( $file ); - - $post = $result['posts'][0]; - $this->assertSame( 'Content with nested <![CDATA[ tags ]]> :)', $post['post_content'] ); - foreach ( $post['postmeta'] as $meta ) { - switch ( $meta['key'] ) { - case 'Plain string': - $value = 'Foo'; - break; - case 'Closing CDATA': - $value = ']]>'; - break; - case 'Alot of CDATA': - $value = 'This has <![CDATA[ opening and ]]> closing <![CDATA[ tags like this: ]]>'; - break; - default: - $this->fail( sprintf( 'Unknown postmeta (%1$s) was parsed out by %2$s.', $meta['key'], $p ) ); - } - $this->assertSame( $value, $meta['value'] ); - } - } - - // Tags in CDATA #11574. -} diff --git a/tests/phpunit/tests/import/postmeta.php b/tests/phpunit/tests/import/postmeta.php deleted file mode 100644 index b84ec925b03d9..0000000000000 --- a/tests/phpunit/tests/import/postmeta.php +++ /dev/null @@ -1,100 +0,0 @@ -<?php - -require_once __DIR__ . '/base.php'; - -/** - * @group import - * - * @covers WP_Import::import - */ -class Tests_Import_Postmeta extends WP_Import_UnitTestCase { - public function set_up() { - parent::set_up(); - - if ( ! defined( 'WP_IMPORTING' ) ) { - define( 'WP_IMPORTING', true ); - } - - if ( ! defined( 'WP_LOAD_IMPORTERS' ) ) { - define( 'WP_LOAD_IMPORTERS', true ); - } - - $this->require_importer(); - } - - public function test_serialized_postmeta_no_cdata() { - $this->_import_wp( DIR_TESTDATA . '/export/test-serialized-postmeta-no-cdata.xml', array( 'johncoswell' => 'john' ) ); - $expected['special_post_title'] = 'A special title'; - $expected['is_calendar'] = ''; - $this->assertSame( $expected, get_post_meta( 122, 'post-options', true ) ); - } - - public function test_utw_postmeta() { - $this->_import_wp( DIR_TESTDATA . '/export/test-utw-post-meta-import.xml', array( 'johncoswell' => 'john' ) ); - - $classy = new StdClass(); - $classy->tag = 'album'; - $expected[] = $classy; - $classy = new StdClass(); - $classy->tag = 'apple'; - $expected[] = $classy; - $classy = new StdClass(); - $classy->tag = 'art'; - $expected[] = $classy; - $classy = new StdClass(); - $classy->tag = 'artwork'; - $expected[] = $classy; - $classy = new StdClass(); - $classy->tag = 'dead-tracks'; - $expected[] = $classy; - $classy = new StdClass(); - $classy->tag = 'ipod'; - $expected[] = $classy; - $classy = new StdClass(); - $classy->tag = 'itunes'; - $expected[] = $classy; - $classy = new StdClass(); - $classy->tag = 'javascript'; - $expected[] = $classy; - $classy = new StdClass(); - $classy->tag = 'lyrics'; - $expected[] = $classy; - $classy = new StdClass(); - $classy->tag = 'script'; - $expected[] = $classy; - $classy = new StdClass(); - $classy->tag = 'tracks'; - $expected[] = $classy; - $classy = new StdClass(); - $classy->tag = 'windows-scripting-host'; - $expected[] = $classy; - $classy = new StdClass(); - $classy->tag = 'wscript'; - $expected[] = $classy; - - $this->assertEqualSets( $expected, get_post_meta( 150, 'test', true ) ); - } - - /** - * @ticket 9633 - */ - public function test_serialized_postmeta_with_cdata() { - $this->_import_wp( DIR_TESTDATA . '/export/test-serialized-postmeta-with-cdata.xml', array( 'johncoswell' => 'johncoswell' ) ); - - // HTML in the CDATA should work with old WordPress version. - $this->assertSame( '<pre>some html</pre>', get_post_meta( 10, 'contains-html', true ) ); - // Serialised will only work with 3.0 onwards. - $expected['special_post_title'] = 'A special title'; - $expected['is_calendar'] = ''; - $this->assertSame( $expected, get_post_meta( 10, 'post-options', true ) ); - } - - /** - * @ticket 11574 - */ - public function test_serialized_postmeta_with_evil_stuff_in_cdata() { - $this->_import_wp( DIR_TESTDATA . '/export/test-serialized-postmeta-with-cdata.xml', array( 'johncoswell' => 'johncoswell' ) ); - // Evil content in the CDATA. - $this->assertSame( '<wp:meta_value>evil</wp:meta_value>', get_post_meta( 10, 'evil', true ) ); - } -} diff --git a/tools/local-env/scripts/install.js b/tools/local-env/scripts/install.js index f8e6285fb9a33..f205047a5a69b 100644 --- a/tools/local-env/scripts/install.js +++ b/tools/local-env/scripts/install.js @@ -26,8 +26,6 @@ wp_cli( `config set WP_DEVELOPMENT_MODE ${process.env.LOCAL_WP_DEVELOPMENT_MODE} // Move wp-config.php to the base directory, so it doesn't get mixed up in the src or build directories. renameSync( `${process.env.LOCAL_DIR}/wp-config.php`, 'wp-config.php' ); -install_wp_importer(); - // Read in wp-tests-config-sample.php, edit it to work with our config, then write it to wp-tests-config.php. const testConfig = readFileSync( 'wp-tests-config-sample.php', 'utf8' ) .replace( 'youremptytestdbnamehere', 'wordpress_develop_tests' ) @@ -57,14 +55,3 @@ function wp_cli( cmd ) { execSync( `docker compose ${composeFiles} run --quiet-pull --rm cli ${cmd} --path=/var/www/${process.env.LOCAL_DIR}`, { stdio: 'inherit' } ); } - -/** - * Downloads the WordPress Importer plugin for use in tests. - */ -function install_wp_importer() { - const testPluginDirectory = 'tests/phpunit/data/plugins/wordpress-importer'; - const composeFiles = local_env_utils.get_compose_files(); - - execSync( `docker compose ${composeFiles} exec -T php rm -rf ${testPluginDirectory}`, { stdio: 'inherit' } ); - execSync( `docker compose ${composeFiles} exec -T php git clone https://github.com/WordPress/wordpress-importer.git ${testPluginDirectory} --depth=1`, { stdio: 'inherit' } ); -} From 2c27e7e4b2413c07d5e4611e60dea5957c73b18a Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Thu, 6 Feb 2025 18:27:19 +0000 Subject: [PATCH 289/323] External Libraries: Remove stray Unicode character in moxie.js This fixes a `ReferenceError` caused by a stray Unicode character in the unminified version of moxie.js. This has long been fixed upstream but the library cannot be wholesale updated in WordPress because of an incompatible license change. Because of this, a new version is being tagged, `1.3.5.1`, and the file header has been updated to make it more clear that the file is a maintained fork with a high level list of changes made. Props kinggmobb, jorbin, q0rban, azaozz, desrosj, sukhendu2002. Fixes #59329. git-svn-id: https://develop.svn.wordpress.org/trunk@59770 602fd350-edb4-49c9-b593-d223f7449a82 --- src/js/_enqueues/vendor/plupload/moxie.js | 11 +++++++---- src/wp-includes/script-loader.php | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/js/_enqueues/vendor/plupload/moxie.js b/src/js/_enqueues/vendor/plupload/moxie.js index c7d26f4c4e866..dbf635f41cf17 100644 --- a/src/js/_enqueues/vendor/plupload/moxie.js +++ b/src/js/_enqueues/vendor/plupload/moxie.js @@ -1,7 +1,7 @@ ;var MXI_DEBUG = false; /** * mOxie - multi-runtime File API & XMLHttpRequest L2 Polyfill - * v1.3.5 + * v1.3.5.1 * * Copyright 2013, Moxiecode Systems AB * Released under GPL License. @@ -16,8 +16,12 @@ */ /** - * Modified for WordPress, Silverlight and Flash runtimes support was removed. - * See https://core.trac.wordpress.org/ticket/41755. + * Modified for WordPress. + * - Silverlight and Flash runtimes support was removed. See https://core.trac.wordpress.org/ticket/41755. + * - A stray Unicode character has been removed. See https://core.trac.wordpress.org/ticket/59329. + * + * This is a de-facto fork of the mOxie library that will be maintained by WordPress due to upstream license changes + * that are incompatible with the GPL. */ /*jshint smarttabs:true, undef:true, latedef:true, curly:true, bitwise:true, camelcase:true */ @@ -7388,7 +7392,6 @@ define("moxie/runtime/html5/utils/BinaryReader", [ UTF16StringReader.apply(this, arguments); } } -   Basic.extend(BinaryReader.prototype, { diff --git a/src/wp-includes/script-loader.php b/src/wp-includes/script-loader.php index 19813615bd80e..15ee7c6d2501c 100644 --- a/src/wp-includes/script-loader.php +++ b/src/wp-includes/script-loader.php @@ -1011,7 +1011,7 @@ function wp_default_scripts( $scripts ) { 'file_url_copied' => __( 'The file URL has been copied to your clipboard' ), ); - $scripts->add( 'moxiejs', "/wp-includes/js/plupload/moxie$suffix.js", array(), '1.3.5' ); + $scripts->add( 'moxiejs', "/wp-includes/js/plupload/moxie$suffix.js", array(), '1.3.5.1' ); $scripts->add( 'plupload', "/wp-includes/js/plupload/plupload$suffix.js", array( 'moxiejs' ), '2.1.9' ); // Back compat handles: foreach ( array( 'all', 'html5', 'flash', 'silverlight', 'html4' ) as $handle ) { From 4b05a83848d70c65526a278cb8627c0996324f61 Mon Sep 17 00:00:00 2001 From: Peter Wilson <peterwilsoncc@git.wordpress.org> Date: Thu, 6 Feb 2025 20:56:44 +0000 Subject: [PATCH 290/323] Query: Add since annotation to WP_Query::$query_cache_key. Follow up to [59766]. Props mukesh27. See #59516. git-svn-id: https://develop.svn.wordpress.org/trunk@59771 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-query.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/wp-includes/class-wp-query.php b/src/wp-includes/class-wp-query.php index f088bda6da6d0..51cd8b1084e2e 100644 --- a/src/wp-includes/class-wp-query.php +++ b/src/wp-includes/class-wp-query.php @@ -480,6 +480,7 @@ class WP_Query { * The cache key is generated by the method ::generate_cache_key() after the * query has been normalized. * + * @since 6.8.0 * @var string */ private $query_cache_key = ''; From b5b4e3ada690e86ada210760f0300471d8d48a4e Mon Sep 17 00:00:00 2001 From: Joe Dolson <joedolson@git.wordpress.org> Date: Thu, 6 Feb 2025 22:24:51 +0000 Subject: [PATCH 291/323] General: Add styles for extender usage of `do_accordion_section()`. Follow up to [59224]. Add CSS to cover usage of the `do_accordion_section()` function when used in extender contexts outside of the existing WordPress core usage. Props mboynes, jorbin, joemcgill, joedolson. Fixes #62907. git-svn-id: https://develop.svn.wordpress.org/trunk@59772 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/css/common.css | 20 ++++++++++++++++++-- src/wp-admin/css/customize-controls.css | 3 ++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/wp-admin/css/common.css b/src/wp-admin/css/common.css index 16f3ae88626c0..d2e2ed8b2af8d 100644 --- a/src/wp-admin/css/common.css +++ b/src/wp-admin/css/common.css @@ -2433,6 +2433,12 @@ h1.nav-tab-wrapper, /* Back-compat for pre-4.4 */ .nav-menus-php .metabox-holder h3 { padding: 0; } + +.accordion-container h3.accordion-section-title { + padding: 0 !important; +} + +.accordion-section-title button.accordion-trigger, .nav-menus-php .metabox-holder .accordion-section-title button.accordion-trigger { background: inherit; color: #1d2327; @@ -2446,27 +2452,38 @@ h1.nav-tab-wrapper, /* Back-compat for pre-4.4 */ line-height: 1.5; cursor: pointer; } + +.accordion-section-title button.accordion-trigger:focus, .nav-menus-php .metabox-holder .accordion-section-title button.accordion-trigger:focus { box-shadow: 0 0 0 2px #2271b1; outline: 2px solid transparent; } + +.accordion-section-title span.dashicons.dashicons-arrow-down, .nav-menus-php .metabox-holder .accordion-section-title span.dashicons.dashicons-arrow-down { position: absolute; right: 10px; left: auto; color: #787c82; border-radius: 50px; + top: 50%; + transform: translateY(-50%); } + +.accordion-section-title:hover span.dashicons.dashicons-arrow-down, .nav-menus-php .metabox-holder .accordion-section-title:hover span.dashicons.dashicons-arrow-down { color: #1d2327; } + +.accordion-section-title span.dashicons.dashicons-arrow-down::before, .nav-menus-php .metabox-holder .accordion-section-title span.dashicons.dashicons-arrow-down::before { position: relative; left: -1px; } +.accordion-section.open .accordion-section-title span.dashicons.dashicons-arrow-down, .nav-menus-php .metabox-holder .accordion-section.open .accordion-section-title span.dashicons.dashicons-arrow-down { - transform: rotate(180deg); + transform: rotate(180deg) translate(0, 50%); } #templateside ul li a { @@ -3648,7 +3665,6 @@ img { .accordion-section-title { margin: 0; - padding: 12px 15px 15px; position: relative; border-left: 1px solid #dcdcde; border-right: 1px solid #dcdcde; diff --git a/src/wp-admin/css/customize-controls.css b/src/wp-admin/css/customize-controls.css index 1805790eb2d3e..7e4eb5229389b 100644 --- a/src/wp-admin/css/customize-controls.css +++ b/src/wp-admin/css/customize-controls.css @@ -431,6 +431,7 @@ body.trashing #publish-settings { border-right: none; border-bottom: none; cursor: default; + padding: 10px 10px 11px 14px; } #customize-controls .customize-info.open .accordion-section-title:after, @@ -1727,7 +1728,7 @@ p.customize-section-description { border-left: none; border-right: none; margin: 0 0 15px; - padding-right: 100px; /* Space for the button */ + padding: 12px 100px 15px 15px; /* Space for the button */ } #customize-theme-controls .control-section-themes .customize-themes-panel .accordion-section-title:first-child:hover, /* Not a focusable element. */ From bc346ec1f6d53f61aad8d933369fc150c572c3bd Mon Sep 17 00:00:00 2001 From: Joe McGill <joemcgill@git.wordpress.org> Date: Fri, 7 Feb 2025 14:34:58 +0000 Subject: [PATCH 292/323] Post Thumbnails: Fix squashed featured image in wp-admin. This updates the CSS for featured images in the classic editor that caused images to look skewed when auto-sizes are enabled. Props maciejmackowiak, sainathpoojary, mukesh27, joemcgill. Fixes #62597. git-svn-id: https://develop.svn.wordpress.org/trunk@59773 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/css/edit.css | 1 - 1 file changed, 1 deletion(-) diff --git a/src/wp-admin/css/edit.css b/src/wp-admin/css/edit.css index 952ca2aff55fb..a6efcf02ad35c 100644 --- a/src/wp-admin/css/edit.css +++ b/src/wp-admin/css/edit.css @@ -308,7 +308,6 @@ ul.wp-tab-bar li { #postimagediv .inside img { max-width: 100%; height: auto; - width: auto; vertical-align: top; background-image: linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7), linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7); background-position: 0 0, 10px 10px; From e61eff602fb032bc7e3de1f8df3024c346b24393 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Fri, 7 Feb 2025 15:06:13 +0000 Subject: [PATCH 293/323] Coding Standards: Use strict comparison in `wp_get_archives()`. Follow-up to [24], [114]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59774 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/general-template.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/general-template.php b/src/wp-includes/general-template.php index f0fa490ca90c2..46d023acb3afd 100644 --- a/src/wp-includes/general-template.php +++ b/src/wp-includes/general-template.php @@ -2154,7 +2154,7 @@ function wp_get_archives( $args = '' ) { if ( $results ) { $after = $parsed_args['after']; foreach ( (array) $results as $result ) { - if ( $result->week != $arc_w_last ) { + if ( $result->week !== $arc_w_last ) { $arc_year = $result->yr; $arc_w_last = $result->week; $arc_week = get_weekstartend( $result->yyyymmdd, get_option( 'start_of_week' ) ); From 6db9d1c22aa034fc661359eaddc784cc09184c90 Mon Sep 17 00:00:00 2001 From: Joe McGill <joemcgill@git.wordpress.org> Date: Fri, 7 Feb 2025 15:44:07 +0000 Subject: [PATCH 294/323] Editor: Update packages for 6.8 pre-Betas. Syncs @wordpress/* packages to the 'latest' npm tag. Props mamaduka, joemcgill, youknowriad, swissspidy, sergiomdgomes, gziolo. See #62887. git-svn-id: https://develop.svn.wordpress.org/trunk@59775 602fd350-edb4-49c9-b593-d223f7449a82 --- Gruntfile.js | 1 + package-lock.json | 6862 +++++++++-------- package.json | 147 +- .../assets/script-loader-packages.min.php | 2 +- .../assets/script-modules-packages.min.php | 2 +- src/wp-includes/block-editor.php | 1 + src/wp-includes/blocks/archives/block.json | 6 + src/wp-includes/blocks/block.php | 20 + src/wp-includes/blocks/blocks-json.php | 314 +- src/wp-includes/blocks/button/block.json | 19 +- .../blocks/comments-pagination/block.json | 5 + src/wp-includes/blocks/comments/block.json | 12 + src/wp-includes/blocks/cover.php | 4 +- src/wp-includes/blocks/cover/block.json | 3 + src/wp-includes/blocks/details/block.json | 13 + src/wp-includes/blocks/file/block.json | 12 +- src/wp-includes/blocks/heading/block.json | 8 +- src/wp-includes/blocks/home-link.php | 3 - src/wp-includes/blocks/image.php | 24 +- src/wp-includes/blocks/image/block.json | 9 +- .../blocks/latest-posts/block.json | 12 + src/wp-includes/blocks/list-item/block.json | 2 +- src/wp-includes/blocks/navigation-link.php | 17 +- src/wp-includes/blocks/navigation-submenu.php | 43 +- src/wp-includes/blocks/navigation.php | 204 +- src/wp-includes/blocks/page-list/block.json | 25 + src/wp-includes/blocks/pattern.php | 7 - src/wp-includes/blocks/pattern/block.json | 2 +- src/wp-includes/blocks/post-author-name.php | 4 + .../blocks/post-author-name/block.json | 6 +- src/wp-includes/blocks/post-author.php | 4 + src/wp-includes/blocks/post-author/block.json | 6 +- .../blocks/post-comments-form/block.json | 7 +- src/wp-includes/blocks/post-content.php | 23 + .../blocks/post-content/block.json | 14 + src/wp-includes/blocks/post-date/block.json | 3 +- .../blocks/post-featured-image/block.json | 9 +- .../blocks/post-template/block.json | 17 +- src/wp-includes/blocks/post-terms.php | 13 +- src/wp-includes/blocks/post-title/block.json | 9 +- .../blocks/query-no-results/block.json | 4 +- .../blocks/query-pagination-previous.php | 35 +- src/wp-includes/blocks/query-title/block.json | 5 + src/wp-includes/blocks/query.php | 2 +- src/wp-includes/blocks/query/block.json | 3 +- .../blocks/require-dynamic-blocks.php | 1 + src/wp-includes/blocks/rss.php | 19 +- src/wp-includes/blocks/rss/block.json | 6 + src/wp-includes/blocks/search.php | 10 +- src/wp-includes/blocks/separator/block.json | 5 + src/wp-includes/blocks/site-logo/block.json | 6 +- src/wp-includes/blocks/site-title/block.json | 6 +- src/wp-includes/blocks/social-link.php | 4 +- src/wp-includes/blocks/social-link/block.json | 6 +- src/wp-includes/blocks/table/block.json | 5 +- .../includes/unregister-blocks-hooks.php | 1 + tests/phpunit/tests/blocks/editor.php | 3 +- tests/phpunit/tests/dependencies/scripts.php | 3 + tools/webpack/shared.js | 3 + 59 files changed, 4263 insertions(+), 3758 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 954d66599c94f..7d9a6e7d4c073 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1670,6 +1670,7 @@ module.exports = function(grunt) { grunt.registerTask( 'verify:source-maps', function() { const ignoredFiles = [ 'build/wp-includes/js/dist/components.js', + 'build/wp-includes/js/dist/data.js', ]; const files = buildFiles.reduce( ( acc, path ) => { // Skip excluded paths and any path that isn't a file. diff --git a/package-lock.json b/package-lock.json index d907a7883b1c7..d60ff5497138a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,73 +9,74 @@ "version": "6.8.0", "license": "GPL-2.0-or-later", "dependencies": { - "@wordpress/a11y": "4.8.2", - "@wordpress/annotations": "3.8.3", - "@wordpress/api-fetch": "7.8.2", - "@wordpress/autop": "4.8.1", - "@wordpress/blob": "4.8.1", - "@wordpress/block-directory": "5.8.18", - "@wordpress/block-editor": "14.3.15", - "@wordpress/block-library": "9.8.16", - "@wordpress/block-serialization-default-parser": "5.8.1", - "@wordpress/blocks": "13.8.5", - "@wordpress/commands": "1.8.11", - "@wordpress/components": "28.8.11", - "@wordpress/compose": "7.8.3", - "@wordpress/core-commands": "1.8.15", - "@wordpress/core-data": "7.8.15", - "@wordpress/customize-widgets": "5.8.16", - "@wordpress/data": "10.8.3", - "@wordpress/data-controls": "4.8.3", - "@wordpress/dataviews": "4.4.11", - "@wordpress/date": "5.8.2", - "@wordpress/deprecated": "4.8.2", - "@wordpress/dom": "4.8.2", - "@wordpress/dom-ready": "4.8.1", - "@wordpress/edit-post": "8.8.18", - "@wordpress/edit-site": "6.8.18", - "@wordpress/edit-widgets": "6.8.16", - "@wordpress/editor": "14.8.18", - "@wordpress/element": "6.8.1", - "@wordpress/escape-html": "3.8.1", - "@wordpress/fields": "0.0.16", - "@wordpress/format-library": "5.8.15", - "@wordpress/hooks": "4.8.2", - "@wordpress/html-entities": "4.8.1", - "@wordpress/i18n": "5.8.2", - "@wordpress/icons": "10.8.2", - "@wordpress/interactivity": "6.8.5", - "@wordpress/interactivity-router": "2.8.6", - "@wordpress/interface": "6.8.11", - "@wordpress/is-shallow-equal": "5.8.1", - "@wordpress/keyboard-shortcuts": "5.8.3", - "@wordpress/keycodes": "4.8.2", - "@wordpress/list-reusable-blocks": "5.8.11", - "@wordpress/media-utils": "5.8.2", - "@wordpress/notices": "5.8.3", - "@wordpress/nux": "9.8.11", - "@wordpress/patterns": "2.8.15", - "@wordpress/plugins": "7.8.11", - "@wordpress/preferences": "4.8.11", - "@wordpress/preferences-persistence": "2.8.2", - "@wordpress/primitives": "4.8.1", - "@wordpress/priority-queue": "3.8.1", - "@wordpress/private-apis": "1.8.1", - "@wordpress/redux-routine": "5.8.1", - "@wordpress/reusable-blocks": "5.8.15", - "@wordpress/rich-text": "7.8.3", - "@wordpress/router": "1.8.1", - "@wordpress/server-side-render": "5.8.11", - "@wordpress/shortcode": "4.8.1", - "@wordpress/style-engine": "2.8.1", - "@wordpress/sync": "1.8.1", - "@wordpress/token-list": "3.8.1", - "@wordpress/undo-manager": "1.8.1", - "@wordpress/url": "4.8.1", - "@wordpress/viewport": "6.8.3", - "@wordpress/warning": "3.8.1", - "@wordpress/widgets": "4.8.15", - "@wordpress/wordcount": "4.8.1", + "@wordpress/a11y": "4.17.0", + "@wordpress/annotations": "3.17.0", + "@wordpress/api-fetch": "7.17.0", + "@wordpress/autop": "4.17.0", + "@wordpress/blob": "4.17.0", + "@wordpress/block-directory": "5.17.1", + "@wordpress/block-editor": "14.12.0", + "@wordpress/block-library": "9.17.0", + "@wordpress/block-serialization-default-parser": "5.17.0", + "@wordpress/blocks": "14.6.0", + "@wordpress/commands": "1.17.0", + "@wordpress/components": "29.3.0", + "@wordpress/compose": "7.17.0", + "@wordpress/core-commands": "1.17.0", + "@wordpress/core-data": "7.17.0", + "@wordpress/customize-widgets": "5.17.0", + "@wordpress/data": "10.17.0", + "@wordpress/data-controls": "4.17.0", + "@wordpress/dataviews": "4.13.0", + "@wordpress/date": "5.17.0", + "@wordpress/deprecated": "4.17.0", + "@wordpress/dom": "4.17.0", + "@wordpress/dom-ready": "4.17.0", + "@wordpress/edit-post": "8.17.1", + "@wordpress/edit-site": "6.17.1", + "@wordpress/edit-widgets": "6.17.0", + "@wordpress/editor": "14.17.1", + "@wordpress/element": "6.17.0", + "@wordpress/escape-html": "3.17.0", + "@wordpress/fields": "0.9.0", + "@wordpress/format-library": "5.17.0", + "@wordpress/hooks": "4.17.0", + "@wordpress/html-entities": "4.17.0", + "@wordpress/i18n": "5.17.0", + "@wordpress/icons": "10.17.0", + "@wordpress/interactivity": "6.17.0", + "@wordpress/interactivity-router": "2.17.0", + "@wordpress/interface": "9.2.0", + "@wordpress/is-shallow-equal": "5.17.0", + "@wordpress/keyboard-shortcuts": "5.17.0", + "@wordpress/keycodes": "4.17.0", + "@wordpress/list-reusable-blocks": "5.17.0", + "@wordpress/media-utils": "5.17.0", + "@wordpress/notices": "5.17.0", + "@wordpress/nux": "9.17.0", + "@wordpress/patterns": "2.17.0", + "@wordpress/plugins": "7.17.0", + "@wordpress/preferences": "4.17.0", + "@wordpress/preferences-persistence": "2.17.0", + "@wordpress/primitives": "4.17.0", + "@wordpress/priority-queue": "3.17.0", + "@wordpress/private-apis": "1.17.0", + "@wordpress/redux-routine": "5.17.0", + "@wordpress/reusable-blocks": "5.17.0", + "@wordpress/rich-text": "7.17.0", + "@wordpress/router": "1.17.0", + "@wordpress/server-side-render": "5.17.0", + "@wordpress/shortcode": "4.17.0", + "@wordpress/style-engine": "2.17.0", + "@wordpress/sync": "1.17.0", + "@wordpress/token-list": "3.17.0", + "@wordpress/undo-manager": "1.17.0", + "@wordpress/upload-media": "0.2.0", + "@wordpress/url": "4.17.0", + "@wordpress/viewport": "6.17.0", + "@wordpress/warning": "3.17.0", + "@wordpress/widgets": "4.17.0", + "@wordpress/wordcount": "4.17.0", "backbone": "1.6.0", "clipboard": "2.0.11", "core-js-url-browser": "3.6.4", @@ -105,12 +106,12 @@ "@lodder/grunt-postcss": "^3.1.1", "@playwright/test": "1.49.1", "@pmmmwh/react-refresh-webpack-plugin": "0.5.15", - "@wordpress/babel-preset-default": "8.8.2", - "@wordpress/dependency-extraction-webpack-plugin": "6.8.3", - "@wordpress/e2e-test-utils": "11.8.2", - "@wordpress/e2e-test-utils-playwright": "1.8.1", - "@wordpress/prettier-config": "4.8.1", - "@wordpress/scripts": "30.0.6", + "@wordpress/babel-preset-default": "8.17.0", + "@wordpress/dependency-extraction-webpack-plugin": "6.17.0", + "@wordpress/e2e-test-utils": "11.17.0", + "@wordpress/e2e-test-utils-playwright": "1.17.0", + "@wordpress/prettier-config": "4.17.0", + "@wordpress/scripts": "30.10.0", "autoprefixer": "10.4.20", "chalk": "5.3.0", "check-node-version": "4.2.1", @@ -183,16 +184,16 @@ } }, "node_modules/@ariakit/core": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/@ariakit/core/-/core-0.4.10.tgz", - "integrity": "sha512-mX3EabQbfVh5uTjsTJ3+gjj7KGdTNhIN0qZHJd5Z2iPUnKl9NBy23Lgu6PEskpVsKAZ3proirjguD7U9fKMs/A==" + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/@ariakit/core/-/core-0.4.14.tgz", + "integrity": "sha512-hpzZvyYzGhP09S9jW1XGsU/FD5K3BKsH1eG/QJ8rfgEeUdPS7BvHPt5lHbOeJ2cMrRzBEvsEzLi1ivfDifHsVA==" }, "node_modules/@ariakit/react": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@ariakit/react/-/react-0.4.11.tgz", - "integrity": "sha512-nLpPrmNcspqNhk4o+epsgeZfP1+Fkh4uIzNe5yrFkXolRkqHGKAxl4Hi82e0yxIBUbYbZIEwsZQQVceF1L6xrw==", + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/@ariakit/react/-/react-0.4.15.tgz", + "integrity": "sha512-0V2LkNPFrGRT+SEIiObx/LQjR6v3rR+mKEDUu/3tq7jfCZ+7+6Q6EMR1rFaK+XMkaRY1RWUcj/rRDWAUWnsDww==", "dependencies": { - "@ariakit/react-core": "0.4.11" + "@ariakit/react-core": "0.4.15" }, "funding": { "type": "opencollective", @@ -204,11 +205,11 @@ } }, "node_modules/@ariakit/react-core": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@ariakit/react-core/-/react-core-0.4.11.tgz", - "integrity": "sha512-i6KedWhjZkNC7tMEKO0eNjjq2HRPiHyGaBS2x2VaWwzBepoYtjyvxRXyqLJ3gaiNdlwckN1TZsRDfD+viy13IQ==", + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/@ariakit/react-core/-/react-core-0.4.15.tgz", + "integrity": "sha512-Up8+U97nAPJdyUh9E8BCEhJYTA+eVztWpHoo1R9zZfHd4cnBWAg5RHxEmMH+MamlvuRxBQA71hFKY/735fDg+A==", "dependencies": { - "@ariakit/core": "0.4.10", + "@ariakit/core": "0.4.14", "@floating-ui/dom": "^1.0.0", "use-sync-external-store": "^1.2.0" }, @@ -218,12 +219,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", - "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", - "license": "MIT", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dependencies": { - "@babel/highlight": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -231,21 +232,19 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", - "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", - "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", + "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", "dev": true, - "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.25.7", @@ -253,10 +252,10 @@ "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-module-transforms": "^7.25.7", "@babel/helpers": "^7.25.7", - "@babel/parser": "^7.25.8", + "@babel/parser": "^7.25.7", "@babel/template": "^7.25.7", "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.8", + "@babel/types": "^7.25.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -288,9 +287,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.25.1.tgz", - "integrity": "sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.25.7.tgz", + "integrity": "sha512-B+BO9x86VYsQHimucBAL1fxTJKF4wyKY6ZVzee9QgzdZOUfs3BaR6AQrgoGrRI+7IFS1wUz/VyQ+SoBcSpdPbw==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -315,12 +314,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", - "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", - "license": "MIT", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", "dependencies": { - "@babel/types": "^7.25.7", + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -330,10 +329,9 @@ } }, "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "license": "MIT", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -344,39 +342,25 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "dev": true, - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", - "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.7", - "@babel/helper-validator-option": "^7.25.7", + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -410,19 +394,18 @@ "dev": true }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz", - "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -431,14 +414,24 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz", - "integrity": "sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", + "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1" + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -447,24 +440,7 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", @@ -473,88 +449,56 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", - "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dev": true, "dependencies": { - "@babel/types": "^7.21.0" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", - "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", - "license": "MIT", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", - "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-simple-access": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -564,36 +508,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -603,98 +546,69 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.26.5" }, "engines": { "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", - "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", - "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", - "license": "MIT", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", - "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", - "license": "MIT", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", - "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -714,42 +628,12 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", - "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", - "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", - "license": "MIT", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", + "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", "dependencies": { - "@babel/types": "^7.25.8" + "@babel/types": "^7.26.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -758,13 +642,14 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -773,249 +658,74 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, "engines": { "node": ">=6.9.0" }, @@ -1023,22 +733,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -1115,12 +809,27 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1154,12 +863,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1271,12 +980,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1285,13 +994,46 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", - "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1301,14 +1043,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1318,12 +1060,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1333,12 +1075,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1347,20 +1089,49 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", "globals": "^11.1.0" }, "engines": { @@ -1371,13 +1142,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", - "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1387,12 +1158,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", - "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1402,13 +1173,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1418,12 +1189,43 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1433,13 +1235,27 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1449,12 +1265,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", - "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1464,14 +1281,29 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1481,12 +1313,27 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1496,12 +1343,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1511,13 +1358,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1527,14 +1374,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz", - "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1544,15 +1390,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1562,13 +1408,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1578,13 +1424,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1594,12 +1440,59 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1609,13 +1502,44 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1625,12 +1549,45 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", - "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1640,12 +1597,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1685,16 +1642,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", - "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.7.tgz", + "integrity": "sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/types": "^7.22.15" + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-jsx": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1735,13 +1692,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" + "@babel/helper-plugin-utils": "^7.25.9", + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -1751,12 +1708,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1766,17 +1723,17 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.0.tgz", - "integrity": "sha512-ReY6pxwSzEU0b3r2/T/VhqMKg/AkceBT19X0UptA3/tYi5Pe2eXgEUH+NNMC5nok6c6XQz5tyVTUpuezRfSMSg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.7.tgz", + "integrity": "sha512-Y9p487tyTzB0yDYQOtWnC+9HGOuogtP3/wNpun1xJXEEvI6vip59BSBTsHnekZLqxmPcgsrAKt46HAAb//xGhg==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1795,12 +1752,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1810,13 +1767,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1826,12 +1783,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1841,12 +1798,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1856,12 +1813,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", + "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1871,14 +1828,16 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.0.tgz", - "integrity": "sha512-xo///XTPp3mDzTtrqXoBlK9eiAYW3wv9JXglcn/u1bi60RW11dEUxIgA8cbnDhutS1zacjMRmAwxE0gMklLnZg==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.7.tgz", + "integrity": "sha512-5cJurntg+AT+cgelGP9Bt788DKiAw9gIMSMU2NJrLAilnj0m8WZWUNZPSLOmadYsujHutpgElO+50foX+ib/Wg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-typescript": "^7.20.0" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1888,12 +1847,28 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1903,13 +1878,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1918,39 +1893,46 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/preset-env": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", - "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.7.tgz", + "integrity": "sha512-Gibz4OUdyNqqLj+7OAvBZxOD7CklCtMA5/j0JgUEwOnaRULsPDXmic2iKxL2DX2vQduPR5wH2hjZas/Vr/Oc0g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-import-assertions": "^7.25.7", + "@babel/plugin-syntax-import-attributes": "^7.25.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -1960,45 +1942,62 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.7", + "@babel/plugin-transform-async-to-generator": "^7.25.7", + "@babel/plugin-transform-block-scoped-functions": "^7.25.7", + "@babel/plugin-transform-block-scoping": "^7.25.7", + "@babel/plugin-transform-class-properties": "^7.25.7", + "@babel/plugin-transform-class-static-block": "^7.25.7", + "@babel/plugin-transform-classes": "^7.25.7", + "@babel/plugin-transform-computed-properties": "^7.25.7", + "@babel/plugin-transform-destructuring": "^7.25.7", + "@babel/plugin-transform-dotall-regex": "^7.25.7", + "@babel/plugin-transform-duplicate-keys": "^7.25.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-dynamic-import": "^7.25.7", + "@babel/plugin-transform-exponentiation-operator": "^7.25.7", + "@babel/plugin-transform-export-namespace-from": "^7.25.7", + "@babel/plugin-transform-for-of": "^7.25.7", + "@babel/plugin-transform-function-name": "^7.25.7", + "@babel/plugin-transform-json-strings": "^7.25.7", + "@babel/plugin-transform-literals": "^7.25.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.7", + "@babel/plugin-transform-member-expression-literals": "^7.25.7", + "@babel/plugin-transform-modules-amd": "^7.25.7", + "@babel/plugin-transform-modules-commonjs": "^7.25.7", + "@babel/plugin-transform-modules-systemjs": "^7.25.7", + "@babel/plugin-transform-modules-umd": "^7.25.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-new-target": "^7.25.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.7", + "@babel/plugin-transform-numeric-separator": "^7.25.7", + "@babel/plugin-transform-object-rest-spread": "^7.25.7", + "@babel/plugin-transform-object-super": "^7.25.7", + "@babel/plugin-transform-optional-catch-binding": "^7.25.7", + "@babel/plugin-transform-optional-chaining": "^7.25.7", + "@babel/plugin-transform-parameters": "^7.25.7", + "@babel/plugin-transform-private-methods": "^7.25.7", + "@babel/plugin-transform-private-property-in-object": "^7.25.7", + "@babel/plugin-transform-property-literals": "^7.25.7", + "@babel/plugin-transform-regenerator": "^7.25.7", + "@babel/plugin-transform-reserved-words": "^7.25.7", + "@babel/plugin-transform-shorthand-properties": "^7.25.7", + "@babel/plugin-transform-spread": "^7.25.7", + "@babel/plugin-transform-sticky-regex": "^7.25.7", + "@babel/plugin-transform-template-literals": "^7.25.7", + "@babel/plugin-transform-typeof-symbol": "^7.25.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.7", + "@babel/plugin-transform-unicode-property-regex": "^7.25.7", + "@babel/plugin-transform-unicode-regex": "^7.25.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -2017,19 +2016,17 @@ } }, "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/preset-react": { @@ -2053,14 +2050,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.0.tgz", - "integrity": "sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz", + "integrity": "sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-transform-typescript": "^7.21.0" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-syntax-jsx": "^7.25.7", + "@babel/plugin-transform-modules-commonjs": "^7.25.7", + "@babel/plugin-transform-typescript": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -2069,16 +2068,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2087,30 +2080,28 @@ } }, "node_modules/@babel/template": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", - "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", - "license": "MIT", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", - "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", + "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2119,14 +2110,12 @@ } }, "node_modules/@babel/types": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", - "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", - "license": "MIT", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", + "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2151,9 +2140,9 @@ } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", "dev": true, "funding": [ { @@ -2169,13 +2158,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-tokenizer": "^3.0.3" } }, "node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", "dev": true, "funding": [ { @@ -2215,9 +2204,9 @@ } }, "node_modules/@csstools/selector-specificity": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz", - "integrity": "sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", "dev": true, "funding": [ { @@ -2233,7 +2222,7 @@ "node": ">=18" }, "peerDependencies": { - "postcss-selector-parser": "^6.1.0" + "postcss-selector-parser": "^7.0.0" } }, "node_modules/@discoveryjs/json-ext": { @@ -2564,10 +2553,9 @@ } }, "node_modules/@floating-ui/dom/node_modules/@floating-ui/utils": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", - "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==", - "license": "MIT" + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==" }, "node_modules/@floating-ui/react-dom": { "version": "2.0.8", @@ -2587,6 +2575,57 @@ "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==", "license": "MIT" }, + "node_modules/@formatjs/ecma402-abstract": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.2.tgz", + "integrity": "sha512-6sE5nyvDloULiyOMbOTJEEgWL32w+VHkZQs8S02Lnn8Y/O5aQhjOEXwWzvR7SsBE/exxlSpY2EsWZgqHbtLatg==", + "dev": true, + "dependencies": { + "@formatjs/fast-memoize": "2.2.6", + "@formatjs/intl-localematcher": "0.5.10", + "decimal.js": "10", + "tslib": "2" + } + }, + "node_modules/@formatjs/fast-memoize": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.6.tgz", + "integrity": "sha512-luIXeE2LJbQnnzotY1f2U2m7xuQNj2DA8Vq4ce1BY9ebRZaoPB1+8eZ6nXpLzsxuW5spQxr7LdCg+CApZwkqkw==", + "dev": true, + "dependencies": { + "tslib": "2" + } + }, + "node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.11.0.tgz", + "integrity": "sha512-Hp81uTjjdTk3FLh/dggU5NK7EIsVWc5/ZDWrIldmf2rBuPejuZ13CZ/wpVE2SToyi4EiroPTQ1XJcJuZFIxTtw==", + "dev": true, + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.2", + "@formatjs/icu-skeleton-parser": "1.8.12", + "tslib": "2" + } + }, + "node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.12.tgz", + "integrity": "sha512-QRAY2jC1BomFQHYDMcZtClqHR55EEnB96V7Xbk/UiBodsuFc5kujybzt87+qj1KqmJozFhk6n4KiT1HKwAkcfg==", + "dev": true, + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.2", + "tslib": "2" + } + }, + "node_modules/@formatjs/intl-localematcher": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.10.tgz", + "integrity": "sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==", + "dev": true, + "dependencies": { + "tslib": "2" + } + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -3629,6 +3668,39 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@keyv/serialize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.2.tgz", + "integrity": "sha512-+E/LyaAeuABniD/RvUezWVXKpeuvwLEA9//nE9952zBaOdBd2mQ3pPoM8cUe2X6IcMByfuSLzmYqnYshG60+HQ==", + "dev": true, + "dependencies": { + "buffer": "^6.0.3" + } + }, + "node_modules/@keyv/serialize/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", @@ -4098,6 +4170,15 @@ "node": ">=8.0" } }, + "node_modules/@paulirish/trace_engine": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@paulirish/trace_engine/-/trace_engine-0.0.39.tgz", + "integrity": "sha512-2Y/ejHX5DDi5bjfWY/0c/BLVSfQ61Jw1Hy60Hnh0hfEO632D3FVctkzT4Q/lVAdvIPR0bUaok9JDTr1pu/OziA==", + "dev": true, + "dependencies": { + "third-party-web": "latest" + } + }, "node_modules/@pkgr/core": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", @@ -4210,9 +4291,9 @@ "dev": true }, "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", @@ -4221,7 +4302,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -4245,9 +4326,9 @@ "dev": true }, "node_modules/@preact/signals": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@preact/signals/-/signals-1.3.0.tgz", - "integrity": "sha512-EOMeg42SlLS72dhoq6Vjq08havnLseWmPQ8A0YsgIAqMgWgx7V1a39+Pxo6i7SY5NwJtH4849JogFq3M67AzWg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@preact/signals/-/signals-1.3.2.tgz", + "integrity": "sha512-naxcJgUJ6BTOROJ7C3QML7KvwKwCXQJYTc5L/b0eEsdYgPB6SxwoQ1vDGcS0Q7GVjAenVq/tXrybVdFShHYZWg==", "dependencies": { "@preact/signals-core": "^1.7.0" }, @@ -4844,135 +4925,122 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/@remote-ui/rpc": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@remote-ui/rpc/-/rpc-1.4.5.tgz", + "integrity": "sha512-Cr+06niG/vmE4A9YsmaKngRuuVSWKMY42NMwtZfy+gctRWGu6Wj9BWuMJg5CEp+JTkRBPToqT5rqnrg1G/Wvow==" + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true }, - "node_modules/@sentry/core": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.19.7.tgz", - "integrity": "sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw==", + "node_modules/@sentry-internal/tracing": { + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.120.3.tgz", + "integrity": "sha512-Ausx+Jw1pAMbIBHStoQ6ZqDZR60PsCByvHdw/jdH9AqPrNE9xlBSf9EwcycvmrzwyKspSLaB52grlje2cRIUMg==", "dev": true, "dependencies": { - "@sentry/hub": "6.19.7", - "@sentry/minimal": "6.19.7", - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "tslib": "^1.9.3" + "@sentry/core": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/@sentry/core/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@sentry/hub": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", - "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==", + "node_modules/@sentry/core": { + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.120.3.tgz", + "integrity": "sha512-vyy11fCGpkGK3qI5DSXOjgIboBZTriw0YDx/0KyX5CjIjDDNgp5AGgpgFkfZyiYiaU2Ww3iFuKo4wHmBusz1uA==", "dev": true, "dependencies": { - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "tslib": "^1.9.3" + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/@sentry/hub/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@sentry/minimal": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz", - "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==", + "node_modules/@sentry/integrations": { + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.120.3.tgz", + "integrity": "sha512-6i/lYp0BubHPDTg91/uxHvNui427df9r17SsIEXa2eKDwQ9gW2qRx5IWgvnxs2GV/GfSbwcx4swUB3RfEWrXrQ==", "dev": true, "dependencies": { - "@sentry/hub": "6.19.7", - "@sentry/types": "6.19.7", - "tslib": "^1.9.3" + "@sentry/core": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3", + "localforage": "^1.8.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/@sentry/minimal/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@sentry/node": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-6.19.7.tgz", - "integrity": "sha512-gtmRC4dAXKODMpHXKfrkfvyBL3cI8y64vEi3fDD046uqYcrWdgoQsffuBbxMAizc6Ez1ia+f0Flue6p15Qaltg==", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.120.3.tgz", + "integrity": "sha512-t+QtekZedEfiZjbkRAk1QWJPnJlFBH/ti96tQhEq7wmlk3VszDXraZvLWZA0P2vXyglKzbWRGkT31aD3/kX+5Q==", "dev": true, "dependencies": { - "@sentry/core": "6.19.7", - "@sentry/hub": "6.19.7", - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" + "@sentry-internal/tracing": "7.120.3", + "@sentry/core": "7.120.3", + "@sentry/integrations": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" }, "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/node/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true, - "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/@sentry/node/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@sentry/types": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", - "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.3.tgz", + "integrity": "sha512-C4z+3kGWNFJ303FC+FxAd4KkHvxpNFYAFN8iMIgBwJdpIl25KZ8Q/VdGn0MLLUEHNLvjob0+wvwlcRBBNLXOow==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/@sentry/utils": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", - "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.120.3.tgz", + "integrity": "sha512-UDAOQJtJDxZHQ5Nm1olycBIsz2wdGX8SdzyGVHmD8EOQYAeDZQyIlQYohDe9nazdIOQLZCIc3fU0G9gqVLkaGQ==", "dev": true, "dependencies": { - "@sentry/types": "6.19.7", - "tslib": "^1.9.3" + "@sentry/types": "7.120.3" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/@sentry/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "node_modules/@shopify/web-worker": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@shopify/web-worker/-/web-worker-6.4.0.tgz", + "integrity": "sha512-RvY1mgRyAqawFiYBvsBkek2pVK4GVpV9mmhWFCZXwx01usxXd2HMhKNTFeRYhSp29uoUcfBlKZAwCwQzt826tg==", + "dependencies": { + "@remote-ui/rpc": "^1.2.5" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": "^5.38.0", + "webpack-virtual-modules": "^0.4.3 || ^0.5.0 || ^0.6.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "webpack": { + "optional": true + }, + "webpack-virtual-modules": { + "optional": true + } + } }, "node_modules/@sideway/address": { "version": "4.1.5", @@ -5072,14 +5140,14 @@ "dev": true }, "node_modules/@stylistic/stylelint-plugin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.0.1.tgz", - "integrity": "sha512-j3mH8HSw2Rob/KJFWZ627w3CQ8gQqVHtzCdPeEffUg5vOgpz4rgrR+Xw2kU0OQCDcdW8Y1nKfdXKKjM5Rn8X0g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.1.tgz", + "integrity": "sha512-XagAHHIa528EvyGybv8EEYGK5zrVW74cHpsjhtovVATbhDRuJYfE+X4HCaAieW9lCkwbX6L+X0I4CiUG3w/hFw==", "dev": true, "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.0", - "@csstools/css-tokenizer": "^3.0.0", - "@csstools/media-query-list-parser": "^3.0.0", + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1", + "@csstools/media-query-list-parser": "^3.0.1", "is-plain-object": "^5.0.0", "postcss-selector-parser": "^6.1.2", "postcss-value-parser": "^4.2.0", @@ -5537,9 +5605,9 @@ ] }, "node_modules/@svgr/plugin-svgo/node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "dependencies": { "dom-serializer": "^2.0.0", @@ -6652,14 +6720,13 @@ } }, "node_modules/@wordpress/a11y": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/@wordpress/a11y/-/a11y-4.8.2.tgz", - "integrity": "sha512-eILr2ZYK5FYSlx18rnP06qKyPELxEyDcnosSOsjskPGw5gYT01sUf0fkAebliuG88VppT+bgI008TRo3dvtZzQ==", - "license": "GPL-2.0-or-later", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/a11y/-/a11y-4.17.0.tgz", + "integrity": "sha512-TCQ/PGC0Me3yzPUrmY2FpECl7GUcUcx6kVGUugmlMxNwxeZRYUOEMxsHGm07iKV5l7zbi3y5c/i5bbYwJfXA4g==", "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/dom-ready": "^4.8.1", - "@wordpress/i18n": "^5.8.2" + "@babel/runtime": "7.25.7", + "@wordpress/dom-ready": "^4.17.0", + "@wordpress/i18n": "^5.17.0" }, "engines": { "node": ">=18.12.0", @@ -6667,16 +6734,15 @@ } }, "node_modules/@wordpress/annotations": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/@wordpress/annotations/-/annotations-3.8.3.tgz", - "integrity": "sha512-ihDxDnDDX73j7VGZutx0XBGelMf9cZmfh3L6hNW5CFacMTaH9+FNAY4+2I55N+fWOE7h1ePlHeL5DXvz38xsug==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/data": "^10.8.3", - "@wordpress/hooks": "^4.8.2", - "@wordpress/i18n": "^5.8.2", - "@wordpress/rich-text": "^7.8.3", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/annotations/-/annotations-3.17.0.tgz", + "integrity": "sha512-KatcmRnoPWGbO8JVq75agROeJVw1YRMaHzIY9c/UZBu3jyRVCGrSFfr3Xh7C3Lg6I01bWFBwN0RQvFmNMlYEeQ==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/data": "^10.17.0", + "@wordpress/hooks": "^4.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/rich-text": "^7.17.0", "uuid": "^9.0.1" }, "engines": { @@ -6701,14 +6767,13 @@ } }, "node_modules/@wordpress/api-fetch": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-7.8.2.tgz", - "integrity": "sha512-6jiodZD4+5lIelb/E6FHMa6xuldcoIkQ5vWtvHpoB30++7eOgYi0tl5b1NlzGqfReIcl9oO+Wwp5V9mRE+mJoA==", - "license": "GPL-2.0-or-later", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-7.17.0.tgz", + "integrity": "sha512-L3iT/K41R6KResTy/7EOsTD+KKO20U3B4lPz/jQMRNgFdq4MOxtalEMjrRoj1mG+qiYGYdvGmpSgOzSx9o3eRg==", "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/i18n": "^5.8.2", - "@wordpress/url": "^4.8.1" + "@babel/runtime": "7.25.7", + "@wordpress/i18n": "^5.17.0", + "@wordpress/url": "^4.17.0" }, "engines": { "node": ">=18.12.0", @@ -6716,12 +6781,11 @@ } }, "node_modules/@wordpress/autop": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/autop/-/autop-4.8.1.tgz", - "integrity": "sha512-/ah4oBIRGMZlxBBPiD6R5uamCPEXTzmsJ0iceDJxMHc5KvNcy59oHNCirD5yiRLORk8RrujUczIGfglpUjGh2Q==", - "license": "GPL-2.0-or-later", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/autop/-/autop-4.17.0.tgz", + "integrity": "sha512-6O9Eo/S02OHIa4GflfcWHANHpuy5/SifaWiprWYTrhIt6L6DyVxr1AErSWfDXIrkNNVXuhhykYDHAtApKqpqsQ==", "dependencies": { - "@babel/runtime": "^7.16.0" + "@babel/runtime": "7.25.7" }, "engines": { "node": ">=18.12.0", @@ -6729,20 +6793,19 @@ } }, "node_modules/@wordpress/babel-preset-default": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-8.8.2.tgz", - "integrity": "sha512-XhIpSw6d8GeaBe+gQ25nck01+Q3UiVQgih/yBCFWNtzB2qp/AB7195lHGxbuAYUO9RM1eXsf8kVJV2caAb4WnA==", - "dev": true, - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/plugin-transform-react-jsx": "^7.16.0", - "@babel/plugin-transform-runtime": "^7.16.0", - "@babel/preset-env": "^7.16.0", - "@babel/preset-typescript": "^7.16.0", - "@babel/runtime": "^7.16.0", - "@wordpress/browserslist-config": "^6.8.1", - "@wordpress/warning": "^3.8.1", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-8.17.0.tgz", + "integrity": "sha512-+ivwvBI92u6abFf0DlwHem8fH5HujKy5e8a0cwDBOJivEzIJLPKYSYLlnLZL9I0QIstB+KdcJBARuWuR0l58Sw==", + "dev": true, + "dependencies": { + "@babel/core": "7.25.7", + "@babel/plugin-transform-react-jsx": "7.25.7", + "@babel/plugin-transform-runtime": "7.25.7", + "@babel/preset-env": "7.25.7", + "@babel/preset-typescript": "7.25.7", + "@babel/runtime": "7.25.7", + "@wordpress/browserslist-config": "^6.17.0", + "@wordpress/warning": "^3.17.0", "browserslist": "^4.21.10", "core-js": "^3.31.0", "react": "^18.3.0" @@ -6753,23 +6816,21 @@ } }, "node_modules/@wordpress/base-styles": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-5.9.0.tgz", - "integrity": "sha512-b0erDgc8I6NTjbHaPL4GTa3IbfHp4o1+Yx74oT6gLgV9i7Qd8UjBmsUDYIZTV1jqB/ch9DuaDqDaNYqW6tXpZg==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-5.17.0.tgz", + "integrity": "sha512-9rYupV2CIS6PIlE27vxqBEn98n2hEBdI4YQI7TD7kdbGHYRDfTqocDK7stiAgqKR9ujDoVmq+Yk3T/jzRi6WoA==", "dev": true, - "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", "npm": ">=8.19.2" } }, "node_modules/@wordpress/blob": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/blob/-/blob-4.8.1.tgz", - "integrity": "sha512-fMLWmum+B8aZi5w8Tie7mw+LEP/FF6RXVMG8AH4GwtXYYD2b3WgjbF7I4p6HYOaz3kAEnlJNo55qqLT2tFogww==", - "license": "GPL-2.0-or-later", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/blob/-/blob-4.17.0.tgz", + "integrity": "sha512-qH0Q48clM+UTdTMWUsCyyAuy4J+koNGLz4oXyJZCrUvUQ31Hpj6VwQulM2lSXYQyzOWJEKf3deHM47Uz1JYhhg==", "dependencies": { - "@babel/runtime": "^7.16.0" + "@babel/runtime": "7.25.7" }, "engines": { "node": ">=18.12.0", @@ -6777,30 +6838,29 @@ } }, "node_modules/@wordpress/block-directory": { - "version": "5.8.18", - "resolved": "https://registry.npmjs.org/@wordpress/block-directory/-/block-directory-5.8.18.tgz", - "integrity": "sha512-lYZDKI/IFMymfi3MxFfvpBMx6nhqAOEX+IXZvpKPiHR62LL+MXBoeOdiSZYKysfztFyPH7Ism43c1TeY+fQnIg==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^4.8.2", - "@wordpress/api-fetch": "^7.8.2", - "@wordpress/block-editor": "^14.3.15", - "@wordpress/blocks": "^13.8.5", - "@wordpress/components": "^28.8.11", - "@wordpress/compose": "^7.8.3", - "@wordpress/core-data": "^7.8.15", - "@wordpress/data": "^10.8.3", - "@wordpress/editor": "^14.8.18", - "@wordpress/element": "^6.8.1", - "@wordpress/hooks": "^4.8.2", - "@wordpress/html-entities": "^4.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/icons": "^10.8.2", - "@wordpress/notices": "^5.8.3", - "@wordpress/plugins": "^7.8.11", - "@wordpress/private-apis": "^1.8.1", - "@wordpress/url": "^4.8.1", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@wordpress/block-directory/-/block-directory-5.17.1.tgz", + "integrity": "sha512-cAVDAAEuoFo9sYD2dXZgIZR3OJHOADpXvonzq652ssscO9IZYbML+zXZ/4rdGrL166KjQ4xtc4QULg/6Ba0+rQ==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/a11y": "^4.17.0", + "@wordpress/api-fetch": "^7.17.0", + "@wordpress/block-editor": "^14.12.0", + "@wordpress/blocks": "^14.6.0", + "@wordpress/components": "^29.3.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/core-data": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/editor": "^14.17.1", + "@wordpress/element": "^6.17.0", + "@wordpress/hooks": "^4.17.0", + "@wordpress/html-entities": "^4.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/icons": "^10.17.0", + "@wordpress/notices": "^5.17.0", + "@wordpress/plugins": "^7.17.0", + "@wordpress/private-apis": "^1.17.0", + "@wordpress/url": "^4.17.0", "change-case": "^4.1.2", "clsx": "^2.1.1" }, @@ -6814,45 +6874,46 @@ } }, "node_modules/@wordpress/block-editor": { - "version": "14.3.15", - "resolved": "https://registry.npmjs.org/@wordpress/block-editor/-/block-editor-14.3.15.tgz", - "integrity": "sha512-5cFdYZMXsOlzWzbzLSB34wT3aQfl2WEKw83NA9/A4IAvZ7rJXdVJx0H2ZP7itmU/Rcj2cxPC152rfit9y4/+ww==", - "license": "GPL-2.0-or-later", + "version": "14.12.0", + "resolved": "https://registry.npmjs.org/@wordpress/block-editor/-/block-editor-14.12.0.tgz", + "integrity": "sha512-i8tUlPiRgLqUFVnAHDjS7MNHZMFDYMkm5gR2xsNryzhsvoAndUYJiktftbXNaQVki/EMoDf1zHicHZ2g2AQy5Q==", "dependencies": { - "@babel/runtime": "^7.16.0", + "@babel/runtime": "7.25.7", "@emotion/react": "^11.7.1", "@emotion/styled": "^11.6.0", "@react-spring/web": "^9.4.5", - "@wordpress/a11y": "^4.8.2", - "@wordpress/api-fetch": "^7.8.2", - "@wordpress/blob": "^4.8.1", - "@wordpress/block-serialization-default-parser": "^5.8.1", - "@wordpress/blocks": "^13.8.5", - "@wordpress/commands": "^1.8.11", - "@wordpress/components": "^28.8.11", - "@wordpress/compose": "^7.8.3", - "@wordpress/data": "^10.8.3", - "@wordpress/date": "^5.8.2", - "@wordpress/deprecated": "^4.8.2", - "@wordpress/dom": "^4.8.2", - "@wordpress/element": "^6.8.1", - "@wordpress/escape-html": "^3.8.1", - "@wordpress/hooks": "^4.8.2", - "@wordpress/html-entities": "^4.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/icons": "^10.8.2", - "@wordpress/is-shallow-equal": "^5.8.1", - "@wordpress/keyboard-shortcuts": "^5.8.3", - "@wordpress/keycodes": "^4.8.2", - "@wordpress/notices": "^5.8.3", - "@wordpress/preferences": "^4.8.11", - "@wordpress/private-apis": "^1.8.1", - "@wordpress/rich-text": "^7.8.3", - "@wordpress/style-engine": "^2.8.1", - "@wordpress/token-list": "^3.8.1", - "@wordpress/url": "^4.8.1", - "@wordpress/warning": "^3.8.1", - "@wordpress/wordcount": "^4.8.1", + "@wordpress/a11y": "^4.17.0", + "@wordpress/api-fetch": "^7.17.0", + "@wordpress/blob": "^4.17.0", + "@wordpress/block-serialization-default-parser": "^5.17.0", + "@wordpress/blocks": "^14.6.0", + "@wordpress/commands": "^1.17.0", + "@wordpress/components": "^29.3.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/date": "^5.17.0", + "@wordpress/deprecated": "^4.17.0", + "@wordpress/dom": "^4.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/escape-html": "^3.17.0", + "@wordpress/hooks": "^4.17.0", + "@wordpress/html-entities": "^4.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/icons": "^10.17.0", + "@wordpress/is-shallow-equal": "^5.17.0", + "@wordpress/keyboard-shortcuts": "^5.17.0", + "@wordpress/keycodes": "^4.17.0", + "@wordpress/notices": "^5.17.0", + "@wordpress/preferences": "^4.17.0", + "@wordpress/priority-queue": "^3.17.0", + "@wordpress/private-apis": "^1.17.0", + "@wordpress/rich-text": "^7.17.0", + "@wordpress/style-engine": "^2.17.0", + "@wordpress/token-list": "^3.17.0", + "@wordpress/upload-media": "^0.2.0", + "@wordpress/url": "^4.17.0", + "@wordpress/warning": "^3.17.0", + "@wordpress/wordcount": "^4.17.0", "change-case": "^4.1.2", "clsx": "^2.1.1", "colord": "^2.7.0", @@ -6878,45 +6939,44 @@ } }, "node_modules/@wordpress/block-library": { - "version": "9.8.16", - "resolved": "https://registry.npmjs.org/@wordpress/block-library/-/block-library-9.8.16.tgz", - "integrity": "sha512-1Vo36U439E856KR22n71oHhXTJ7e7iRS/4HDWEem1NY1iSFiBK3RBoIDLv7emVExSXhdRill7RjPGmRMeiEvJg==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^4.8.2", - "@wordpress/api-fetch": "^7.8.2", - "@wordpress/autop": "^4.8.1", - "@wordpress/blob": "^4.8.1", - "@wordpress/block-editor": "^14.3.15", - "@wordpress/blocks": "^13.8.5", - "@wordpress/components": "^28.8.11", - "@wordpress/compose": "^7.8.3", - "@wordpress/core-data": "^7.8.15", - "@wordpress/data": "^10.8.3", - "@wordpress/date": "^5.8.2", - "@wordpress/deprecated": "^4.8.2", - "@wordpress/dom": "^4.8.2", - "@wordpress/element": "^6.8.1", - "@wordpress/escape-html": "^3.8.1", - "@wordpress/hooks": "^4.8.2", - "@wordpress/html-entities": "^4.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/icons": "^10.8.2", - "@wordpress/interactivity": "^6.8.5", - "@wordpress/interactivity-router": "^2.8.6", - "@wordpress/keyboard-shortcuts": "^5.8.3", - "@wordpress/keycodes": "^4.8.2", - "@wordpress/notices": "^5.8.3", - "@wordpress/patterns": "^2.8.15", - "@wordpress/primitives": "^4.8.1", - "@wordpress/private-apis": "^1.8.1", - "@wordpress/reusable-blocks": "^5.8.15", - "@wordpress/rich-text": "^7.8.3", - "@wordpress/server-side-render": "^5.8.11", - "@wordpress/url": "^4.8.1", - "@wordpress/viewport": "^6.8.3", - "@wordpress/wordcount": "^4.8.1", + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/block-library/-/block-library-9.17.0.tgz", + "integrity": "sha512-dJOWzGCNFZ1Ft8n9U0z30WceCr73At/Zqv68qUkjNI3CcwevtrUpg7uVQER3Q7Ai605CyB04MHELea3WixqX/Q==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/a11y": "^4.17.0", + "@wordpress/api-fetch": "^7.17.0", + "@wordpress/autop": "^4.17.0", + "@wordpress/blob": "^4.17.0", + "@wordpress/block-editor": "^14.12.0", + "@wordpress/blocks": "^14.6.0", + "@wordpress/components": "^29.3.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/core-data": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/date": "^5.17.0", + "@wordpress/deprecated": "^4.17.0", + "@wordpress/dom": "^4.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/escape-html": "^3.17.0", + "@wordpress/hooks": "^4.17.0", + "@wordpress/html-entities": "^4.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/icons": "^10.17.0", + "@wordpress/interactivity": "^6.17.0", + "@wordpress/interactivity-router": "^2.17.0", + "@wordpress/keyboard-shortcuts": "^5.17.0", + "@wordpress/keycodes": "^4.17.0", + "@wordpress/notices": "^5.17.0", + "@wordpress/patterns": "^2.17.0", + "@wordpress/primitives": "^4.17.0", + "@wordpress/private-apis": "^1.17.0", + "@wordpress/reusable-blocks": "^5.17.0", + "@wordpress/rich-text": "^7.17.0", + "@wordpress/server-side-render": "^5.17.0", + "@wordpress/url": "^4.17.0", + "@wordpress/viewport": "^6.17.0", + "@wordpress/wordcount": "^4.17.0", "change-case": "^4.1.2", "clsx": "^2.1.1", "colord": "^2.7.0", @@ -6950,12 +7010,11 @@ } }, "node_modules/@wordpress/block-serialization-default-parser": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-5.8.1.tgz", - "integrity": "sha512-SmbMiM/KTh9veMcujL+t375yMR1JZlIzbVEIk6NdiGV+7pvtenUe4Av0tr+0QaINmgo3MJmc4Y3csZrKFlRr+w==", - "license": "GPL-2.0-or-later", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-5.17.0.tgz", + "integrity": "sha512-4oVgm6f/kRqersuTH1SS85x89P4foPAo2xwjoXvHdjy1Rp0UQ86uxyKn0j0A6k7uQEXc5BJeUevk/Z1AT1Z9bQ==", "dependencies": { - "@babel/runtime": "^7.16.0" + "@babel/runtime": "7.25.7" }, "engines": { "node": ">=18.12.0", @@ -6963,27 +7022,26 @@ } }, "node_modules/@wordpress/blocks": { - "version": "13.8.5", - "resolved": "https://registry.npmjs.org/@wordpress/blocks/-/blocks-13.8.5.tgz", - "integrity": "sha512-KE0bbN370G3tA/7Oaugk0IRLaG3p06sEnfbbDvoRSyiPyxQsyYb53i921vuteHtzQ+3DEjtDzrku/bsKOn81Tg==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/autop": "^4.8.1", - "@wordpress/blob": "^4.8.1", - "@wordpress/block-serialization-default-parser": "^5.8.1", - "@wordpress/data": "^10.8.3", - "@wordpress/deprecated": "^4.8.2", - "@wordpress/dom": "^4.8.2", - "@wordpress/element": "^6.8.1", - "@wordpress/hooks": "^4.8.2", - "@wordpress/html-entities": "^4.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/is-shallow-equal": "^5.8.1", - "@wordpress/private-apis": "^1.8.1", - "@wordpress/rich-text": "^7.8.3", - "@wordpress/shortcode": "^4.8.1", - "@wordpress/warning": "^3.8.1", + "version": "14.6.0", + "resolved": "https://registry.npmjs.org/@wordpress/blocks/-/blocks-14.6.0.tgz", + "integrity": "sha512-9FkjXHRTXIaOU7BJfoeRUe1snh+5H8rypOTJoDpiMCoXMfGKyBVpacRMzbltQiK7SrzmHbzst4EuxHoK7a/TVw==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/autop": "^4.17.0", + "@wordpress/blob": "^4.17.0", + "@wordpress/block-serialization-default-parser": "^5.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/deprecated": "^4.17.0", + "@wordpress/dom": "^4.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/hooks": "^4.17.0", + "@wordpress/html-entities": "^4.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/is-shallow-equal": "^5.17.0", + "@wordpress/private-apis": "^1.17.0", + "@wordpress/rich-text": "^7.17.0", + "@wordpress/shortcode": "^4.17.0", + "@wordpress/warning": "^3.17.0", "change-case": "^4.1.2", "colord": "^2.7.0", "fast-deep-equal": "^3.1.3", @@ -7018,9 +7076,9 @@ } }, "node_modules/@wordpress/browserslist-config": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.8.1.tgz", - "integrity": "sha512-hp2eE0DiRbFGTUEQ49kLVyZWlR8lfm8hb2XKqSoWbeqzWM5ZkgrRRJMrJRPS/jCEWTWDdlBwUFfsVNDKpmHc9A==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.17.0.tgz", + "integrity": "sha512-cjMclWLwfam5O03gOHWjD8veeLVnfmC93V9LX1aPt/ZT9aE0cmEZUxBa3VzkDM7NvuZFj7SjSvJr+vuar9Np1A==", "dev": true, "engines": { "node": ">=18.12.0", @@ -7028,19 +7086,18 @@ } }, "node_modules/@wordpress/commands": { - "version": "1.8.11", - "resolved": "https://registry.npmjs.org/@wordpress/commands/-/commands-1.8.11.tgz", - "integrity": "sha512-CKnzWwSKO3kckqV58JXA0taU2JgIpEkVxX8xUOe3aI1isaOFjF+iwshuhNgWcs3sAiuUK0s4aQWi3ZqGhmirzA==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/components": "^28.8.11", - "@wordpress/data": "^10.8.3", - "@wordpress/element": "^6.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/icons": "^10.8.2", - "@wordpress/keyboard-shortcuts": "^5.8.3", - "@wordpress/private-apis": "^1.8.1", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/commands/-/commands-1.17.0.tgz", + "integrity": "sha512-oZLv9pi0iiIO7DXRijK9gze5+iktoUyfDVipAmbmxAVEqptfWuPP3BRSkZxf+ccoIWpz0EhNKShsbQM86FwVbg==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/components": "^29.3.0", + "@wordpress/data": "^10.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/icons": "^10.17.0", + "@wordpress/keyboard-shortcuts": "^5.17.0", + "@wordpress/private-apis": "^1.17.0", "clsx": "^2.1.1", "cmdk": "^1.0.0" }, @@ -7054,13 +7111,12 @@ } }, "node_modules/@wordpress/components": { - "version": "28.8.11", - "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-28.8.11.tgz", - "integrity": "sha512-IfSSeFUcbBS1eS5fq1ShPIW2JEU9OJiKrkZ8Ae3FpqTfYbJppVP4+cpK+kvBWj5PLyg+EBHv4W5dx9tMUKsKRg==", - "license": "GPL-2.0-or-later", + "version": "29.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-29.3.0.tgz", + "integrity": "sha512-9lQIXsbgFeGY1QXEhNHQ6mq+6sS1TGGdZdaGSoQoP682WWgdjshnyq/0yhGULY9ReDKnZF2mHJ/J3FvleyYMcg==", "dependencies": { - "@ariakit/react": "^0.4.10", - "@babel/runtime": "^7.16.0", + "@ariakit/react": "^0.4.15", + "@babel/runtime": "7.25.7", "@emotion/cache": "^11.7.1", "@emotion/css": "^11.7.1", "@emotion/react": "^11.7.1", @@ -7071,23 +7127,23 @@ "@types/gradient-parser": "0.1.3", "@types/highlight-words-core": "1.2.1", "@use-gesture/react": "^10.3.1", - "@wordpress/a11y": "^4.8.2", - "@wordpress/compose": "^7.8.3", - "@wordpress/date": "^5.8.2", - "@wordpress/deprecated": "^4.8.2", - "@wordpress/dom": "^4.8.2", - "@wordpress/element": "^6.8.1", - "@wordpress/escape-html": "^3.8.1", - "@wordpress/hooks": "^4.8.2", - "@wordpress/html-entities": "^4.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/icons": "^10.8.2", - "@wordpress/is-shallow-equal": "^5.8.1", - "@wordpress/keycodes": "^4.8.2", - "@wordpress/primitives": "^4.8.1", - "@wordpress/private-apis": "^1.8.1", - "@wordpress/rich-text": "^7.8.3", - "@wordpress/warning": "^3.8.1", + "@wordpress/a11y": "^4.17.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/date": "^5.17.0", + "@wordpress/deprecated": "^4.17.0", + "@wordpress/dom": "^4.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/escape-html": "^3.17.0", + "@wordpress/hooks": "^4.17.0", + "@wordpress/html-entities": "^4.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/icons": "^10.17.0", + "@wordpress/is-shallow-equal": "^5.17.0", + "@wordpress/keycodes": "^4.17.0", + "@wordpress/primitives": "^4.17.0", + "@wordpress/private-apis": "^1.17.0", + "@wordpress/rich-text": "^7.17.0", + "@wordpress/warning": "^3.17.0", "change-case": "^4.1.2", "clsx": "^2.1.1", "colord": "^2.7.0", @@ -7128,20 +7184,19 @@ } }, "node_modules/@wordpress/compose": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-7.8.3.tgz", - "integrity": "sha512-knHfFz1/rzFr69d2lDIFspXYTn56Fdd6+4Enc9QhHfkICpwi59jQCXqtNguCB2O8FdL2FNpK1YSgx1FrTo37dA==", - "license": "GPL-2.0-or-later", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-7.17.0.tgz", + "integrity": "sha512-jn5uCw08HHLfOpIDp0pKBDZh1oZiMwjiK3c3IZdZo6eoWZjpOr3ecsMa4RBl/4HbqnUoeFDD6Lj83IEKPuzHQg==", "dependencies": { - "@babel/runtime": "^7.16.0", + "@babel/runtime": "7.25.7", "@types/mousetrap": "^1.6.8", - "@wordpress/deprecated": "^4.8.2", - "@wordpress/dom": "^4.8.2", - "@wordpress/element": "^6.8.1", - "@wordpress/is-shallow-equal": "^5.8.1", - "@wordpress/keycodes": "^4.8.2", - "@wordpress/priority-queue": "^3.8.1", - "@wordpress/undo-manager": "^1.8.1", + "@wordpress/deprecated": "^4.17.0", + "@wordpress/dom": "^4.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/is-shallow-equal": "^5.17.0", + "@wordpress/keycodes": "^4.17.0", + "@wordpress/priority-queue": "^3.17.0", + "@wordpress/undo-manager": "^1.17.0", "change-case": "^4.1.2", "clipboard": "^2.0.11", "mousetrap": "^1.6.5", @@ -7156,25 +7211,24 @@ } }, "node_modules/@wordpress/core-commands": { - "version": "1.8.15", - "resolved": "https://registry.npmjs.org/@wordpress/core-commands/-/core-commands-1.8.15.tgz", - "integrity": "sha512-1+Pa1V6Tsc1bFFHzbAfaqSv+w58jKQ+3qqdlcmGWdkYJz8VLE6kaKG9IrgT+xm0ricGpQ6dy6T2h6BXRWT5LgQ==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/block-editor": "^14.3.15", - "@wordpress/commands": "^1.8.11", - "@wordpress/compose": "^7.8.3", - "@wordpress/core-data": "^7.8.15", - "@wordpress/data": "^10.8.3", - "@wordpress/element": "^6.8.1", - "@wordpress/html-entities": "^4.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/icons": "^10.8.2", - "@wordpress/notices": "^5.8.3", - "@wordpress/private-apis": "^1.8.1", - "@wordpress/router": "^1.8.1", - "@wordpress/url": "^4.8.1" + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/core-commands/-/core-commands-1.17.0.tgz", + "integrity": "sha512-VcM2/d0HdxkrUazOHnrYNEnStADs8r6b4nILGSkdGl55zi1NYFRYo4RpVOn7FvLGQIBSnNle8w+7ifKtHzfK5g==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/block-editor": "^14.12.0", + "@wordpress/commands": "^1.17.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/core-data": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/html-entities": "^4.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/icons": "^10.17.0", + "@wordpress/notices": "^5.17.0", + "@wordpress/private-apis": "^1.17.0", + "@wordpress/router": "^1.17.0", + "@wordpress/url": "^4.17.0" }, "engines": { "node": ">=18.12.0", @@ -7186,28 +7240,27 @@ } }, "node_modules/@wordpress/core-data": { - "version": "7.8.15", - "resolved": "https://registry.npmjs.org/@wordpress/core-data/-/core-data-7.8.15.tgz", - "integrity": "sha512-fh3/Q8UF2skuSAgERXDhQdc59yA+WxE1YweIFbW1Gh2V80T9XrkX7GHQBuAXcEScdcIsE64fZLYJkVhrrWl0jA==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/api-fetch": "^7.8.2", - "@wordpress/block-editor": "^14.3.15", - "@wordpress/blocks": "^13.8.5", - "@wordpress/compose": "^7.8.3", - "@wordpress/data": "^10.8.3", - "@wordpress/deprecated": "^4.8.2", - "@wordpress/element": "^6.8.1", - "@wordpress/html-entities": "^4.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/is-shallow-equal": "^5.8.1", - "@wordpress/private-apis": "^1.8.1", - "@wordpress/rich-text": "^7.8.3", - "@wordpress/sync": "^1.8.1", - "@wordpress/undo-manager": "^1.8.1", - "@wordpress/url": "^4.8.1", - "@wordpress/warning": "^3.8.1", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/core-data/-/core-data-7.17.0.tgz", + "integrity": "sha512-khNm8SDsIwXr1297e3j3Y/KHZmtRmouRgn+AWzlmlgdArsk8IlIwe9W+KE1tg+VoZJ5f3p0B7rqBUQfD7qbXQg==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/api-fetch": "^7.17.0", + "@wordpress/block-editor": "^14.12.0", + "@wordpress/blocks": "^14.6.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/deprecated": "^4.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/html-entities": "^4.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/is-shallow-equal": "^5.17.0", + "@wordpress/private-apis": "^1.17.0", + "@wordpress/rich-text": "^7.17.0", + "@wordpress/sync": "^1.17.0", + "@wordpress/undo-manager": "^1.17.0", + "@wordpress/url": "^4.17.0", + "@wordpress/warning": "^3.17.0", "change-case": "^4.1.2", "equivalent-key-map": "^0.2.2", "fast-deep-equal": "^3.1.3", @@ -7237,32 +7290,31 @@ } }, "node_modules/@wordpress/customize-widgets": { - "version": "5.8.16", - "resolved": "https://registry.npmjs.org/@wordpress/customize-widgets/-/customize-widgets-5.8.16.tgz", - "integrity": "sha512-Rl3n+55RTwHfTb8MyjAJc7/y61w+rOXMubst+gpOa6Uw5EN/rq61evCopLD86tVHMesWflQvC7jDDr6MwTcmeA==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/block-editor": "^14.3.15", - "@wordpress/block-library": "^9.8.16", - "@wordpress/blocks": "^13.8.5", - "@wordpress/components": "^28.8.11", - "@wordpress/compose": "^7.8.3", - "@wordpress/core-data": "^7.8.15", - "@wordpress/data": "^10.8.3", - "@wordpress/dom": "^4.8.2", - "@wordpress/element": "^6.8.1", - "@wordpress/hooks": "^4.8.2", - "@wordpress/i18n": "^5.8.2", - "@wordpress/icons": "^10.8.2", - "@wordpress/interface": "^6.8.11", - "@wordpress/is-shallow-equal": "^5.8.1", - "@wordpress/keyboard-shortcuts": "^5.8.3", - "@wordpress/keycodes": "^4.8.2", - "@wordpress/media-utils": "^5.8.2", - "@wordpress/preferences": "^4.8.11", - "@wordpress/private-apis": "^1.8.1", - "@wordpress/widgets": "^4.8.15", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/customize-widgets/-/customize-widgets-5.17.0.tgz", + "integrity": "sha512-CD5nCabogJDEoePvmL1anKaLR/le1sQSUAzxyVmz8ARZT6DdyDf24l8+7q7FqqJsfAKybckcInH0SpMrlFfhdw==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/block-editor": "^14.12.0", + "@wordpress/block-library": "^9.17.0", + "@wordpress/blocks": "^14.6.0", + "@wordpress/components": "^29.3.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/core-data": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/dom": "^4.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/hooks": "^4.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/icons": "^10.17.0", + "@wordpress/interface": "^9.2.0", + "@wordpress/is-shallow-equal": "^5.17.0", + "@wordpress/keyboard-shortcuts": "^5.17.0", + "@wordpress/keycodes": "^4.17.0", + "@wordpress/media-utils": "^5.17.0", + "@wordpress/preferences": "^4.17.0", + "@wordpress/private-apis": "^1.17.0", + "@wordpress/widgets": "^4.17.0", "clsx": "^2.1.1", "fast-deep-equal": "^3.1.3" }, @@ -7276,24 +7328,23 @@ } }, "node_modules/@wordpress/data": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-10.8.3.tgz", - "integrity": "sha512-JunqBEVVwJJz45N8JTZNh9WHFn857SUtbp7Efp55oesH/g3ejLMuNu6Ewf9/qEEGQut8VeVQ7yGhl+GQDu9u+w==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/compose": "^7.8.3", - "@wordpress/deprecated": "^4.8.2", - "@wordpress/element": "^6.8.1", - "@wordpress/is-shallow-equal": "^5.8.1", - "@wordpress/priority-queue": "^3.8.1", - "@wordpress/private-apis": "^1.8.1", - "@wordpress/redux-routine": "^5.8.1", + "version": "10.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-10.17.0.tgz", + "integrity": "sha512-NezfpsRH3BIV2i10wFohsGfOQ+pp9TvSHFuVK/AlQmnAogoMpFOxAumXCI7rvDoH1X4rEPiX2ggRnxP2+Z6jwQ==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/compose": "^7.17.0", + "@wordpress/deprecated": "^4.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/is-shallow-equal": "^5.17.0", + "@wordpress/priority-queue": "^3.17.0", + "@wordpress/private-apis": "^1.17.0", + "@wordpress/redux-routine": "^5.17.0", "deepmerge": "^4.3.0", "equivalent-key-map": "^0.2.2", "is-plain-object": "^5.0.0", "is-promise": "^4.0.0", - "redux": "^4.1.2", + "redux": "^5.0.1", "rememo": "^4.0.2", "use-memo-one": "^1.1.1" }, @@ -7306,15 +7357,14 @@ } }, "node_modules/@wordpress/data-controls": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/@wordpress/data-controls/-/data-controls-4.8.3.tgz", - "integrity": "sha512-uh7ECbGDU3lFIUK+LiN0GHFRlWzgvsT+RXZeEDWE22gtbrksdGOQV8Ufz+/iSUnMaOA41r0Yz90lROfUL4mdFQ==", - "license": "GPL-2.0-or-later", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/data-controls/-/data-controls-4.17.0.tgz", + "integrity": "sha512-YHfo+Zl7hXQbwd52ZwBi9m1bOs/Nh845xIWHefnGTxo05QjFMxbj9VzZGec+HW1rIpRz2gmdA+dYoD75LIPoJA==", "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/api-fetch": "^7.8.2", - "@wordpress/data": "^10.8.3", - "@wordpress/deprecated": "^4.8.2" + "@babel/runtime": "7.25.7", + "@wordpress/api-fetch": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/deprecated": "^4.17.0" }, "engines": { "node": ">=18.12.0", @@ -7325,22 +7375,21 @@ } }, "node_modules/@wordpress/dataviews": { - "version": "4.4.11", - "resolved": "https://registry.npmjs.org/@wordpress/dataviews/-/dataviews-4.4.11.tgz", - "integrity": "sha512-P9E79dWb4y27eAo/H1M9lQ3l5tKi/SMm4hmoZsEBMd5Z8tYzGeFSOJlzzU6gJf0Ue1OIjg0/RO/f3mcZQe6k2A==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@ariakit/react": "^0.4.10", - "@babel/runtime": "^7.16.0", - "@wordpress/components": "^28.8.11", - "@wordpress/compose": "^7.8.3", - "@wordpress/data": "^10.8.3", - "@wordpress/element": "^6.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/icons": "^10.8.2", - "@wordpress/primitives": "^4.8.1", - "@wordpress/private-apis": "^1.8.1", - "@wordpress/warning": "^3.8.1", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@wordpress/dataviews/-/dataviews-4.13.0.tgz", + "integrity": "sha512-fJyHzNBvI/mivZh5z5+XC3tOSHojNOYVbSA9ifPB6hNcZjFJ+fsNt/I8tmOQdmOOb4dUESkOOKmk6RlPKCjErg==", + "dependencies": { + "@ariakit/react": "^0.4.15", + "@babel/runtime": "7.25.7", + "@wordpress/components": "^29.3.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/icons": "^10.17.0", + "@wordpress/primitives": "^4.17.0", + "@wordpress/private-apis": "^1.17.0", + "@wordpress/warning": "^3.17.0", "clsx": "^2.1.1", "remove-accents": "^0.5.0" }, @@ -7353,13 +7402,12 @@ } }, "node_modules/@wordpress/date": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/@wordpress/date/-/date-5.8.2.tgz", - "integrity": "sha512-ECPE9JXQ0GN+A3ssP+bmEtt122JQnkuXzGOUXfED+kjdmFZ1MgPtyKfXBFDzyW6fPHAwzpSbyFSBXfwxevxWAQ==", - "license": "GPL-2.0-or-later", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/date/-/date-5.17.0.tgz", + "integrity": "sha512-vFi+h+YpiicfDHtp1SKkFmgQR0PI9I76Dqoi7lBP95BPTGC/adQ3u2ee5wGd5uVUlR+ca+TfR6siC4Igau73oA==", "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/deprecated": "^4.8.2", + "@babel/runtime": "7.25.7", + "@wordpress/deprecated": "^4.17.0", "moment": "^2.29.4", "moment-timezone": "^0.5.40" }, @@ -7369,11 +7417,10 @@ } }, "node_modules/@wordpress/dependency-extraction-webpack-plugin": { - "version": "6.8.3", - "resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-6.8.3.tgz", - "integrity": "sha512-2XtMyfX8wacCBK9S808o3NkDdo+qeJgtz6DQhi1nOK6XhIsw/IeSwbZgrTlIzhUk2mQ1N0Y+e3588/dxiS4kBQ==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-6.17.0.tgz", + "integrity": "sha512-aRiYH1lcgxnvo0dvhEd5dxjBiWQokRdzSHFSF5flZ4vmHVvDRSgj5V0CQTuCG4fr77PwEJNjPHOm+s1JbmmQJw==", "dev": true, - "license": "GPL-2.0-or-later", "dependencies": { "json2php": "^0.0.7" }, @@ -7393,13 +7440,12 @@ "license": "BSD" }, "node_modules/@wordpress/deprecated": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-4.8.2.tgz", - "integrity": "sha512-AMO0FeqYfIcQRNzAVYDYHZ6ISdfkPHm8Rt8HQOl0Bg7tWX3ocVYnMULUGg/VzgM8AJzAUrfBpwcXZBMF1g4Xpw==", - "license": "GPL-2.0-or-later", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-4.17.0.tgz", + "integrity": "sha512-7IlFpQ6tNkUbOuuxm6kBCR2R6C9Etlzojgh0ykJ/OmwgRMrosH/m6/zAmaA15oRYpd6dvO7ozJN+ArPz7LSOiQ==", "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/hooks": "^4.8.2" + "@babel/runtime": "7.25.7", + "@wordpress/hooks": "^4.17.0" }, "engines": { "node": ">=18.12.0", @@ -7407,13 +7453,12 @@ } }, "node_modules/@wordpress/dom": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/@wordpress/dom/-/dom-4.8.2.tgz", - "integrity": "sha512-5VZooybouKVkQ6W2+ef7AnAYQG54lkUN8+Kzc7ly84+WL13RbrwfE4Bj9/RFE5Ew59XTfHME0+GzE3fpLNiTYA==", - "license": "GPL-2.0-or-later", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/dom/-/dom-4.17.0.tgz", + "integrity": "sha512-raAeub1L/a2yHd9rwCGs67yDSUsafcpERi9rJCeHiaBE/+h7gZn7Li+Pya+DMk7tGxoIHNpPuGVTAyVhQbjWdQ==", "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/deprecated": "^4.8.2" + "@babel/runtime": "7.25.7", + "@wordpress/deprecated": "^4.17.0" }, "engines": { "node": ">=18.12.0", @@ -7421,12 +7466,11 @@ } }, "node_modules/@wordpress/dom-ready": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-4.8.1.tgz", - "integrity": "sha512-xVMNpOaLzpZS4HFH5yYE3ToOhpsDpV29PoeDzuki18XA+ZPg6SvQ/TmwggMasnI1PoyAcQWxugXMV+YUFGM8Mg==", - "license": "GPL-2.0-or-later", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-4.17.0.tgz", + "integrity": "sha512-u/ocyrPV4MJIKxM1OJg+Q6yOBD0pIYi1jcXE1HVYnc/9Mte0IFlfovYRJj6oGUc7u4dM6AVE2BUCQMJgmG406Q==", "dependencies": { - "@babel/runtime": "^7.16.0" + "@babel/runtime": "7.25.7" }, "engines": { "node": ">=18.12.0", @@ -7434,19 +7478,18 @@ } }, "node_modules/@wordpress/e2e-test-utils": { - "version": "11.8.2", - "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils/-/e2e-test-utils-11.8.2.tgz", - "integrity": "sha512-ddpxERmKzUwBejem0tQweNUlyCXLab0qPwHs+bJwGDzrp75WHW29rb9pQvvem2uLvso7Sw0IfVZaO2+hVXPM+g==", + "version": "11.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils/-/e2e-test-utils-11.17.0.tgz", + "integrity": "sha512-C7PYi/5ALyY+GeRWeTxZLByLxH6yWv+Q1OHoa0fP+cDblwT+jyY0KKBR9DLI3PF4GEBkMT+gc4V55CXFcXIJnQ==", "dev": true, - "license": "GPL-2.0-or-later", "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/api-fetch": "^7.8.2", - "@wordpress/keycodes": "^4.8.2", - "@wordpress/url": "^4.8.1", + "@babel/runtime": "7.25.7", + "@wordpress/api-fetch": "^7.17.0", + "@wordpress/keycodes": "^4.17.0", + "@wordpress/url": "^4.17.0", "change-case": "^4.1.2", "form-data": "^4.0.0", - "node-fetch": "^2.6.0" + "node-fetch": "2.7.0" }, "engines": { "node": ">=18.12.0", @@ -7454,20 +7497,19 @@ }, "peerDependencies": { "jest": ">=29", - "puppeteer-core": ">=11" + "puppeteer-core": ">=23" } }, "node_modules/@wordpress/e2e-test-utils-playwright": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.8.1.tgz", - "integrity": "sha512-BKp2EpC35/SWJg1h69Q0RP7hlcNoqyuq1UA5CJycph2yuzrfl8+tfKqkrdCYhyLU/MuW6GFh9d92vb2cTYnSOQ==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.17.0.tgz", + "integrity": "sha512-KhS+HyduYVHWbB/uHxQUC1wHMACx2BpP+4euMN8Kimy/rIsyOFrav9ueVGn7fHu9wu++swk8nUWFBip3GdsliA==", "dev": true, - "license": "GPL-2.0-or-later", "dependencies": { "change-case": "^4.1.2", "form-data": "^4.0.0", "get-port": "^5.1.1", - "lighthouse": "^10.4.0", + "lighthouse": "^12.2.2", "mime": "^3.0.0", "web-vitals": "^4.2.1" }, @@ -7522,41 +7564,40 @@ } }, "node_modules/@wordpress/edit-post": { - "version": "8.8.18", - "resolved": "https://registry.npmjs.org/@wordpress/edit-post/-/edit-post-8.8.18.tgz", - "integrity": "sha512-1woHpjt0RM4gKrpevaG1Zh6b2Al0biNrGFrIuAK2S71SasLrQuYzx9z3bAs5acCjXhV7VkLkLpK+ERm59256vQ==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^4.8.2", - "@wordpress/api-fetch": "^7.8.2", - "@wordpress/block-editor": "^14.3.15", - "@wordpress/block-library": "^9.8.16", - "@wordpress/blocks": "^13.8.5", - "@wordpress/commands": "^1.8.11", - "@wordpress/components": "^28.8.11", - "@wordpress/compose": "^7.8.3", - "@wordpress/core-commands": "^1.8.15", - "@wordpress/core-data": "^7.8.15", - "@wordpress/data": "^10.8.3", - "@wordpress/deprecated": "^4.8.2", - "@wordpress/dom": "^4.8.2", - "@wordpress/editor": "^14.8.18", - "@wordpress/element": "^6.8.1", - "@wordpress/hooks": "^4.8.2", - "@wordpress/html-entities": "^4.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/icons": "^10.8.2", - "@wordpress/keyboard-shortcuts": "^5.8.3", - "@wordpress/keycodes": "^4.8.2", - "@wordpress/notices": "^5.8.3", - "@wordpress/plugins": "^7.8.11", - "@wordpress/preferences": "^4.8.11", - "@wordpress/private-apis": "^1.8.1", - "@wordpress/url": "^4.8.1", - "@wordpress/viewport": "^6.8.3", - "@wordpress/warning": "^3.8.1", - "@wordpress/widgets": "^4.8.15", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/@wordpress/edit-post/-/edit-post-8.17.1.tgz", + "integrity": "sha512-ig3UlT9soHSBbjxOjTq25I1mI5YuB/7mK3j8hpaAUuv4VR00JMoeDmOOIH7e5xxnNy7Bw3CHQcxvevAzXYmJFg==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/a11y": "^4.17.0", + "@wordpress/api-fetch": "^7.17.0", + "@wordpress/block-editor": "^14.12.0", + "@wordpress/block-library": "^9.17.0", + "@wordpress/blocks": "^14.6.0", + "@wordpress/commands": "^1.17.0", + "@wordpress/components": "^29.3.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/core-commands": "^1.17.0", + "@wordpress/core-data": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/deprecated": "^4.17.0", + "@wordpress/dom": "^4.17.0", + "@wordpress/editor": "^14.17.1", + "@wordpress/element": "^6.17.0", + "@wordpress/hooks": "^4.17.0", + "@wordpress/html-entities": "^4.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/icons": "^10.17.0", + "@wordpress/keyboard-shortcuts": "^5.17.0", + "@wordpress/keycodes": "^4.17.0", + "@wordpress/notices": "^5.17.0", + "@wordpress/plugins": "^7.17.0", + "@wordpress/preferences": "^4.17.0", + "@wordpress/private-apis": "^1.17.0", + "@wordpress/url": "^4.17.0", + "@wordpress/viewport": "^6.17.0", + "@wordpress/warning": "^3.17.0", + "@wordpress/widgets": "^4.17.0", "clsx": "^2.1.1", "memize": "^2.1.0" }, @@ -7570,52 +7611,52 @@ } }, "node_modules/@wordpress/edit-site": { - "version": "6.8.18", - "resolved": "https://registry.npmjs.org/@wordpress/edit-site/-/edit-site-6.8.18.tgz", - "integrity": "sha512-sts/9mPt8u7MJw0+qjbWH1kh39GAT94goVw45FDMQtNB6uNe8HEDe2qoc/ObXATiRtmndEQnteNe+y1Tbbi8Dw==", - "license": "GPL-2.0-or-later", + "version": "6.17.1", + "resolved": "https://registry.npmjs.org/@wordpress/edit-site/-/edit-site-6.17.1.tgz", + "integrity": "sha512-yY9qklGG2y1eXQUq9X3m0zk9OrznS8qB8edzQGLE+GfYVcY2BNVUMakRzYbWRdKqZPdW+WNJ20pz7JMcbieFbw==", "dependencies": { - "@babel/runtime": "^7.16.0", + "@babel/runtime": "7.25.7", "@react-spring/web": "^9.4.5", - "@wordpress/a11y": "^4.8.2", - "@wordpress/api-fetch": "^7.8.2", - "@wordpress/blob": "^4.8.1", - "@wordpress/block-editor": "^14.3.15", - "@wordpress/block-library": "^9.8.16", - "@wordpress/blocks": "^13.8.5", - "@wordpress/commands": "^1.8.11", - "@wordpress/components": "^28.8.11", - "@wordpress/compose": "^7.8.3", - "@wordpress/core-commands": "^1.8.15", - "@wordpress/core-data": "^7.8.15", - "@wordpress/data": "^10.8.3", - "@wordpress/dataviews": "^4.4.11", - "@wordpress/date": "^5.8.2", - "@wordpress/deprecated": "^4.8.2", - "@wordpress/dom": "^4.8.2", - "@wordpress/editor": "^14.8.18", - "@wordpress/element": "^6.8.1", - "@wordpress/escape-html": "^3.8.1", - "@wordpress/hooks": "^4.8.2", - "@wordpress/html-entities": "^4.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/icons": "^10.8.2", - "@wordpress/keyboard-shortcuts": "^5.8.3", - "@wordpress/keycodes": "^4.8.2", - "@wordpress/notices": "^5.8.3", - "@wordpress/patterns": "^2.8.15", - "@wordpress/plugins": "^7.8.11", - "@wordpress/preferences": "^4.8.11", - "@wordpress/primitives": "^4.8.1", - "@wordpress/priority-queue": "^3.8.1", - "@wordpress/private-apis": "^1.8.1", - "@wordpress/reusable-blocks": "^5.8.15", - "@wordpress/router": "^1.8.1", - "@wordpress/style-engine": "^2.8.1", - "@wordpress/url": "^4.8.1", - "@wordpress/viewport": "^6.8.3", - "@wordpress/widgets": "^4.8.15", - "@wordpress/wordcount": "^4.8.1", + "@wordpress/a11y": "^4.17.0", + "@wordpress/api-fetch": "^7.17.0", + "@wordpress/blob": "^4.17.0", + "@wordpress/block-editor": "^14.12.0", + "@wordpress/block-library": "^9.17.0", + "@wordpress/blocks": "^14.6.0", + "@wordpress/commands": "^1.17.0", + "@wordpress/components": "^29.3.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/core-commands": "^1.17.0", + "@wordpress/core-data": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/dataviews": "^4.13.0", + "@wordpress/date": "^5.17.0", + "@wordpress/deprecated": "^4.17.0", + "@wordpress/dom": "^4.17.0", + "@wordpress/editor": "^14.17.1", + "@wordpress/element": "^6.17.0", + "@wordpress/escape-html": "^3.17.0", + "@wordpress/fields": "^0.9.0", + "@wordpress/hooks": "^4.17.0", + "@wordpress/html-entities": "^4.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/icons": "^10.17.0", + "@wordpress/keyboard-shortcuts": "^5.17.0", + "@wordpress/keycodes": "^4.17.0", + "@wordpress/media-utils": "^5.17.0", + "@wordpress/notices": "^5.17.0", + "@wordpress/patterns": "^2.17.0", + "@wordpress/plugins": "^7.17.0", + "@wordpress/preferences": "^4.17.0", + "@wordpress/primitives": "^4.17.0", + "@wordpress/private-apis": "^1.17.0", + "@wordpress/reusable-blocks": "^5.17.0", + "@wordpress/router": "^1.17.0", + "@wordpress/style-engine": "^2.17.0", + "@wordpress/url": "^4.17.0", + "@wordpress/viewport": "^6.17.0", + "@wordpress/widgets": "^4.17.0", + "@wordpress/wordcount": "^4.17.0", "change-case": "^4.1.2", "clsx": "^2.1.1", "colord": "^2.9.2", @@ -7633,38 +7674,37 @@ } }, "node_modules/@wordpress/edit-widgets": { - "version": "6.8.16", - "resolved": "https://registry.npmjs.org/@wordpress/edit-widgets/-/edit-widgets-6.8.16.tgz", - "integrity": "sha512-uMLnmoi2anx3n/EKPHUKvuxYlOzhRIm3j2+BicI8nthR9cxAvXkmC9Z7QdaCgleGaxDQPD61Q0KsuFFHJtQWWQ==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/api-fetch": "^7.8.2", - "@wordpress/block-editor": "^14.3.15", - "@wordpress/block-library": "^9.8.16", - "@wordpress/blocks": "^13.8.5", - "@wordpress/components": "^28.8.11", - "@wordpress/compose": "^7.8.3", - "@wordpress/core-data": "^7.8.15", - "@wordpress/data": "^10.8.3", - "@wordpress/deprecated": "^4.8.2", - "@wordpress/dom": "^4.8.2", - "@wordpress/element": "^6.8.1", - "@wordpress/hooks": "^4.8.2", - "@wordpress/i18n": "^5.8.2", - "@wordpress/icons": "^10.8.2", - "@wordpress/interface": "^6.8.11", - "@wordpress/keyboard-shortcuts": "^5.8.3", - "@wordpress/keycodes": "^4.8.2", - "@wordpress/media-utils": "^5.8.2", - "@wordpress/notices": "^5.8.3", - "@wordpress/patterns": "^2.8.15", - "@wordpress/plugins": "^7.8.11", - "@wordpress/preferences": "^4.8.11", - "@wordpress/private-apis": "^1.8.1", - "@wordpress/reusable-blocks": "^5.8.15", - "@wordpress/url": "^4.8.1", - "@wordpress/widgets": "^4.8.15", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/edit-widgets/-/edit-widgets-6.17.0.tgz", + "integrity": "sha512-uOs1UfXByxPIgMLJU7Y5d4CpsdBUDyxDXbEyfTsOCxX8r4Z+AgR/dKACmmYNJLQgwkjvt6ZTpltN7Y0A4VnwYg==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/api-fetch": "^7.17.0", + "@wordpress/block-editor": "^14.12.0", + "@wordpress/block-library": "^9.17.0", + "@wordpress/blocks": "^14.6.0", + "@wordpress/components": "^29.3.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/core-data": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/deprecated": "^4.17.0", + "@wordpress/dom": "^4.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/hooks": "^4.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/icons": "^10.17.0", + "@wordpress/interface": "^9.2.0", + "@wordpress/keyboard-shortcuts": "^5.17.0", + "@wordpress/keycodes": "^4.17.0", + "@wordpress/media-utils": "^5.17.0", + "@wordpress/notices": "^5.17.0", + "@wordpress/patterns": "^2.17.0", + "@wordpress/plugins": "^7.17.0", + "@wordpress/preferences": "^4.17.0", + "@wordpress/private-apis": "^1.17.0", + "@wordpress/reusable-blocks": "^5.17.0", + "@wordpress/url": "^4.17.0", + "@wordpress/widgets": "^4.17.0", "clsx": "^2.1.1" }, "engines": { @@ -7677,47 +7717,46 @@ } }, "node_modules/@wordpress/editor": { - "version": "14.8.18", - "resolved": "https://registry.npmjs.org/@wordpress/editor/-/editor-14.8.18.tgz", - "integrity": "sha512-haVx9RynZ+b4pvoVGkCoAJ1IT1drBVX/4cOZmlgRZyGLRi083HjricxKXsNlczTGbWHfXcUiJsTTZ1BMNUCWYg==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^4.8.2", - "@wordpress/api-fetch": "^7.8.2", - "@wordpress/blob": "^4.8.1", - "@wordpress/block-editor": "^14.3.15", - "@wordpress/blocks": "^13.8.5", - "@wordpress/commands": "^1.8.11", - "@wordpress/components": "^28.8.11", - "@wordpress/compose": "^7.8.3", - "@wordpress/core-data": "^7.8.15", - "@wordpress/data": "^10.8.3", - "@wordpress/dataviews": "^4.4.11", - "@wordpress/date": "^5.8.2", - "@wordpress/deprecated": "^4.8.2", - "@wordpress/dom": "^4.8.2", - "@wordpress/element": "^6.8.1", - "@wordpress/fields": "^0.0.16", - "@wordpress/hooks": "^4.8.2", - "@wordpress/html-entities": "^4.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/icons": "^10.8.2", - "@wordpress/interface": "^6.8.11", - "@wordpress/keyboard-shortcuts": "^5.8.3", - "@wordpress/keycodes": "^4.8.2", - "@wordpress/media-utils": "^5.8.2", - "@wordpress/notices": "^5.8.3", - "@wordpress/patterns": "^2.8.15", - "@wordpress/plugins": "^7.8.11", - "@wordpress/preferences": "^4.8.11", - "@wordpress/private-apis": "^1.8.1", - "@wordpress/reusable-blocks": "^5.8.15", - "@wordpress/rich-text": "^7.8.3", - "@wordpress/server-side-render": "^5.8.11", - "@wordpress/url": "^4.8.1", - "@wordpress/warning": "^3.8.1", - "@wordpress/wordcount": "^4.8.1", + "version": "14.17.1", + "resolved": "https://registry.npmjs.org/@wordpress/editor/-/editor-14.17.1.tgz", + "integrity": "sha512-z6LknQhWhof+23qjHu4dgY1EZyMmMUHynZxJlioDAvnvjSzyIcoF3Wirw+MMAaRVb5J8RjksQ+ROvDsKpWo1Pg==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/a11y": "^4.17.0", + "@wordpress/api-fetch": "^7.17.0", + "@wordpress/blob": "^4.17.0", + "@wordpress/block-editor": "^14.12.0", + "@wordpress/blocks": "^14.6.0", + "@wordpress/commands": "^1.17.0", + "@wordpress/components": "^29.3.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/core-data": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/dataviews": "^4.13.0", + "@wordpress/date": "^5.17.0", + "@wordpress/deprecated": "^4.17.0", + "@wordpress/dom": "^4.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/fields": "^0.9.0", + "@wordpress/hooks": "^4.17.0", + "@wordpress/html-entities": "^4.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/icons": "^10.17.0", + "@wordpress/interface": "^9.2.0", + "@wordpress/keyboard-shortcuts": "^5.17.0", + "@wordpress/keycodes": "^4.17.0", + "@wordpress/media-utils": "^5.17.0", + "@wordpress/notices": "^5.17.0", + "@wordpress/patterns": "^2.17.0", + "@wordpress/plugins": "^7.17.0", + "@wordpress/preferences": "^4.17.0", + "@wordpress/private-apis": "^1.17.0", + "@wordpress/reusable-blocks": "^5.17.0", + "@wordpress/rich-text": "^7.17.0", + "@wordpress/server-side-render": "^5.17.0", + "@wordpress/url": "^4.17.0", + "@wordpress/warning": "^3.17.0", + "@wordpress/wordcount": "^4.17.0", "change-case": "^4.1.2", "client-zip": "^2.4.5", "clsx": "^2.1.1", @@ -7747,21 +7786,19 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/@wordpress/element": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-6.8.1.tgz", - "integrity": "sha512-JUd0XUHjNtQexAUJq5TodweU9kooCdrh/3NlKj8jEMKgveDx+ipXN2zVsaJWzAcu50FBhegaL+hFH6XRtqEDdQ==", - "license": "GPL-2.0-or-later", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-6.17.0.tgz", + "integrity": "sha512-mRLFDPmZiI3+POi/iUGoof/9fQi4YTJ/RAuIUipr7yG7l4SwOoQy4eSJy6QTyqtJxZ+/7qA+b/+Ek15UzFst5Q==", "dependencies": { - "@babel/runtime": "^7.16.0", + "@babel/runtime": "7.25.7", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.25", - "@wordpress/escape-html": "^3.8.1", + "@wordpress/escape-html": "^3.17.0", "change-case": "^4.1.2", "is-plain-object": "^5.0.0", "react": "^18.3.0", @@ -7773,12 +7810,11 @@ } }, "node_modules/@wordpress/escape-html": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-3.8.1.tgz", - "integrity": "sha512-JFOjsD6rSFVoFqK+f5YCeYmRycn7Hj29cX3+sBXL0p5Uox7SQLhY/rmATm6o/PiGCVtDeQlZ9I8dBeQSZBoXqQ==", - "license": "GPL-2.0-or-later", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-3.17.0.tgz", + "integrity": "sha512-yOfJwgmrtIXQDwX6zTC0L7ymYBXz3K3hlW0nDdtYy+bCw5z0gbrEOnBotOD6YdXlejAgnaAH+K1VSf0xxG5uGA==", "dependencies": { - "@babel/runtime": "^7.16.0" + "@babel/runtime": "7.25.7" }, "engines": { "node": ">=18.12.0", @@ -7786,20 +7822,20 @@ } }, "node_modules/@wordpress/eslint-plugin": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-21.1.2.tgz", - "integrity": "sha512-f89Q8J1yGq6b1Myqgby7Xdon+mx/YjSBCs3/saydaJWJoXaDIXZFTMrY0cjWzbSOTDThYCvbkvQm0QGAPanNTA==", + "version": "22.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-22.3.0.tgz", + "integrity": "sha512-EG8PvRceycpn9B5UniHRJSwitTwWwqtsF+gcg+BOT/tU/dmMaDTRqQdXnPOhw10Qg+QKqvBEl6IT+yRwTP5rsA==", "dev": true, "dependencies": { - "@babel/eslint-parser": "^7.16.0", + "@babel/eslint-parser": "7.25.7", "@typescript-eslint/eslint-plugin": "^6.4.1", "@typescript-eslint/parser": "^6.4.1", - "@wordpress/babel-preset-default": "^8.8.2", - "@wordpress/prettier-config": "^4.8.1", + "@wordpress/babel-preset-default": "^8.17.0", + "@wordpress/prettier-config": "^4.17.0", "cosmiconfig": "^7.0.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-import": "^2.25.2", - "eslint-plugin-jest": "^27.2.3", + "eslint-plugin-jest": "^27.4.3", "eslint-plugin-jsdoc": "^46.4.6", "eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-playwright": "^0.15.3", @@ -7817,7 +7853,7 @@ "@babel/core": ">=7", "eslint": ">=8", "prettier": ">=3", - "typescript": ">=4" + "typescript": ">=5" }, "peerDependenciesMeta": { "prettier": { @@ -7844,32 +7880,38 @@ } }, "node_modules/@wordpress/fields": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/@wordpress/fields/-/fields-0.0.16.tgz", - "integrity": "sha512-FeziO0mS67FCiZ/uNGwRHSbcOSHVVtE7PbO6ZfKStO6APxJSisF+eubimj4l6O8wHgDmaevPPfFBzghn6m39Tw==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/blob": "^4.8.1", - "@wordpress/blocks": "^13.8.5", - "@wordpress/components": "^28.8.11", - "@wordpress/compose": "^7.8.3", - "@wordpress/core-data": "^7.8.15", - "@wordpress/data": "^10.8.3", - "@wordpress/dataviews": "^4.4.11", - "@wordpress/element": "^6.8.1", - "@wordpress/hooks": "^4.8.2", - "@wordpress/html-entities": "^4.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/icons": "^10.8.2", - "@wordpress/notices": "^5.8.3", - "@wordpress/patterns": "^2.8.15", - "@wordpress/primitives": "^4.8.1", - "@wordpress/private-apis": "^1.8.1", - "@wordpress/url": "^4.8.1", - "@wordpress/warning": "^3.8.1", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@wordpress/fields/-/fields-0.9.0.tgz", + "integrity": "sha512-PgfXdLu22ZKSz4Ro9sDrKjINS0nCLb4EOLGhyN7RxuXXVW9v+UAhnIX/WCpzoixRX5s7uycDbntt5fklfCTiVg==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/api-fetch": "^7.17.0", + "@wordpress/blob": "^4.17.0", + "@wordpress/block-editor": "^14.12.0", + "@wordpress/blocks": "^14.6.0", + "@wordpress/components": "^29.3.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/core-data": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/dataviews": "^4.13.0", + "@wordpress/date": "^5.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/hooks": "^4.17.0", + "@wordpress/html-entities": "^4.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/icons": "^10.17.0", + "@wordpress/media-utils": "^5.17.0", + "@wordpress/notices": "^5.17.0", + "@wordpress/patterns": "^2.17.0", + "@wordpress/primitives": "^4.17.0", + "@wordpress/private-apis": "^1.17.0", + "@wordpress/router": "^1.17.0", + "@wordpress/url": "^4.17.0", + "@wordpress/warning": "^3.17.0", "change-case": "4.1.2", - "client-zip": "^2.4.5" + "client-zip": "^2.4.5", + "clsx": "2.1.1", + "remove-accents": "^0.5.0" }, "engines": { "node": ">=18.12.0", @@ -7880,24 +7922,23 @@ } }, "node_modules/@wordpress/format-library": { - "version": "5.8.15", - "resolved": "https://registry.npmjs.org/@wordpress/format-library/-/format-library-5.8.15.tgz", - "integrity": "sha512-Qp6OFwiHSb6qrluvFOaNlsoElUj1L6YMF6oAq/fBLq4UX2KANkV1UkTNN8Lo/iCe48Za+DxLle8nCa9Gt0XdDg==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^4.8.2", - "@wordpress/block-editor": "^14.3.15", - "@wordpress/components": "^28.8.11", - "@wordpress/compose": "^7.8.3", - "@wordpress/data": "^10.8.3", - "@wordpress/element": "^6.8.1", - "@wordpress/html-entities": "^4.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/icons": "^10.8.2", - "@wordpress/private-apis": "^1.8.1", - "@wordpress/rich-text": "^7.8.3", - "@wordpress/url": "^4.8.1" + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/format-library/-/format-library-5.17.0.tgz", + "integrity": "sha512-+VQO5MtidlGwkR29KIssditpG5E25u4K9L4+STo+NKR5l0ldqa6PgIcu1LJlVzzqAOvbgmGwPLh7O5Oa+XqAww==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/a11y": "^4.17.0", + "@wordpress/block-editor": "^14.12.0", + "@wordpress/components": "^29.3.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/html-entities": "^4.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/icons": "^10.17.0", + "@wordpress/private-apis": "^1.17.0", + "@wordpress/rich-text": "^7.17.0", + "@wordpress/url": "^4.17.0" }, "engines": { "node": ">=18.12.0", @@ -7909,12 +7950,11 @@ } }, "node_modules/@wordpress/hooks": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-4.8.2.tgz", - "integrity": "sha512-BhhYJB/RFIng6Taydah6zCMd9iDYdSlISvByP9tBDsuHZL6iuVBmEGBXmm0Mt6ABCFHELuhFkxwdWPRjWTiqSw==", - "license": "GPL-2.0-or-later", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-4.17.0.tgz", + "integrity": "sha512-LGOHGuwCXCevuzaFpM2sgyPZxf3H7tWaSKzlvDzx2kmwiWIrFug/yebywv4Cxsl82I5DfZkDpxXRpqTxXrC0Nw==", "dependencies": { - "@babel/runtime": "^7.16.0" + "@babel/runtime": "7.25.7" }, "engines": { "node": ">=18.12.0", @@ -7922,12 +7962,11 @@ } }, "node_modules/@wordpress/html-entities": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/html-entities/-/html-entities-4.8.1.tgz", - "integrity": "sha512-JOiXUdts9PvanVj3cuPlzJop6UBMDApzLRWRLeZNjZPq0IsTGcI7zPhBVT++aW1C8zTzngzpdFfFaWle3p5w7Q==", - "license": "GPL-2.0-or-later", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/html-entities/-/html-entities-4.17.0.tgz", + "integrity": "sha512-8cVD8KTxsKLHA9r6Lt3fkQoNBUQ6zMWdgaK1VNRYRJgTfx8C6FlNBjvHrIIgS0nJ43k9iAmAObGQiL3GkGVI1g==", "dependencies": { - "@babel/runtime": "^7.16.0" + "@babel/runtime": "7.25.7" }, "engines": { "node": ">=18.12.0", @@ -7935,13 +7974,12 @@ } }, "node_modules/@wordpress/i18n": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-5.8.2.tgz", - "integrity": "sha512-evcwjw1cfGoyJoPMZlaYNwmYJAlIJh5pkgM1QWanpBPTMLsMOMcpZQGzOwvKf1uLozGOKkBAe106qQ7rgjZkoQ==", - "license": "GPL-2.0-or-later", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-5.17.0.tgz", + "integrity": "sha512-aAsYls8sTTSEimsvjxBl9mCYbZYD3BddHVpuHgbBxzC+2SZE+JYJ+IpcwEghC712qo0jEkG8Vdzhqae1PL6vCQ==", "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/hooks": "^4.8.2", + "@babel/runtime": "7.25.7", + "@wordpress/hooks": "^4.17.0", "gettext-parser": "^1.3.1", "memize": "^2.1.0", "sprintf-js": "^1.1.1", @@ -7956,14 +7994,13 @@ } }, "node_modules/@wordpress/icons": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-10.8.2.tgz", - "integrity": "sha512-ebJ3mRJo3bMgPm9vSTxc7I98HT30mgU59WGUAQyx31cElKbzMhd3jM7bD2JhYXZ1OPnJGY3W4lHovMFfU7wsOQ==", - "license": "GPL-2.0-or-later", + "version": "10.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-10.17.0.tgz", + "integrity": "sha512-qzWFrMfa5HZdGxGq7I+s9bmUJqZrFfx6ow/slY1USKJqp1uRHRekAbq6UrOrJscs8rSUQiV/aNNPDgSfqBEM6A==", "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/element": "^6.8.1", - "@wordpress/primitives": "^4.8.1" + "@babel/runtime": "7.25.7", + "@wordpress/element": "^6.17.0", + "@wordpress/primitives": "^4.17.0" }, "engines": { "node": ">=18.12.0", @@ -7971,13 +8008,12 @@ } }, "node_modules/@wordpress/interactivity": { - "version": "6.8.5", - "resolved": "https://registry.npmjs.org/@wordpress/interactivity/-/interactivity-6.8.5.tgz", - "integrity": "sha512-uCLcjYyNzn0KndbGr4ZtOOhogKieTMeH29/j3zK5Bu3pxsS5IxL6Ankanh+u7qkhXTND0AkZJmES7G+Z5DOIzg==", - "license": "GPL-2.0-or-later", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/interactivity/-/interactivity-6.17.0.tgz", + "integrity": "sha512-lhDqh0iyfG6DXwYXfg4u0EP9EofRBiVt7Lszn1LIgFFuThHBDyNgePKW6WxZhW9Nrwq9pan7gvCWIx6IKZkg8Q==", "dependencies": { - "@preact/signals": "^1.2.2", - "preact": "^10.19.3" + "@preact/signals": "^1.3.0", + "preact": "^10.24.2" }, "engines": { "node": ">=18.12.0", @@ -7985,13 +8021,12 @@ } }, "node_modules/@wordpress/interactivity-router": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/@wordpress/interactivity-router/-/interactivity-router-2.8.6.tgz", - "integrity": "sha512-3GO9v9im1K7PNjCvr/0dOl3IQZ3RpMxUb3Y41M348Su3R8uNawA85c+9ZdyxYUG91/0atHdehErFiVt45IToYA==", - "license": "GPL-2.0-or-later", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/interactivity-router/-/interactivity-router-2.17.0.tgz", + "integrity": "sha512-yKx6/pnSJl/CTBX1mEutDc3N96GZhV7ULLGv+XJAPo43b4e4leYBA0o4ua4jKLVILueygJl76Ziwtzj0mD0ZtQ==", "dependencies": { - "@wordpress/a11y": "^4.8.2", - "@wordpress/interactivity": "^6.8.5" + "@wordpress/a11y": "^4.17.0", + "@wordpress/interactivity": "^6.17.0" }, "engines": { "node": ">=18.12.0", @@ -7999,24 +8034,22 @@ } }, "node_modules/@wordpress/interface": { - "version": "6.8.11", - "resolved": "https://registry.npmjs.org/@wordpress/interface/-/interface-6.8.11.tgz", - "integrity": "sha512-h10OXs44nkAduPa1ZGOfcdg2JRaTE62d5JwNDYeNwyjFBqLmQknGsSeDS677M/DYvX/AMcseaEObRZv7U8zjQQ==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^4.8.2", - "@wordpress/components": "^28.8.11", - "@wordpress/compose": "^7.8.3", - "@wordpress/data": "^10.8.3", - "@wordpress/deprecated": "^4.8.2", - "@wordpress/element": "^6.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/icons": "^10.8.2", - "@wordpress/plugins": "^7.8.11", - "@wordpress/preferences": "^4.8.11", - "@wordpress/private-apis": "^1.8.1", - "@wordpress/viewport": "^6.8.3", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@wordpress/interface/-/interface-9.2.0.tgz", + "integrity": "sha512-WO4aWZYFlrqchKpgWttK9PB4xIicdatp4cUX7Diw3b/Zltq4+aE+DddTDeRvqLoi+NdgPlJK/tNxBaU4UoiBlQ==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/a11y": "^4.17.0", + "@wordpress/components": "^29.3.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/deprecated": "^4.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/icons": "^10.17.0", + "@wordpress/plugins": "^7.17.0", + "@wordpress/preferences": "^4.17.0", + "@wordpress/viewport": "^6.17.0", "clsx": "^2.1.1" }, "engines": { @@ -8029,12 +8062,11 @@ } }, "node_modules/@wordpress/is-shallow-equal": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-5.8.1.tgz", - "integrity": "sha512-2UpGvp+y7pCxQQoNyb5PIYPptZZjfcR80evR/V/0Abyxde+N0dEJHroiOd+Nm1BJJijzhmMH1B7AlyGqnKaFXA==", - "license": "GPL-2.0-or-later", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-5.17.0.tgz", + "integrity": "sha512-PRykD6MgDkptKsKwETjNHiQUVtaegXkREX6UetN1iL6u+2la4XC/naDHByq7TL+Cg4snyR+PlNdw45Y4dgMf5w==", "dependencies": { - "@babel/runtime": "^7.16.0" + "@babel/runtime": "7.25.7" }, "engines": { "node": ">=18.12.0", @@ -8042,12 +8074,12 @@ } }, "node_modules/@wordpress/jest-console": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-8.8.1.tgz", - "integrity": "sha512-TjSQ/jhtT5f1r8NFpP4pjdtambOd4yyyjwG35av+DqXOr8zz68zYZhzxqIy24jmrZGa5KaaOMvBa8q7G7BHcMw==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-8.17.0.tgz", + "integrity": "sha512-PksPaHIQN+gHycF+S4b4PcZ35xRef2nRo+sBJXolnAWhKi93IrBENFDHwdyaD7gVe7t8qJlXYd7vaF8A6Tqn2g==", "dev": true, "dependencies": { - "@babel/runtime": "^7.16.0", + "@babel/runtime": "7.25.7", "jest-matcher-utils": "^29.6.2" }, "engines": { @@ -8059,13 +8091,13 @@ } }, "node_modules/@wordpress/jest-preset-default": { - "version": "12.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-12.8.1.tgz", - "integrity": "sha512-mnusLFJKz3rEuehy09yQqiwX9fpV4HK1Gh2/hu85DvwjtbHbJajfTW4GjRYU0WEkrGJkQhon6nfC7lGu5nVvkA==", + "version": "12.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-12.17.0.tgz", + "integrity": "sha512-T5LWyi2VEiYjW2RQwajRuHeSNeI2cXKX+OJzDb9+RwIhD3316ghcExynGNmpT2Umo9mvNjWBpD57EPwQAOdR1w==", "dev": true, "dependencies": { - "@wordpress/jest-console": "^8.8.1", - "babel-jest": "^29.6.2" + "@wordpress/jest-console": "^8.17.0", + "babel-jest": "29.7.0" }, "engines": { "node": ">=18.12.0", @@ -8077,15 +8109,14 @@ } }, "node_modules/@wordpress/keyboard-shortcuts": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/@wordpress/keyboard-shortcuts/-/keyboard-shortcuts-5.8.3.tgz", - "integrity": "sha512-V8HUZ63/6hronEBO0dQmYxlk7aSM7+fawTDLrqHfMhqi75GWrwhztWSb2Xju0J7rOvSVO7Oc5gk+JX+ZvniWqA==", - "license": "GPL-2.0-or-later", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/keyboard-shortcuts/-/keyboard-shortcuts-5.17.0.tgz", + "integrity": "sha512-XQbtiTSq6rsP/5KYMMDCmZegABlqcq7IpLtymrbeQNSPjyAP4aflU0rCcNWaXhBbdWWDRmaU9u/X1/fI5wGxUQ==", "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/data": "^10.8.3", - "@wordpress/element": "^6.8.1", - "@wordpress/keycodes": "^4.8.2" + "@babel/runtime": "7.25.7", + "@wordpress/data": "^10.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/keycodes": "^4.17.0" }, "engines": { "node": ">=18.12.0", @@ -8096,13 +8127,12 @@ } }, "node_modules/@wordpress/keycodes": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-4.8.2.tgz", - "integrity": "sha512-BxZD5tk4sDHywV7HOF/hSY924ToW7YJe6hDh4yv+7vo5LpiYQq+/uW21hyXrWEjGXZtdmT1tx69wR16BG35bYw==", - "license": "GPL-2.0-or-later", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-4.17.0.tgz", + "integrity": "sha512-6aZ28uoCmzjXONpRVtDPjevkw834fhIRBnn2KQdzENMnPiQCNbiG71mPNxkTw1yRHRRT5ptHvOe49ztWm9KMcA==", "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/i18n": "^5.8.2" + "@babel/runtime": "7.25.7", + "@wordpress/i18n": "^5.17.0" }, "engines": { "node": ">=18.12.0", @@ -8110,18 +8140,17 @@ } }, "node_modules/@wordpress/list-reusable-blocks": { - "version": "5.8.11", - "resolved": "https://registry.npmjs.org/@wordpress/list-reusable-blocks/-/list-reusable-blocks-5.8.11.tgz", - "integrity": "sha512-VDWVVo2L+d0RP6kRz3qDNUHRWchQTPBfe9JXLlIfPfJYRfUyPKXc3wTOAGnfZD0qip8FzD/AIKsiLSht0NItfw==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/api-fetch": "^7.8.2", - "@wordpress/blob": "^4.8.1", - "@wordpress/components": "^28.8.11", - "@wordpress/compose": "^7.8.3", - "@wordpress/element": "^6.8.1", - "@wordpress/i18n": "^5.8.2", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/list-reusable-blocks/-/list-reusable-blocks-5.17.0.tgz", + "integrity": "sha512-VMDym1RCnPCiurPq70oGNKbBjivXUe84sHU0YRXst2th89jmdVpuuowxSHf+Q/6XtBp4SNTn+FwbhPyhXpBSaA==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/api-fetch": "^7.17.0", + "@wordpress/blob": "^4.17.0", + "@wordpress/components": "^29.3.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/i18n": "^5.17.0", "change-case": "^4.1.2" }, "engines": { @@ -8134,16 +8163,16 @@ } }, "node_modules/@wordpress/media-utils": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/@wordpress/media-utils/-/media-utils-5.8.2.tgz", - "integrity": "sha512-r8C9WapBHkoLPOU9so3Ocdo17xHwJ43EfXckc47c9Wvu9Gn3CulkZWSvnIMeQLcm1Ay/PBBRu2Vxim5PNCaTpg==", - "license": "GPL-2.0-or-later", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/media-utils/-/media-utils-5.17.0.tgz", + "integrity": "sha512-AyTz5C0NxZ69v+rQ3I/g7cPBa9DL8+pBufHZ5Ewz47q6hwSSb3j8+xTgfl/ndKCc/Taqvr4Sgd4QijOUR+iQ3A==", "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/api-fetch": "^7.8.2", - "@wordpress/blob": "^4.8.1", - "@wordpress/element": "^6.8.1", - "@wordpress/i18n": "^5.8.2" + "@babel/runtime": "7.25.7", + "@wordpress/api-fetch": "^7.17.0", + "@wordpress/blob": "^4.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/private-apis": "^1.17.0" }, "engines": { "node": ">=18.12.0", @@ -8151,14 +8180,13 @@ } }, "node_modules/@wordpress/notices": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/@wordpress/notices/-/notices-5.8.3.tgz", - "integrity": "sha512-k2I6vS4y3OvaDIGGO5B94up7uQqpO0Vtykz7rvez0+nXJazYylKNv88zsegyjf74bWhhJ3HpfiDl+JVehwHnxw==", - "license": "GPL-2.0-or-later", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/notices/-/notices-5.17.0.tgz", + "integrity": "sha512-1qsRcxE2dnvIJO9IQHnK9D/U/RgRmccDhbNrBxcgOqEVHTFwDambuxte4JXOmJZVr+uqh8Z3ggr+4H6zCjs/9Q==", "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^4.8.2", - "@wordpress/data": "^10.8.3" + "@babel/runtime": "7.25.7", + "@wordpress/a11y": "^4.17.0", + "@wordpress/data": "^10.17.0" }, "engines": { "node": ">=18.12.0", @@ -8169,9 +8197,9 @@ } }, "node_modules/@wordpress/npm-package-json-lint-config": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-5.8.1.tgz", - "integrity": "sha512-TmY5u6b2w9XKYw/DCF7xFwH45mxVqZk0UcLkrNFpldqe4gjKv46CWpyC7EAD4mMh+atMWqD1llf5uEp5l29qUg==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-5.17.0.tgz", + "integrity": "sha512-j5G1/baTcd9YYwzPVBSsT6XlFMeKELxwIYsmtrv7p49WiygPlHt6Rz6aLpym6L7BRaJ64mqG2/dY5KcEYdoCTg==", "dev": true, "engines": { "node": ">=18.12.0", @@ -8182,19 +8210,18 @@ } }, "node_modules/@wordpress/nux": { - "version": "9.8.11", - "resolved": "https://registry.npmjs.org/@wordpress/nux/-/nux-9.8.11.tgz", - "integrity": "sha512-e2H4PU0tDha/Hm38cZi6nf3niaiV/yF0K20Qm5AA5wmLk3AtOd9lxxedsDPjwbAXMHWIUWvasG9Zwyn2mGCpdA==", - "license": "GPL-2.0-or-later", + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/nux/-/nux-9.17.0.tgz", + "integrity": "sha512-zSqOOAsUydhUfDOoxR9fYibQ6Zlz0FJNBO51W5/9p2DvtnuoC3aZACgcuU5Hzktyku2CNR6Mep7lB+F0Axem4w==", "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/components": "^28.8.11", - "@wordpress/compose": "^7.8.3", - "@wordpress/data": "^10.8.3", - "@wordpress/deprecated": "^4.8.2", - "@wordpress/element": "^6.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/icons": "^10.8.2" + "@babel/runtime": "7.25.7", + "@wordpress/components": "^29.3.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/deprecated": "^4.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/icons": "^10.17.0" }, "engines": { "node": ">=18.12.0", @@ -8206,26 +8233,25 @@ } }, "node_modules/@wordpress/patterns": { - "version": "2.8.15", - "resolved": "https://registry.npmjs.org/@wordpress/patterns/-/patterns-2.8.15.tgz", - "integrity": "sha512-BrZVtcbFYAVZKbRR3s55VwvOudwoTbjsQiex3JDkJSdb9fs6wP4OBQAxw+NHGEP+9Cvo65PqHWpCqWkFTl40/Q==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^4.8.2", - "@wordpress/block-editor": "^14.3.15", - "@wordpress/blocks": "^13.8.5", - "@wordpress/components": "^28.8.11", - "@wordpress/compose": "^7.8.3", - "@wordpress/core-data": "^7.8.15", - "@wordpress/data": "^10.8.3", - "@wordpress/element": "^6.8.1", - "@wordpress/html-entities": "^4.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/icons": "^10.8.2", - "@wordpress/notices": "^5.8.3", - "@wordpress/private-apis": "^1.8.1", - "@wordpress/url": "^4.8.1" + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/patterns/-/patterns-2.17.0.tgz", + "integrity": "sha512-NPTYVeBVl7+wcXDP1YJbubVYo3xroExrgbWsH6kpl4sK6f7ZvCa7Ka/Na8WL0MXJbhhpw3S+zeUL8QOxKKeWGg==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/a11y": "^4.17.0", + "@wordpress/block-editor": "^14.12.0", + "@wordpress/blocks": "^14.6.0", + "@wordpress/components": "^29.3.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/core-data": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/html-entities": "^4.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/icons": "^10.17.0", + "@wordpress/notices": "^5.17.0", + "@wordpress/private-apis": "^1.17.0", + "@wordpress/url": "^4.17.0" }, "engines": { "node": ">=18.12.0", @@ -8237,18 +8263,18 @@ } }, "node_modules/@wordpress/plugins": { - "version": "7.8.11", - "resolved": "https://registry.npmjs.org/@wordpress/plugins/-/plugins-7.8.11.tgz", - "integrity": "sha512-iNzNZh1eqCn3NpZZ7/Oo/vaazaXFOSvUGPaOecGvQcMBxh22phnVgq1ZdEAU6QG73bYZAn3kPu7sfOtrpDkLQQ==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/components": "^28.8.11", - "@wordpress/compose": "^7.8.3", - "@wordpress/element": "^6.8.1", - "@wordpress/hooks": "^4.8.2", - "@wordpress/icons": "^10.8.2", - "@wordpress/is-shallow-equal": "^5.8.1", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/plugins/-/plugins-7.17.0.tgz", + "integrity": "sha512-CoVDWqUq3gXiv8TFJz+vFvTuAvbq2h0Ct8ciH+tGi7SykhA35GqnCcfR/aKDOlAXHGpD0vwxV0iv08kmhIVQ/A==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/components": "^29.3.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/deprecated": "^4.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/hooks": "^4.17.0", + "@wordpress/icons": "^10.17.0", + "@wordpress/is-shallow-equal": "^5.17.0", "memize": "^2.0.1" }, "engines": { @@ -8261,14 +8287,13 @@ } }, "node_modules/@wordpress/postcss-plugins-preset": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-5.9.0.tgz", - "integrity": "sha512-OOK5UU2CG+9ilzo1b8ySwVvtZddF+q+PTTFHcxFrcK23sg5XT1DCBm3WU7bSfzOBF2cd4FIVOFVpwvb07mn8Iw==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-5.17.0.tgz", + "integrity": "sha512-mpEPYNOC1PgQMFalIcp4rdlvMf3/Gppvn2NWzxPIoIxA/AYJEbwZ4ctPIbioXIWaubM1UizC6Z8+7S2huLsfUw==", "dev": true, - "license": "GPL-2.0-or-later", "dependencies": { - "@wordpress/base-styles": "^5.9.0", - "autoprefixer": "^10.2.5" + "@wordpress/base-styles": "^5.17.0", + "autoprefixer": "^10.4.20" }, "engines": { "node": ">=18.12.0", @@ -8279,21 +8304,20 @@ } }, "node_modules/@wordpress/preferences": { - "version": "4.8.11", - "resolved": "https://registry.npmjs.org/@wordpress/preferences/-/preferences-4.8.11.tgz", - "integrity": "sha512-5P84OWcfTmEHCE8ocHqmU7wj/F8osQmprP3gtLRYSmffw9hw7kWlSlG8Z3kErmS1jVQWfDZPRs2CoEIRNE93LA==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^4.8.2", - "@wordpress/components": "^28.8.11", - "@wordpress/compose": "^7.8.3", - "@wordpress/data": "^10.8.3", - "@wordpress/deprecated": "^4.8.2", - "@wordpress/element": "^6.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/icons": "^10.8.2", - "@wordpress/private-apis": "^1.8.1", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/preferences/-/preferences-4.17.0.tgz", + "integrity": "sha512-jNyHhuar2RflBJ9JqGs0ZQXnU86URCQXlR4syXzZdVU75Sm1fPByqKDtR9/F/bWnPxLlU1uP89SKv54kGpSM4Q==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/a11y": "^4.17.0", + "@wordpress/components": "^29.3.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/deprecated": "^4.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/icons": "^10.17.0", + "@wordpress/private-apis": "^1.17.0", "clsx": "^2.1.1" }, "engines": { @@ -8306,13 +8330,12 @@ } }, "node_modules/@wordpress/preferences-persistence": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/@wordpress/preferences-persistence/-/preferences-persistence-2.8.2.tgz", - "integrity": "sha512-vFFSVXtV7Z5JKW0Vv0T1HjtuMb3ufUy8tsQcPWB924Js7T5tRGZt5Bidn6RflXTDYudrwGMlDwBrKIBWXY9F0g==", - "license": "GPL-2.0-or-later", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/preferences-persistence/-/preferences-persistence-2.17.0.tgz", + "integrity": "sha512-isCZymyq2FOFlR4flEFhiIXdQpJmjCbFFsxfShmTz6H7f4w5Aqrivbgi/2RbN9UDu0Oi41VZqcwX8QIcOqbIxw==", "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/api-fetch": "^7.8.2" + "@babel/runtime": "7.25.7", + "@wordpress/api-fetch": "^7.17.0" }, "engines": { "node": ">=18.12.0", @@ -8320,11 +8343,10 @@ } }, "node_modules/@wordpress/prettier-config": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-4.8.1.tgz", - "integrity": "sha512-JDiVChhgwv6ZGa4aVOXnDJnj/dUFkD/SSvRLFkLOdB+ZbWgddJQkVB3rpJOfREsPtEFWqgTxcJoZjnkqltNbww==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-4.17.0.tgz", + "integrity": "sha512-yoNJRCRMX27bvGyLzF2GunbPqksn6NJD1DDbV7a5j8gUvOZezN+5duAFApIDwaa4n3fxfIzf0wdoBxrMdnuBFg==", "dev": true, - "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", "npm": ">=8.19.2" @@ -8334,13 +8356,12 @@ } }, "node_modules/@wordpress/primitives": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-4.8.1.tgz", - "integrity": "sha512-enfNxpEWycMNnvF7lpP8QYGKotu6B0UfUVcA89oDkam4OhP8tkpP1OVZyPHPgseRWweS/hL6aW/4bvwNSklf+g==", - "license": "GPL-2.0-or-later", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-4.17.0.tgz", + "integrity": "sha512-O1dysI/Y9xv5uUMllH2VIxuBDCOVUX8WmouE9KKr11Yv4gkHzxzaU2M5rFtu7RbUCv6jtkvjidy2cuZuNpEIHQ==", "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/element": "^6.8.1", + "@babel/runtime": "7.25.7", + "@wordpress/element": "^6.17.0", "clsx": "^2.1.1" }, "engines": { @@ -8352,12 +8373,11 @@ } }, "node_modules/@wordpress/priority-queue": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/priority-queue/-/priority-queue-3.8.1.tgz", - "integrity": "sha512-USgFi75o7GlWiPu1hSGSWFXcj5nOjTVjrj0jM6sV+vqa39oRXxE4zpxGkvV4EINn8OrqvHBs/17uygAFXqppZQ==", - "license": "GPL-2.0-or-later", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/priority-queue/-/priority-queue-3.17.0.tgz", + "integrity": "sha512-WzQHNx6wjgbxhuaKErjIRLSL9E9La8slsAXRTQPmkgvKqa11Rh4RYl2FLUh8tABK3xo5HzaHCplkZSm2q5wlbg==", "dependencies": { - "@babel/runtime": "^7.16.0", + "@babel/runtime": "7.25.7", "requestidlecallback": "^0.3.0" }, "engines": { @@ -8366,12 +8386,11 @@ } }, "node_modules/@wordpress/private-apis": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/private-apis/-/private-apis-1.8.1.tgz", - "integrity": "sha512-/5PV8+QfkaLJs9TsFTIVMc3Ns+KdysFzS5ZGSmRGgsjzzgqHZb670mxf/6YaFldNjELbg5QsvcHNm3mkfkYiQg==", - "license": "GPL-2.0-or-later", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/private-apis/-/private-apis-1.17.0.tgz", + "integrity": "sha512-9NGPyuUvtJD0OjWJ/Cn+6Qhjb8hXhiJH4i80W7MFVHRgUZLc/Tu5BOg2+OnXMRSePbgYivo1NLEukqdXqse5IA==", "dependencies": { - "@babel/runtime": "^7.16.0" + "@babel/runtime": "7.25.7" }, "engines": { "node": ">=18.12.0", @@ -8379,12 +8398,11 @@ } }, "node_modules/@wordpress/redux-routine": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/redux-routine/-/redux-routine-5.8.1.tgz", - "integrity": "sha512-mScAi3R/o9dAeS5yQm7F/txNSHhXthYE/NbHtm808+iMgXvgTztAJSg4K29YpAhXgqPTFYMTX0cFiiQ1uNEGqw==", - "license": "GPL-2.0-or-later", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/redux-routine/-/redux-routine-5.17.0.tgz", + "integrity": "sha512-RBUNOp+wSweymRB0+fThv1HKUf1c8GVMUT/Xv0kqtrRsGFD70ciwnnfVXnPY0V6po9Uzj5Bb4+2qO/l/e2IwXw==", "dependencies": { - "@babel/runtime": "^7.16.0", + "@babel/runtime": "7.25.7", "is-plain-object": "^5.0.0", "is-promise": "^4.0.0", "rungen": "^0.3.2" @@ -8398,23 +8416,22 @@ } }, "node_modules/@wordpress/reusable-blocks": { - "version": "5.8.15", - "resolved": "https://registry.npmjs.org/@wordpress/reusable-blocks/-/reusable-blocks-5.8.15.tgz", - "integrity": "sha512-qgZlUf21UzaoF9x7WMZ7g3savI2PG6EugA0QnDWSI0bk19JnXoJ23DwkY4mm0WglTVOnsDq/HQjQWFvMNji6KA==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/block-editor": "^14.3.15", - "@wordpress/blocks": "^13.8.5", - "@wordpress/components": "^28.8.11", - "@wordpress/core-data": "^7.8.15", - "@wordpress/data": "^10.8.3", - "@wordpress/element": "^6.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/icons": "^10.8.2", - "@wordpress/notices": "^5.8.3", - "@wordpress/private-apis": "^1.8.1", - "@wordpress/url": "^4.8.1" + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/reusable-blocks/-/reusable-blocks-5.17.0.tgz", + "integrity": "sha512-VxKBz1KZCTSnhdiaoNbcQrFW9dqRNEkGP60guWqqFlSYl5SpPqulwhtNCpfIw2Z9z8oYMGa7/2JO64WiVeYwGA==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/block-editor": "^14.12.0", + "@wordpress/blocks": "^14.6.0", + "@wordpress/components": "^29.3.0", + "@wordpress/core-data": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/icons": "^10.17.0", + "@wordpress/notices": "^5.17.0", + "@wordpress/private-apis": "^1.17.0", + "@wordpress/url": "^4.17.0" }, "engines": { "node": ">=18.12.0", @@ -8426,20 +8443,19 @@ } }, "node_modules/@wordpress/rich-text": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@wordpress/rich-text/-/rich-text-7.8.3.tgz", - "integrity": "sha512-rB2hebZbTAI5LdLLtatwijpRKzYO+UdQes1Bni2WBAd59KH0YIj4kkVnj39lYYrV3OS+CqSqH2W4UJB7HPNRWQ==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^4.8.2", - "@wordpress/compose": "^7.8.3", - "@wordpress/data": "^10.8.3", - "@wordpress/deprecated": "^4.8.2", - "@wordpress/element": "^6.8.1", - "@wordpress/escape-html": "^3.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/keycodes": "^4.8.2", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/rich-text/-/rich-text-7.17.0.tgz", + "integrity": "sha512-HEmApVDjConxYe3cP8P+Zs0xLJZPMhfWal38MQmFelQtCNk+kT0IBg5SkFAcWYY+c4gzhK+dMKawc72uWDfm8w==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/a11y": "^4.17.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/deprecated": "^4.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/escape-html": "^3.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/keycodes": "^4.17.0", "memize": "^2.1.0" }, "engines": { @@ -8451,16 +8467,17 @@ } }, "node_modules/@wordpress/router": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/router/-/router-1.8.1.tgz", - "integrity": "sha512-ASF2uFwCh4bt7HZ/OVFQs18sBoXnDvcGjg9voyCGirX6keH4jutGon3OTUorQVVLlirOrWDeeAciRJPT7TGYZA==", - "license": "GPL-2.0-or-later", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/router/-/router-1.17.0.tgz", + "integrity": "sha512-hzc3Hdbnje7Bl/MHCfDnTbjVwyoVR6Cp05H1N1f6pAbqSTgHTyefMkkK4CPtwplpYcsY+yvEfPij1GejcFaAgg==", "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/element": "^6.8.1", - "@wordpress/private-apis": "^1.8.1", - "@wordpress/url": "^4.8.1", - "history": "^5.3.0" + "@babel/runtime": "7.25.7", + "@wordpress/compose": "^7.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/private-apis": "^1.17.0", + "@wordpress/url": "^4.17.0", + "history": "^5.3.0", + "route-recognizer": "^0.3.4" }, "engines": { "node": ">=18.12.0", @@ -8471,34 +8488,33 @@ } }, "node_modules/@wordpress/scripts": { - "version": "30.0.6", - "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-30.0.6.tgz", - "integrity": "sha512-vpl/qyGHEVUO3gxwQRDd5pfN3IEAGgKB6QWpyMKcaT8KTn1a6TpM8KP7w4oNkPLnUrMouqXFpLb4gUBD0BbHKQ==", + "version": "30.10.0", + "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-30.10.0.tgz", + "integrity": "sha512-Rs5NBN2TSWAYsf4DAchbi0ZnBkOjEfKzDXZGNEbWuO2dpbpPXHn9puZe5tBNo2bOe09mf+dXfOUh0Z1puK7orw==", "dev": true, - "license": "GPL-2.0-or-later", "dependencies": { - "@babel/core": "^7.16.0", + "@babel/core": "7.25.7", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", "@svgr/webpack": "^8.0.1", - "@wordpress/babel-preset-default": "^8.8.2", - "@wordpress/browserslist-config": "^6.8.1", - "@wordpress/dependency-extraction-webpack-plugin": "^6.8.3", - "@wordpress/e2e-test-utils-playwright": "^1.8.1", - "@wordpress/eslint-plugin": "^21.1.2", - "@wordpress/jest-preset-default": "^12.8.1", - "@wordpress/npm-package-json-lint-config": "^5.8.1", - "@wordpress/postcss-plugins-preset": "^5.8.3", - "@wordpress/prettier-config": "^4.8.1", - "@wordpress/stylelint-config": "^23.0.1", + "@wordpress/babel-preset-default": "^8.17.0", + "@wordpress/browserslist-config": "^6.17.0", + "@wordpress/dependency-extraction-webpack-plugin": "^6.17.0", + "@wordpress/e2e-test-utils-playwright": "^1.17.0", + "@wordpress/eslint-plugin": "^22.3.0", + "@wordpress/jest-preset-default": "^12.17.0", + "@wordpress/npm-package-json-lint-config": "^5.17.0", + "@wordpress/postcss-plugins-preset": "^5.17.0", + "@wordpress/prettier-config": "^4.17.0", + "@wordpress/stylelint-config": "^23.9.0", "adm-zip": "^0.5.9", - "babel-jest": "^29.6.2", - "babel-loader": "^8.2.3", + "babel-jest": "29.7.0", + "babel-loader": "9.2.1", "browserslist": "^4.21.10", "chalk": "^4.0.0", "check-node-version": "^4.1.0", "clean-webpack-plugin": "^3.0.0", "copy-webpack-plugin": "^10.2.0", - "cross-spawn": "^5.1.0", + "cross-spawn": "^7.0.6", "css-loader": "^6.2.0", "cssnano": "^6.0.1", "cwd": "^0.10.0", @@ -8508,32 +8524,32 @@ "fast-glob": "^3.2.7", "filenamify": "^4.2.0", "jest": "^29.6.2", - "jest-dev-server": "^9.0.1", + "jest-dev-server": "^10.1.4", "jest-environment-jsdom": "^29.6.2", "jest-environment-node": "^29.6.2", + "json2php": "^0.0.9", "markdownlint-cli": "^0.31.1", "merge-deep": "^3.0.3", - "mini-css-extract-plugin": "^2.5.1", + "mini-css-extract-plugin": "^2.9.2", "minimist": "^1.2.0", "npm-package-json-lint": "^6.4.0", "npm-packlist": "^3.0.0", "postcss": "^8.4.5", - "postcss-import": "^16.1.0", "postcss-loader": "^6.2.1", "prettier": "npm:wp-prettier@3.0.3", - "puppeteer-core": "^23.1.0", + "puppeteer-core": "^23.10.1", "react-refresh": "^0.14.0", "read-pkg-up": "^7.0.1", "resolve-bin": "^0.4.0", - "rtlcss-webpack-plugin": "^4.0.7", - "sass": "^1.35.2", - "sass-loader": "^12.1.0", + "rtlcss": "^4.3.0", + "sass": "^1.54.0", + "sass-loader": "^16.0.3", "schema-utils": "^4.2.0", "source-map-loader": "^3.0.0", "stylelint": "^16.8.2", - "terser-webpack-plugin": "^5.3.9", + "terser-webpack-plugin": "^5.3.10", "url-loader": "^4.1.1", - "webpack": "^5.88.2", + "webpack": "^5.97.0", "webpack-bundle-analyzer": "^4.9.1", "webpack-cli": "^5.1.4", "webpack-dev-server": "^4.15.1" @@ -8546,7 +8562,7 @@ "npm": ">=8.19.2" }, "peerDependencies": { - "@playwright/test": "^1.47.0", + "@playwright/test": "^1.49.1", "react": "^18.0.0", "react-dom": "^18.0.0" } @@ -8674,6 +8690,20 @@ "webpack": "^5.1.0" } }, + "node_modules/@wordpress/scripts/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@wordpress/scripts/node_modules/css-select": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", @@ -8851,9 +8881,9 @@ ] }, "node_modules/@wordpress/scripts/node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "dependencies": { "dom-serializer": "^2.0.0", @@ -9004,6 +9034,15 @@ "node": ">=8" } }, + "node_modules/@wordpress/scripts/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@wordpress/scripts/node_modules/postcss-calc": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", @@ -9444,10 +9483,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@wordpress/scripts/node_modules/rtlcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", + "dev": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/@wordpress/scripts/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", @@ -9456,13 +9513,34 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, + "node_modules/@wordpress/scripts/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wordpress/scripts/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@wordpress/scripts/node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -9559,21 +9637,20 @@ } }, "node_modules/@wordpress/server-side-render": { - "version": "5.8.11", - "resolved": "https://registry.npmjs.org/@wordpress/server-side-render/-/server-side-render-5.8.11.tgz", - "integrity": "sha512-D7TM+Z6HETLVQ40qe/d7IgXQ+N8fwsuss5TtuaNgUyN0W1ZUFhk1ANd25Qmz7xGSWDMZOql75a08XCgi/7OgnQ==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/api-fetch": "^7.8.2", - "@wordpress/blocks": "^13.8.5", - "@wordpress/components": "^28.8.11", - "@wordpress/compose": "^7.8.3", - "@wordpress/data": "^10.8.3", - "@wordpress/deprecated": "^4.8.2", - "@wordpress/element": "^6.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/url": "^4.8.1", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/server-side-render/-/server-side-render-5.17.0.tgz", + "integrity": "sha512-xJWABbtCZmkO6+Xa1DS3Mq+f2ZKH540aj5xeN7M1W1meAFdcZlEAbQI+Kn1PuXI9VpHIh5K+JOybHD06TI4hZQ==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/api-fetch": "^7.17.0", + "@wordpress/blocks": "^14.6.0", + "@wordpress/components": "^29.3.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/deprecated": "^4.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/url": "^4.17.0", "fast-deep-equal": "^3.1.3" }, "engines": { @@ -9586,12 +9663,11 @@ } }, "node_modules/@wordpress/shortcode": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/shortcode/-/shortcode-4.8.1.tgz", - "integrity": "sha512-c8wYr2zmXOonAgABnFmuKRQ7wYyAIvshb3nCVrjFbpHnFmK+CHMg/y/KmcnfnPscdAO+uKDBKYNp0fnYfQBhiQ==", - "license": "GPL-2.0-or-later", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/shortcode/-/shortcode-4.17.0.tgz", + "integrity": "sha512-sNPUmeeK/dxK5z8BWSsk5OqRSf2UzfczpKu3upRn9eIdgG31SCXPgzvps73upIrxZNDCTQVVFhq47KADX8TiUA==", "dependencies": { - "@babel/runtime": "^7.16.0", + "@babel/runtime": "7.25.7", "memize": "^2.0.1" }, "engines": { @@ -9600,12 +9676,11 @@ } }, "node_modules/@wordpress/style-engine": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/style-engine/-/style-engine-2.8.1.tgz", - "integrity": "sha512-wsYdvrc+CEqidp9TmpG+/9s6zm1GEUU2Qp5qIELcQWU6VNzuycc5nqzFnRiKv0Pz+6TRgksjLsb86IQrCcg2nA==", - "license": "GPL-2.0-or-later", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/style-engine/-/style-engine-2.17.0.tgz", + "integrity": "sha512-6eIdeQH0t7va1AjZIGo8sEW8NE+dcz//KXp+HsW/2XhATAIPjUjFJ2/SVRNCj3JHFKSjKpxnZi26xalfET0PqA==", "dependencies": { - "@babel/runtime": "^7.16.0", + "@babel/runtime": "7.25.7", "change-case": "^4.1.2" }, "engines": { @@ -9614,9 +9689,9 @@ } }, "node_modules/@wordpress/stylelint-config": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-23.0.1.tgz", - "integrity": "sha512-fxWzz2kX1jCkvVcdkRuMu1HF1LNSlr3hgFk29NW09FbL6nnac/rlSaX3+LQSlbDUSe/aq840B7K0iIq2GwnKog==", + "version": "23.9.0", + "resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-23.9.0.tgz", + "integrity": "sha512-id+dU8JmvLBP/4Od0sIYe6g56nUKh97NO0RI+PNHDRB660Nn7nBJpRAu9Y3vd/3RwoZyaS72JAovmkQrzynGiw==", "dev": true, "dependencies": { "@stylistic/stylelint-plugin": "^3.0.1", @@ -9632,14 +9707,13 @@ } }, "node_modules/@wordpress/sync": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/sync/-/sync-1.8.1.tgz", - "integrity": "sha512-i2vYN15nh5Cf8EgryZIIKAvx0IZi34gBqXNwvSymhh1/eD4yzcFyaFfko7NS93fPeGuVy/Hxj+2M1CdZ7fd43w==", - "license": "GPL-2.0-or-later", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/sync/-/sync-1.17.0.tgz", + "integrity": "sha512-otylLNYzW0Tu5NIgLwGwE2rvjikyB3KCFlpqIl4otR1XxqFM7obHG7VU+e0LKQdlg6NIdCZdWyv2nNGnz5cjFg==", "dependencies": { - "@babel/runtime": "^7.16.0", + "@babel/runtime": "7.25.7", "@types/simple-peer": "^9.11.5", - "@wordpress/url": "^4.8.1", + "@wordpress/url": "^4.17.0", "import-locals": "^2.0.0", "lib0": "^0.2.42", "simple-peer": "^9.11.0", @@ -9654,12 +9728,11 @@ } }, "node_modules/@wordpress/token-list": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/token-list/-/token-list-3.8.1.tgz", - "integrity": "sha512-uQEimvYlEsjQh5PHscYnctSnuK11ZOpUGLlYbJ10VtoisDJP2bqYwu36FBGrEuY5g0y6y/rP/Hw1BirZ+wrZyw==", - "license": "GPL-2.0-or-later", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/token-list/-/token-list-3.17.0.tgz", + "integrity": "sha512-TO224Seolfy/eapbOg15poz1Ws44xW3KHrqeo7Jp+6hmqQh/5OJE5wDFTzgsbdnAXFzy3DAGJxxxrCv0qpf+YA==", "dependencies": { - "@babel/runtime": "^7.16.0" + "@babel/runtime": "7.25.7" }, "engines": { "node": ">=18.12.0", @@ -9667,26 +9740,63 @@ } }, "node_modules/@wordpress/undo-manager": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/undo-manager/-/undo-manager-1.8.1.tgz", - "integrity": "sha512-l5U3NswNDWHVQ3sAsiCvI65JDrAFlBnAIsoKsc38zg2OkNO1m8IIf/K+D3YAqBBM+zDahSGbNaLCEftBbZVSUg==", - "license": "GPL-2.0-or-later", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/undo-manager/-/undo-manager-1.17.0.tgz", + "integrity": "sha512-inSOCUneGMmFq3jRTB9uIws/+6VWpz0zvY2IPW/vjWbz7Gg1YbJ+lmbbgtJCoiJ7Ei00b4sagvzI00TNUXe9mg==", "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/is-shallow-equal": "^5.8.1" + "@babel/runtime": "7.25.7", + "@wordpress/is-shallow-equal": "^5.17.0" }, "engines": { "node": ">=18.12.0", "npm": ">=8.19.2" } }, + "node_modules/@wordpress/upload-media": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@wordpress/upload-media/-/upload-media-0.2.0.tgz", + "integrity": "sha512-xPPru9rSDTKWpFMMM5dOaPQIkf38L3gNinjSHkU7arFyK14G60HklvZJ/MTk7RjjgQ7h1sYe8tvdiTvI8CQZyQ==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@shopify/web-worker": "^6.4.0", + "@wordpress/api-fetch": "^7.17.0", + "@wordpress/blob": "^4.17.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/preferences": "^4.17.0", + "@wordpress/private-apis": "^1.17.0", + "@wordpress/url": "^4.17.0", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@wordpress/upload-media/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@wordpress/url": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-4.8.1.tgz", - "integrity": "sha512-YZcNOlJAUhkxMWlmkkc6mvSdXukkleq8j5Z8p8kBWQX9Wxng84ygyBSMiqFeFvAIs8nNDXBrqG9zGGRxMW6q/g==", - "license": "GPL-2.0-or-later", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-4.17.0.tgz", + "integrity": "sha512-aFU1w2Wcz2/YdapPYozeXbb7C7LzfYZmAg4Bu28zTSxxrpKYocr/oYH7D8V13uHzfBoqTzL8XYM7wj17Dlcdag==", "dependencies": { - "@babel/runtime": "^7.16.0", + "@babel/runtime": "7.25.7", "remove-accents": "^0.5.0" }, "engines": { @@ -9695,15 +9805,14 @@ } }, "node_modules/@wordpress/viewport": { - "version": "6.8.3", - "resolved": "https://registry.npmjs.org/@wordpress/viewport/-/viewport-6.8.3.tgz", - "integrity": "sha512-izS9YQmogTilQx0xrd9RspAeF/PT1V9N7S7QjNAH9UZ7E4k32m2Vg6ebcYQGShRgmjUReiunIDDr0VDSK5h3PQ==", - "license": "GPL-2.0-or-later", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/viewport/-/viewport-6.17.0.tgz", + "integrity": "sha512-xhTOdRjA2bjmuWOYoJtq9Tdnjle7u0bCkJyyuCVrMWxqAunxcI8QxSTXm9OqvuAVbvGfhH9i/BIeeTQjFYPxPA==", "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/compose": "^7.8.3", - "@wordpress/data": "^10.8.3", - "@wordpress/element": "^6.8.1" + "@babel/runtime": "7.25.7", + "@wordpress/compose": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/element": "^6.17.0" }, "engines": { "node": ">=18.12.0", @@ -9714,33 +9823,31 @@ } }, "node_modules/@wordpress/warning": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.8.1.tgz", - "integrity": "sha512-xlo0Xw1jiyiE6nh43NAtQMAL05VDk837kY2xfjsus6wD597TeWFpj6gmcRMH25FZULTUHDB2EPfLviWXqOgUfg==", - "license": "GPL-2.0-or-later", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.17.0.tgz", + "integrity": "sha512-dmEjDbYtfPD8rMRtSrLxoW3g8CLKl+vK5pdXvDvG0lBoRjqwtRPP4cgNBOC8cq8gXRCwh5NDDtM2C8MTjGjVsQ==", "engines": { "node": ">=18.12.0", "npm": ">=8.19.2" } }, "node_modules/@wordpress/widgets": { - "version": "4.8.15", - "resolved": "https://registry.npmjs.org/@wordpress/widgets/-/widgets-4.8.15.tgz", - "integrity": "sha512-nAlEzexJ4577KIetFUQhLFJeL4TnOhWV0MsH2Gq0bt6xaE2uCsao5mYwLm3efY64WqaOrKiLxrntHU3qvlOZCw==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/api-fetch": "^7.8.2", - "@wordpress/block-editor": "^14.3.15", - "@wordpress/blocks": "^13.8.5", - "@wordpress/components": "^28.8.11", - "@wordpress/compose": "^7.8.3", - "@wordpress/core-data": "^7.8.15", - "@wordpress/data": "^10.8.3", - "@wordpress/element": "^6.8.1", - "@wordpress/i18n": "^5.8.2", - "@wordpress/icons": "^10.8.2", - "@wordpress/notices": "^5.8.3", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/widgets/-/widgets-4.17.0.tgz", + "integrity": "sha512-tQsaAGKVzmmGUpxysrfDdu6ujZ/w5y+ykkPtyKMjxyW9o+Ai6MztzjgBvkg14cSDUEvCdHku6396uKCqFIhiiQ==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/api-fetch": "^7.17.0", + "@wordpress/block-editor": "^14.12.0", + "@wordpress/blocks": "^14.6.0", + "@wordpress/components": "^29.3.0", + "@wordpress/compose": "^7.17.0", + "@wordpress/core-data": "^7.17.0", + "@wordpress/data": "^10.17.0", + "@wordpress/element": "^6.17.0", + "@wordpress/i18n": "^5.17.0", + "@wordpress/icons": "^10.17.0", + "@wordpress/notices": "^5.17.0", "clsx": "^2.1.1" }, "engines": { @@ -9753,12 +9860,11 @@ } }, "node_modules/@wordpress/wordcount": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/wordcount/-/wordcount-4.8.1.tgz", - "integrity": "sha512-72e8N6I6he5pA9KDwqrq3mRMb+9WtzqR67C0uBmrlQg4FT23XptG8fDVacD2Das2nWSAgaLR/4GhKv34pPj1vg==", - "license": "GPL-2.0-or-later", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/wordcount/-/wordcount-4.17.0.tgz", + "integrity": "sha512-lT4NmbK0fMX+mqm/1XSoTsW7VqmxApZcZFPtWvT5UH6js1XcDrQa9liIUv6RyMlrrLHTTDrq+e4mNVeND68o5A==", "dependencies": { - "@babel/runtime": "^7.16.0" + "@babel/runtime": "7.25.7" }, "engines": { "node": ">=18.12.0", @@ -10115,12 +10221,12 @@ } }, "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, - "dependencies": { - "deep-equal": "^2.0.5" + "engines": { + "node": ">= 0.4" } }, "node_modules/arr-diff": { @@ -10151,13 +10257,13 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" @@ -10292,15 +10398,15 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -10310,15 +10416,15 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -10344,19 +10450,18 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -10437,6 +10542,15 @@ "lodash": "^4.17.14" } }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -10529,9 +10643,9 @@ "dev": true }, "node_modules/axe-core": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", - "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", + "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", "dev": true, "engines": { "node": ">=4" @@ -10671,36 +10785,69 @@ } }, "node_modules/babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dev": true, "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 8.9" + "node": ">= 14.15.0" }, "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-loader/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/babel-loader/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" } }, + "node_modules/babel-loader/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/babel-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 8.9.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -10753,17 +10900,17 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.3", + "semver": "^6.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { @@ -10776,28 +10923,28 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@babel/helper-define-polyfill-provider": "^0.6.3" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-preset-current-node-syntax": { @@ -10839,30 +10986,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/babel-runtime": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz", - "integrity": "sha512-zeCYxDePWYAT/DfmQWIHsMSFW2vv45UIwIAMjGvQVsTd47RwsiRH0uK1yzyWZ7LDBKdhnGDPM6NYEO5CZyhPrg==", - "dev": true, - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.10.0" - } - }, - "node_modules/babel-runtime/node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true, - "hasInstallScript": true - }, - "node_modules/babel-runtime/node_modules/regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==", - "dev": true - }, "node_modules/backbone": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.6.0.tgz", @@ -10886,9 +11009,9 @@ "optional": true }, "node_modules/bare-fs": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", - "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", + "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", "dev": true, "optional": true, "dependencies": { @@ -10898,9 +11021,9 @@ } }, "node_modules/bare-os": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.0.tgz", - "integrity": "sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", + "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", "dev": true, "optional": true }, @@ -11542,9 +11665,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", - "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -11560,12 +11683,11 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001663", - "electron-to-chromium": "^1.5.28", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -11697,6 +11819,16 @@ "node": ">=0.10.0" } }, + "node_modules/cacheable": { + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.8.8.tgz", + "integrity": "sha512-OE1/jlarWxROUIpd0qGBSKFLkNsotY8pt4GeiVErUYh/NUeTNrT+SBksUgllQv4m6a0W/VZsLuiHb88maavqEw==", + "dev": true, + "dependencies": { + "hookified": "^1.7.0", + "keyv": "^5.2.3" + } + }, "node_modules/cacheable-request": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", @@ -11779,17 +11911,54 @@ "node": ">=4" } }, + "node_modules/cacheable/node_modules/keyv": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.2.3.tgz", + "integrity": "sha512-AGKecUfzrowabUv0bH1RIR5Vf7w+l4S3xtQAypKaUpTdIR1EbrAcTxHCrpo9Q+IWeUlFE2palRtgIQcgm+PQJw==", + "dev": true, + "dependencies": { + "@keyv/serialize": "^1.0.2" + } + }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -11868,9 +12037,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001664", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz", - "integrity": "sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==", + "version": "1.0.30001696", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz", + "integrity": "sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==", "dev": true, "funding": [ { @@ -11885,8 +12054,7 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/capital-case": { "version": "1.0.4", @@ -12145,15 +12313,15 @@ } }, "node_modules/chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-1.1.2.tgz", + "integrity": "sha512-YclTJey34KUm5jB1aEJCq807bSievi7Nb/TU4Gu504fUYi3jw3KCIaH6L7nFWQhdEgH3V+wCh+kKD1P5cXnfxw==", "dev": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" + "lighthouse-logger": "^2.0.1" }, "bin": { "print-chrome-path": "bin/print-chrome-path.js" @@ -12197,12 +12365,6 @@ "devtools-protocol": "*" } }, - "node_modules/chromium-bidi/node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "dev": true - }, "node_modules/ci-info": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", @@ -12323,8 +12485,7 @@ "node_modules/client-zip": { "version": "2.4.6", "resolved": "https://registry.npmjs.org/client-zip/-/client-zip-2.4.6.tgz", - "integrity": "sha512-e7t1u14h/yT0A12qBwFsaus8UZZ8+MCaNAEn/z53mrukLq/LFcKX7TkbntAppGu8he2p8pz9vc5NEGE/h4ohlw==", - "license": "MIT" + "integrity": "sha512-e7t1u14h/yT0A12qBwFsaus8UZZ8+MCaNAEn/z53mrukLq/LFcKX7TkbntAppGu8he2p8pz9vc5NEGE/h4ohlw==" }, "node_modules/clipboard": { "version": "2.0.11", @@ -12539,10 +12700,10 @@ "node": ">= 12.0.0" } }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "dev": true }, "node_modules/component-emitter": { @@ -12842,9 +13003,9 @@ } }, "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", @@ -12853,7 +13014,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -12885,12 +13046,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.28.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.28.0.tgz", - "integrity": "sha512-myzPgE7QodMg4nnd3K1TDoES/nADRStM8Gpz0D6nhkwbmwEnE0ZGJgoWsvQ722FR8D7xS0n0LV556RcEicjTyg==", + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz", + "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==", "dev": true, "dependencies": { - "browserslist": "^4.21.5" + "browserslist": "^4.24.3" }, "funding": { "type": "opencollective", @@ -13030,6 +13191,7 @@ "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", @@ -13041,6 +13203,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, + "optional": true, "dependencies": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -13051,6 +13214,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "optional": true, "dependencies": { "isexe": "^2.0.0" }, @@ -13063,7 +13227,8 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true }, "node_modules/crypto-random-string": { "version": "2.0.0", @@ -13102,9 +13267,9 @@ } }, "node_modules/css-functions-list": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz", - "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", "dev": true, "engines": { "node": ">=12 || >=16" @@ -13460,14 +13625,14 @@ } }, "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -13477,29 +13642,29 @@ } }, "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/inspect-js" } }, "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" }, @@ -13844,44 +14009,6 @@ } } }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-equal/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -14241,9 +14368,9 @@ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" }, "node_modules/devtools-protocol": { - "version": "0.0.1342118", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1342118.tgz", - "integrity": "sha512-75fMas7PkYNDTmDyb6PRJCH7ILmHLp+BhrZGeMsa4bCh40DTxgCz2NRy5UDzII4C5KuD0oBMZ9vXKhEl6UD/3w==", + "version": "0.0.1312386", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", + "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==", "dev": true }, "node_modules/diff": { @@ -14506,6 +14633,20 @@ "node": ">=4" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -14537,11 +14678,10 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.30", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.30.tgz", - "integrity": "sha512-sXI35EBN4lYxzc/pIGorlymYNzDBOqkSlVRe6MkgBsW/hW1tpC/HDJ2fjG7XnjakzfLEuvdmux0Mjs6jHq4UOA==", - "dev": true, - "license": "ISC" + "version": "1.5.90", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.90.tgz", + "integrity": "sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug==", + "dev": true }, "node_modules/element-closest": { "version": "3.0.2", @@ -14719,57 +14859,62 @@ } }, "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" }, "engines": { "node": ">= 0.4" @@ -14779,13 +14924,10 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, "engines": { "node": ">= 0.4" } @@ -14799,52 +14941,28 @@ "node": ">= 0.4" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-get-iterator/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, "node_modules/es-iterator-helpers": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", - "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" }, "engines": { "node": ">= 0.4" @@ -14869,14 +14987,15 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.4", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -14892,14 +15011,14 @@ } }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -14927,6 +15046,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.8.0" @@ -15059,9 +15179,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz", - "integrity": "sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -15085,9 +15205,9 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", - "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, "dependencies": { "@rtsao/scc": "^1.1.0", @@ -15098,7 +15218,7 @@ "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.9.0", + "eslint-module-utils": "^2.12.0", "hasown": "^2.0.2", "is-core-module": "^2.15.1", "is-glob": "^4.0.3", @@ -15107,13 +15227,14 @@ "object.groupby": "^1.0.3", "object.values": "^1.2.0", "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/debug": { @@ -15329,12 +15450,12 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz", - "integrity": "sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", "dev": true, "dependencies": { - "aria-query": "~5.1.3", + "aria-query": "^5.3.2", "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", @@ -15342,14 +15463,13 @@ "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.19", "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.0" + "string.prototype.includes": "^2.0.1" }, "engines": { "node": ">=4.0" @@ -15380,9 +15500,9 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz", + "integrity": "sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==", "dev": true, "dependencies": { "prettier-linter-helpers": "^1.0.0", @@ -15410,28 +15530,28 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.36.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.36.1.tgz", - "integrity": "sha512-/qwbqNXZoq+VP30s1d4Nc1C5GTxjJQjk4Jzs4Wq2qzxFM7dSmuG2UkIjg2USMLh3A/aVcUNrK7v0J5U1XEGGwA==", + "version": "7.37.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz", + "integrity": "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==", "dev": true, "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", + "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", + "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.8", "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", + "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", + "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "engines": { @@ -16515,16 +16635,16 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -16834,20 +16954,116 @@ "license": "MIT" }, "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/find-file-up": { @@ -16882,14 +17098,14 @@ } }, "node_modules/find-process": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz", - "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==", + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.10.tgz", + "integrity": "sha512-ncYFnWEIwL7PzmrK1yZtaccN8GhethD37RzBHG6iOZoFYB4vSmLLXfeWJjeN5nMvCJMjOtBvBBF8OgxEcikiZg==", "dev": true, "dependencies": { - "chalk": "^4.0.0", - "commander": "^5.1.0", - "debug": "^4.1.1" + "chalk": "~4.1.2", + "commander": "^12.1.0", + "loglevel": "^1.9.2" }, "bin": { "find-process": "bin/find-process.js" @@ -16945,12 +17161,12 @@ "dev": true }, "node_modules/find-process/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "engines": { - "node": ">= 6" + "node": ">=18" } }, "node_modules/find-process/node_modules/has-flag": { @@ -17259,9 +17475,9 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", "dev": true }, "node_modules/follow-redirects": { @@ -17285,12 +17501,18 @@ } }, "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.4.tgz", + "integrity": "sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==", "dev": true, "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/for-in": { @@ -17508,15 +17730,17 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -17569,16 +17793,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", "dev": true, "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -17616,6 +17845,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-proxy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", @@ -17659,14 +17901,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -17854,12 +18096,13 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -17950,12 +18193,12 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -19249,10 +19492,13 @@ } }, "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -19261,6 +19507,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -19279,10 +19526,13 @@ } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -19301,9 +19551,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "engines": { "node": ">= 0.4" @@ -19449,6 +19699,12 @@ "node": "*" } }, + "node_modules/hookified": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.7.0.tgz", + "integrity": "sha512-XQdMjqC1AyeOzfs+17cnIk7Wdfu1hh2JtcyNfBf5u9jHrT3iZUlGHxLTntFBuk5lwkqJ6l3+daeQdHK5yByHVA==", + "dev": true + }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -19611,9 +19867,9 @@ } }, "node_modules/http-link-header": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-link-header/-/http-link-header-1.1.1.tgz", - "integrity": "sha512-mW3N/rTYpCn99s1do0zx6nzFZSwLH9HGfUM4ZqLWJ16ylmYaC2v5eYGqrNTQlByx8AzUgGI+V/32gXPugs1+Sw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/http-link-header/-/http-link-header-1.1.3.tgz", + "integrity": "sha512-3cZ0SRL8fb9MUlU3mKM61FcQvPfXx2dBrZW3Vbg5CXa8jFlK8OaEpePenLe1oEXQduhz8b0QjsqfS59QP4AJDQ==", "dev": true, "engines": { "node": ">=6.0.0" @@ -20097,6 +20353,12 @@ "resolved": "https://registry.npmjs.org/ev-emitter/-/ev-emitter-2.1.2.tgz", "integrity": "sha512-jQ5Ql18hdCQ4qS+RCrbLfz1n+Pags27q5TwMKvZyhp5hh2UULUYZUy1keqj6k6SYsdqIYjnmz7xyyEY0V67B8Q==" }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, "node_modules/immutable": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", @@ -20302,14 +20564,14 @@ } }, "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "dependencies": { "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -20325,21 +20587,17 @@ } }, "node_modules/intl-messageformat": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-4.4.0.tgz", - "integrity": "sha512-z+Bj2rS3LZSYU4+sNitdHrwnBhr0wO80ZJSW8EzKDBowwUe3Q/UsvgCGjrwa+HPzoGCLEb9HAjfJgo4j2Sac8w==", + "version": "10.7.14", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.14.tgz", + "integrity": "sha512-mMGnE4E1otdEutV5vLUdCxRJygHB5ozUBxsPB5qhitewssrS/qGruq9bmvIRkkGsNeK5ZWLfYRld18UHGTIifQ==", "dev": true, "dependencies": { - "intl-messageformat-parser": "^1.8.1" + "@formatjs/ecma402-abstract": "2.3.2", + "@formatjs/fast-memoize": "2.2.6", + "@formatjs/icu-messageformat-parser": "2.11.0", + "tslib": "2" } }, - "node_modules/intl-messageformat-parser": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.8.1.tgz", - "integrity": "sha512-IMSCKVf0USrM/959vj3xac7s8f87sc+80Y/ipBzdKy4ifBv5Gsj2tZ41EAaURVg01QU71fYr77uA8Meh6kELbg==", - "deprecated": "We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser", - "dev": true - }, "node_modules/into-stream": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", @@ -20426,30 +20684,15 @@ "node": ">= 0.10" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -20464,12 +20707,16 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -20479,12 +20726,15 @@ } }, "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "dependencies": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -20503,13 +20753,13 @@ } }, "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", + "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -20552,9 +20802,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dependencies": { "hasown": "^2.0.2" }, @@ -20579,11 +20829,13 @@ } }, "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { @@ -20594,12 +20846,13 @@ } }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -20657,12 +20910,15 @@ } }, "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -20700,12 +20956,15 @@ } }, "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -20768,18 +21027,6 @@ "dev": true, "optional": true }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -20794,12 +21041,13 @@ } }, "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -20900,13 +21148,15 @@ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -20950,12 +21200,12 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -20976,12 +21226,13 @@ } }, "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -21007,12 +21258,14 @@ } }, "node_modules/is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "dependencies": { - "has-symbols": "^1.0.1" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -21022,12 +21275,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -21086,25 +21339,28 @@ } }, "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", + "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -21306,16 +21562,20 @@ } }, "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", "dev": true, "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/jest": { @@ -21988,18 +22248,18 @@ } }, "node_modules/jest-dev-server": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-9.0.2.tgz", - "integrity": "sha512-Zc/JB0IlNNrpXkhBw+h86cGrde/Mey52KvF+FER2eyrtYJTHObOwW7Iarxm3rPyTKby5+3Y2QZtl8pRz/5GCxg==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-10.1.4.tgz", + "integrity": "sha512-bGQ6sedNGtT6AFHhCVqGTXMPz7UyJi/ZrhNBgyqsP0XU9N8acCEIfqZEA22rOaZ+NdEVsaltk6tL7UT6aXfI7w==", "dev": true, "dependencies": { "chalk": "^4.1.2", "cwd": "^0.10.0", "find-process": "^1.4.7", "prompts": "^2.4.2", - "spawnd": "^9.0.2", + "spawnd": "^10.1.4", "tree-kill": "^1.2.2", - "wait-on": "^7.2.0" + "wait-on": "^8.0.1" }, "engines": { "node": ">=16" @@ -22063,16 +22323,6 @@ "node": ">=8" } }, - "node_modules/jest-dev-server/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/jest-dev-server/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -22085,26 +22335,6 @@ "node": ">=8" } }, - "node_modules/jest-dev-server/node_modules/wait-on": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", - "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "axios": "^1.6.1", - "joi": "^17.11.0", - "lodash": "^4.17.21", - "minimist": "^1.2.8", - "rxjs": "^7.8.1" - }, - "bin": { - "wait-on": "bin/wait-on" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", @@ -24056,9 +24286,9 @@ } }, "node_modules/known-css-properties": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz", - "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", + "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", "dev": true }, "node_modules/language-subtag-registry": { @@ -24121,9 +24351,9 @@ } }, "node_modules/lib0": { - "version": "0.2.97", - "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.97.tgz", - "integrity": "sha512-Q4d1ekgvufi9FiHkkL46AhecfNjznSL9MRNoJRQ76gBHS9OqU2ArfQK0FvBpuxgWeJeNI0LVgAYMIpsGeX4gYg==", + "version": "0.2.99", + "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.99.tgz", + "integrity": "sha512-vwztYuUf1uf/1zQxfzRfO5yzfNKhTtgOByCruuiQQxWQXnPb8Itaube5ylofcV0oM0aKal9Mv+S1s1Ky0UYP1w==", "dependencies": { "isomorphic.js": "^0.2.4" }, @@ -24140,6 +24370,15 @@ "url": "https://github.com/sponsors/dmonad" } }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/liftup": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", @@ -24316,35 +24555,36 @@ } }, "node_modules/lighthouse": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-10.4.0.tgz", - "integrity": "sha512-XQWHEWkJ8YxSPsxttBJORy5+hQrzbvGkYfeP3fJjyYKioWkF2MXfFqNK4ZuV4jL8pBu7Z91qnQP6In0bq1yXww==", + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-12.3.0.tgz", + "integrity": "sha512-OaLE8DasnwQkn2CBo2lKtD+IQv42mNP3T+Vaw29I++rAh0Zpgc6SM15usdIYyzhRMR5EWFxze5Fyb+HENJSh2A==", "dev": true, "dependencies": { - "@sentry/node": "^6.17.4", - "axe-core": "4.7.2", - "chrome-launcher": "^0.15.2", + "@paulirish/trace_engine": "0.0.39", + "@sentry/node": "^7.0.0", + "axe-core": "^4.10.2", + "chrome-launcher": "^1.1.2", "configstore": "^5.0.1", "csp_evaluator": "1.1.1", - "devtools-protocol": "0.0.1155343", + "devtools-protocol": "0.0.1312386", "enquirer": "^2.3.6", "http-link-header": "^1.1.1", - "intl-messageformat": "^4.4.0", + "intl-messageformat": "^10.5.3", "jpeg-js": "^0.4.4", - "js-library-detector": "^6.6.0", - "lighthouse-logger": "^1.4.1", - "lighthouse-stack-packs": "1.11.0", - "lodash": "^4.17.21", + "js-library-detector": "^6.7.0", + "lighthouse-logger": "^2.0.1", + "lighthouse-stack-packs": "1.12.2", + "lodash-es": "^4.17.21", "lookup-closest-locale": "6.2.0", "metaviewport-parser": "0.3.0", "open": "^8.4.0", "parse-cache-control": "1.0.1", - "ps-list": "^8.0.0", - "puppeteer-core": "^20.8.0", - "robots-parser": "^3.0.0", + "puppeteer-core": "^23.10.4", + "robots-parser": "^3.0.1", "semver": "^5.3.0", "speedline-core": "^1.4.3", - "third-party-web": "^0.23.3", + "third-party-web": "^0.26.1", + "tldts-icann": "^6.1.16", "ws": "^7.0.0", "yargs": "^17.3.1", "yargs-parser": "^21.0.0" @@ -24355,13 +24595,13 @@ "smokehouse": "cli/test/smokehouse/frontends/smokehouse-bin.js" }, "engines": { - "node": ">=16.16" + "node": ">=18.16" } }, "node_modules/lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-2.0.1.tgz", + "integrity": "sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==", "dev": true, "dependencies": { "debug": "^2.6.9", @@ -24384,53 +24624,11 @@ "dev": true }, "node_modules/lighthouse-stack-packs": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.11.0.tgz", - "integrity": "sha512-sRr0z1S/I26VffRLq9KJsKtLk856YrJlNGmcJmbLX8dFn3MuzVPUbstuChEhqnSxZb8TZmVfthuXuwhG9vRoSw==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.12.2.tgz", + "integrity": "sha512-Ug8feS/A+92TMTCK6yHYLwaFMuelK/hAKRMdldYkMNwv+d9PtWxjXEg6rwKtsUXTADajhdrhXyuNCJ5/sfmPFw==", "dev": true }, - "node_modules/lighthouse/node_modules/@puppeteer/browsers": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz", - "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==", - "dev": true, - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/lighthouse/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/lighthouse/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -24455,27 +24653,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/lighthouse/node_modules/axe-core": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", - "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/lighthouse/node_modules/chromium-bidi": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", - "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", - "dev": true, - "dependencies": { - "mitt": "3.0.0" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, "node_modules/lighthouse/node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -24508,55 +24685,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/lighthouse/node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dev": true, - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/lighthouse/node_modules/devtools-protocol": { - "version": "0.0.1155343", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1155343.tgz", - "integrity": "sha512-oD9vGBV2wTc7fAzAM6KC0chSgs234V8+qDEeK+mcbRj2UvcuA7lgBztGi/opj/iahcXD3BSj8Ymvib628yy9FA==", - "dev": true - }, "node_modules/lighthouse/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/lighthouse/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/lighthouse/node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/lighthouse/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -24566,86 +24700,6 @@ "node": ">=8" } }, - "node_modules/lighthouse/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/lighthouse/node_modules/proxy-agent": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", - "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/lighthouse/node_modules/puppeteer-core": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", - "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", - "dev": true, - "dependencies": { - "@puppeteer/browsers": "1.4.6", - "chromium-bidi": "0.4.16", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1147663", - "ws": "8.13.0" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.1147663", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", - "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==", - "dev": true - }, - "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/lighthouse/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -24681,17 +24735,6 @@ "node": ">=8" } }, - "node_modules/lighthouse/node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "dev": true, - "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, "node_modules/lighthouse/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -24719,11 +24762,10 @@ } }, "node_modules/lighthouse/node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -24868,6 +24910,15 @@ "node": ">=8.9.0" } }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "dev": true, + "dependencies": { + "lie": "3.1.1" + } + }, "node_modules/locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -24885,6 +24936,12 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -25027,6 +25084,19 @@ "node": ">=0.10.0" } }, + "node_modules/loglevel": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", + "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, "node_modules/longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -25106,12 +25176,6 @@ "node": ">=0.10.0" } }, - "node_modules/lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", - "dev": true - }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -25489,6 +25553,15 @@ "which": "bin/which" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", @@ -25827,12 +25900,13 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", - "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", "dev": true, "dependencies": { - "schema-utils": "^4.0.0" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "engines": { "node": ">= 12.13.0" @@ -25850,7 +25924,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -25881,11 +25954,10 @@ "dev": true }, "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -25893,7 +25965,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -25951,9 +26023,9 @@ } }, "node_modules/mitt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", - "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "dev": true }, "node_modules/mixin-deep": { @@ -26028,12 +26100,6 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, "node_modules/mnemonist": { "version": "0.39.5", "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.5.tgz", @@ -26295,11 +26361,10 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true, - "license": "MIT" + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true }, "node_modules/node-watch": { "version": "0.7.3", @@ -26901,23 +26966,10 @@ "dev": true }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, "engines": { "node": ">= 0.4" }, @@ -26947,14 +26999,16 @@ } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -27095,12 +27149,13 @@ } }, "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, @@ -27286,6 +27341,23 @@ "get-size": "^2.0.2" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-cancelable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", @@ -27432,33 +27504,29 @@ } }, "node_modules/pac-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", - "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.1.0.tgz", + "integrity": "sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==", "dev": true, "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "pac-resolver": "^7.0.0", - "socks-proxy-agent": "^8.0.2" + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" }, "engines": { "node": ">= 14" } }, "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, "engines": { "node": ">= 14" } @@ -27478,13 +27546,12 @@ } }, "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, - "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -27983,13 +28050,12 @@ } }, "node_modules/postcss-calc": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.2.tgz", - "integrity": "sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.0.tgz", + "integrity": "sha512-uQ/LDGsf3mgsSUEXmAt3VsCSHR3aKqtEIkmB+4PhzYwRYOW5MZs/GhCCFpsOtJJkP6EC6uGipbrnaTjqaJZcJw==", "dev": true, - "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.1.2", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -27999,6 +28065,19 @@ "postcss": "^8.4.38" } }, + "node_modules/postcss-calc/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-colormin": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.2.tgz", @@ -28090,23 +28169,6 @@ "postcss": "^8.4.31" } }, - "node_modules/postcss-import": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-16.1.0.tgz", - "integrity": "sha512-7hsAZ4xGXl4MW+OKEWCnF6T5jqBw80/EE9aXg1r2yyn1RsVEU8EtKXbijEODa+rg7iih4bKf7vlvTGYR4CnPNg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, "node_modules/postcss-loader": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", @@ -28506,9 +28568,9 @@ "dev": true }, "node_modules/postcss-safe-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz", - "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", "dev": true, "funding": [ { @@ -28706,11 +28768,10 @@ "license": "BSD-2-Clause" }, "node_modules/postcss-svgo/node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -28812,9 +28873,9 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/preact": { - "version": "10.24.3", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.3.tgz", - "integrity": "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==", + "version": "10.25.4", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.25.4.tgz", + "integrity": "sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -28993,13 +29054,10 @@ } }, "node_modules/proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, "engines": { "node": ">= 14" } @@ -29018,13 +29076,12 @@ } }, "node_modules/proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, - "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -29046,23 +29103,12 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, - "node_modules/ps-list": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-8.1.1.tgz", - "integrity": "sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "dev": true, + "optional": true }, "node_modules/psl": { "version": "1.8.0", @@ -29109,16 +29155,15 @@ } }, "node_modules/puppeteer-core": { - "version": "23.5.2", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.5.2.tgz", - "integrity": "sha512-UwPAX29EID8lJmxeL7JT3Gz35D1BHn5o9ZXpBLoR24W7gtUg1dLx7OUPsUTR5Tlxf+1Yeqw9W3qP4uqWThqXgg==", + "version": "23.11.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.11.1.tgz", + "integrity": "sha512-3HZ2/7hdDKZvZQ7dhhITOUg4/wOrDRjyK2ZBllRB0ZCOi9u0cwq1ACHDjBB+nX+7+kltHjQvBRdeY7+W0T+7Gg==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.4.0", - "chromium-bidi": "0.8.0", - "debug": "^4.3.7", - "devtools-protocol": "0.0.1342118", + "@puppeteer/browsers": "2.6.1", + "chromium-bidi": "0.11.0", + "debug": "^4.4.0", + "devtools-protocol": "0.0.1367902", "typed-query-selector": "^2.12.0", "ws": "^8.18.0" }, @@ -29127,15 +29172,15 @@ } }, "node_modules/puppeteer-core/node_modules/@puppeteer/browsers": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.4.0.tgz", - "integrity": "sha512-x8J1csfIygOwf6D6qUAZ0ASk3z63zPb7wkNeHRerCMh82qWKUrOgkuP005AJC8lDL6/evtXETGEJVcwykKT4/g==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.6.1.tgz", + "integrity": "sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==", "dev": true, "dependencies": { - "debug": "^4.3.6", + "debug": "^4.4.0", "extract-zip": "^2.0.1", "progress": "^2.0.3", - "proxy-agent": "^6.4.0", + "proxy-agent": "^6.5.0", "semver": "^7.6.3", "tar-fs": "^3.0.6", "unbzip2-stream": "^1.4.3", @@ -29148,6 +29193,15 @@ "node": ">=18" } }, + "node_modules/puppeteer-core/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/puppeteer-core/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -29173,14 +29227,12 @@ } }, "node_modules/puppeteer-core/node_modules/chromium-bidi": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.8.0.tgz", - "integrity": "sha512-uJydbGdTw0DEUjhoogGveneJVWX/9YuqkWePzMmkBYwtdAqo5d3J/ovNKFr+/2hWXYmYCr6it8mSSTIj6SS6Ug==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.11.0.tgz", + "integrity": "sha512-6CJWHkNRoyZyjV9Rwv2lYONZf1Xm0IuDyNq97nwSsxxP3wf5Bwy15K5rOvVKMtJ127jJBmxFUanSAOjgFRxgrA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "mitt": "3.0.1", - "urlpattern-polyfill": "10.0.0", "zod": "3.23.8" }, "peerDependencies": { @@ -29220,9 +29272,9 @@ "dev": true }, "node_modules/puppeteer-core/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "dependencies": { "ms": "^2.1.3" @@ -29236,12 +29288,44 @@ } } }, + "node_modules/puppeteer-core/node_modules/devtools-protocol": { + "version": "0.0.1367902", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz", + "integrity": "sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==", + "dev": true + }, "node_modules/puppeteer-core/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/puppeteer-core/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/puppeteer-core/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/puppeteer-core/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -29251,17 +29335,38 @@ "node": ">=8" } }, - "node_modules/puppeteer-core/node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "node_modules/puppeteer-core/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=12" + } + }, + "node_modules/puppeteer-core/node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } }, "node_modules/puppeteer-core/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz", + "integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -29795,24 +29900,6 @@ } } }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/read-cache/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -29985,26 +30072,24 @@ } }, "node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "dependencies": { - "@babel/runtime": "^7.9.2" - } + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==" }, "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -30020,9 +30105,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -30037,9 +30122,9 @@ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" @@ -30059,15 +30144,17 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -30077,15 +30164,15 @@ } }, "node_modules/regexpu-core": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.1.tgz", - "integrity": "sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "dev": true, "dependencies": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, @@ -30093,27 +30180,24 @@ "node": ">=4" } }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true + }, "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "dev": true, "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, "node_modules/rememo": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/rememo/-/rememo-4.0.2.tgz", @@ -30280,18 +30364,20 @@ } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "license": "MIT", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -30457,6 +30543,11 @@ "node": ">=10.0.0" } }, + "node_modules/route-recognizer": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/route-recognizer/-/route-recognizer-0.3.4.tgz", + "integrity": "sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g==" + }, "node_modules/rtlcss": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-2.6.2.tgz", @@ -30473,101 +30564,6 @@ "rtlcss": "bin/rtlcss.js" } }, - "node_modules/rtlcss-webpack-plugin": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/rtlcss-webpack-plugin/-/rtlcss-webpack-plugin-4.0.7.tgz", - "integrity": "sha512-ouSbJtgcLBBQIsMgarxsDnfgRqm/AS4BKls/mz/Xb6HSl+PdEzefTR+Wz5uWQx4odoX0g261Z7yb3QBz0MTm0g==", - "dev": true, - "dependencies": { - "babel-runtime": "~6.25.0", - "rtlcss": "^3.5.0" - } - }, - "node_modules/rtlcss-webpack-plugin/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss-webpack-plugin/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss-webpack-plugin/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss-webpack-plugin/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss-webpack-plugin/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/rtlcss-webpack-plugin/node_modules/rtlcss": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz", - "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.3.11", - "strip-json-comments": "^3.1.1" - }, - "bin": { - "rtlcss": "bin/rtlcss.js" - } - }, "node_modules/rtlcss/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -30695,14 +30691,15 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -30743,6 +30740,28 @@ "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=", "dev": true }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", @@ -30753,14 +30772,14 @@ } }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -30942,30 +30961,29 @@ } }, "node_modules/sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.4.tgz", + "integrity": "sha512-LavLbgbBGUt3wCiYzhuLLu65+fWXaXLmq7YxivLhEqmiupCFZ5sKUAipK3do6V80YSU0jvSxNhEdT13IXNr3rg==", "dev": true, "dependencies": { - "klona": "^2.0.4", "neo-async": "^2.6.2" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" }, "peerDependenciesMeta": { - "fibers": { + "@rspack/core": { "optional": true }, "node-sass": { @@ -30976,15 +30994,17 @@ }, "sass-embedded": { "optional": true + }, + "webpack": { + "optional": true } } }, "node_modules/sass/node_modules/chokidar": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, - "license": "MIT", "dependencies": { "readdirp": "^4.0.1" }, @@ -30996,13 +31016,12 @@ } }, "node_modules/sass/node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", + "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", "dev": true, - "license": "MIT", "engines": { - "node": ">= 14.16.0" + "node": ">= 14.18.0" }, "funding": { "type": "individual", @@ -31309,17 +31328,17 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "dependencies": { - "define-data-property": "^1.1.2", + "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -31340,6 +31359,20 @@ "node": ">= 0.4" } }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -31429,6 +31462,7 @@ "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { "shebang-regex": "^1.0.0" }, @@ -31442,6 +31476,7 @@ "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, "license": "MIT", + "optional": true, "engines": { "node": ">=0.10.0" } @@ -31467,15 +31502,69 @@ } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -31871,9 +31960,9 @@ } }, "node_modules/socks": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.3.tgz", - "integrity": "sha512-vfuYK48HXCTFD03G/1/zkIls3Ebr2YNa4qU9gHDZdblHLiqhJrJGkY3+0Nx0JpN9qBhJbVObc1CNciT1bIZJxw==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, "dependencies": { "ip-address": "^9.0.5", @@ -31885,28 +31974,24 @@ } }, "node_modules/socks-proxy-agent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "^4.3.4", - "socks": "^2.7.1" + "socks": "^2.8.3" }, "engines": { "node": ">= 14" } }, "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, "engines": { "node": ">= 14" } @@ -32016,9 +32101,9 @@ "dev": true }, "node_modules/spawnd": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-9.0.2.tgz", - "integrity": "sha512-nl8DVHEDQ57IcKakzpjanspVChkMpGLuVwMR/eOn9cXE55Qr6luD2Kn06sA0ootRMdgrU4tInN6lA6ohTNvysw==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-10.1.4.tgz", + "integrity": "sha512-drqHc0mKJmtMsiGMOCwzlc5eZ0RPtRvT7tQAluW2A0qUc0G7TQ8KLcn3E6K5qzkLkH2UkS3nYQiVGULvvsD9dw==", "dev": true, "dependencies": { "signal-exit": "^4.1.0", @@ -32332,18 +32417,6 @@ "node": ">= 0.8" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/stream-from-promise": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stream-from-promise/-/stream-from-promise-1.0.0.tgz", @@ -32451,33 +32524,38 @@ } }, "node_modules/string.prototype.includes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", - "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", "dev": true, "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -32497,15 +32575,18 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -32515,15 +32596,19 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -32666,9 +32751,9 @@ } }, "node_modules/stylelint": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.9.0.tgz", - "integrity": "sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==", + "version": "16.14.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.14.1.tgz", + "integrity": "sha512-oqCL7AC3786oTax35T/nuLL8p2C3k/8rHKAooezrPGRvUX0wX+qqs5kMWh5YYT4PHQgVDobHT4tw55WgpYG6Sw==", "dev": true, "funding": [ { @@ -32681,44 +32766,43 @@ } ], "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", - "@csstools/media-query-list-parser": "^3.0.1", - "@csstools/selector-specificity": "^4.0.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2", + "@csstools/selector-specificity": "^5.0.0", "@dual-bundle/import-meta-resolve": "^4.1.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", "cosmiconfig": "^9.0.0", - "css-functions-list": "^3.2.2", - "css-tree": "^2.3.1", - "debug": "^4.3.6", - "fast-glob": "^3.3.2", + "css-functions-list": "^3.2.3", + "css-tree": "^3.1.0", + "debug": "^4.3.7", + "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^9.0.0", + "file-entry-cache": "^10.0.5", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", - "ignore": "^5.3.2", + "ignore": "^7.0.3", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.34.0", + "known-css-properties": "^0.35.0", "mathml-tag-names": "^2.1.3", "meow": "^13.2.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", - "picocolors": "^1.0.1", - "postcss": "^8.4.41", + "picocolors": "^1.1.1", + "postcss": "^8.5.1", "postcss-resolve-nested-selector": "^0.1.6", - "postcss-safe-parser": "^7.0.0", - "postcss-selector-parser": "^6.1.2", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", - "strip-ansi": "^7.1.0", "supports-hyperlinks": "^3.1.0", "svg-tags": "^1.0.0", - "table": "^6.8.2", + "table": "^6.9.0", "write-file-atomic": "^5.0.1" }, "bin": { @@ -32774,17 +32858,18 @@ } }, "node_modules/stylelint-scss": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.7.0.tgz", - "integrity": "sha512-RFIa2A+pVWS5wjNT+whtK7wsbZEWazyqesCuSaPbPlZ8lh2TujwVJSnCYJijg6ChZzwI8pZPRZS1L6A9aCbXDg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.11.0.tgz", + "integrity": "sha512-AvJ6LVzz2iXHxPlPTR9WVy73FC/vmohH54VySNlCKX1NIXNAeuzy/VbIkMJLMyw/xKYqkgY4kAgB+qy5BfCaCg==", "dev": true, "dependencies": { - "css-tree": "2.3.1", - "is-plain-object": "5.0.0", - "known-css-properties": "^0.34.0", + "css-tree": "^3.0.1", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.35.0", + "mdn-data": "^2.15.0", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.6", - "postcss-selector-parser": "^6.1.2", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -32795,34 +32880,73 @@ } }, "node_modules/stylelint-scss/node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", "dev": true, "dependencies": { - "mdn-data": "2.0.30", + "mdn-data": "2.12.2", "source-map-js": "^1.0.1" }, "engines": { "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, + "node_modules/stylelint-scss/node_modules/css-tree/node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true + }, "node_modules/stylelint-scss/node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.15.0.tgz", + "integrity": "sha512-KIrS0lFPOqA4DgeO16vI5fkAsy8p++WBlbXtB5P1EQs8ubBgguAInNd1DnrCeTRfGchY0kgThgDOOIPyOLH2dQ==", "dev": true }, - "node_modules/stylelint/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/stylelint-scss/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, "engines": { - "node": ">=12" + "node": ">=4" + } + }, + "node_modules/stylelint/node_modules/@csstools/media-query-list-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", + "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/stylelint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/stylelint/node_modules/argparse": { @@ -32876,12 +33000,12 @@ } }, "node_modules/stylelint/node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", "dev": true, "dependencies": { - "mdn-data": "2.0.30", + "mdn-data": "2.12.2", "source-map-js": "^1.0.1" }, "engines": { @@ -32889,9 +33013,9 @@ } }, "node_modules/stylelint/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "dependencies": { "ms": "^2.1.3" @@ -32912,15 +33036,12 @@ "dev": true }, "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", - "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.0.6.tgz", + "integrity": "sha512-0wvv16mVo9nN0Md3k7DMjgAPKG/TY4F/gYMBVb/wMThFRJvzrpaqBFqF6km9wf8QfYTN+mNg5aeaBLfy8k35uA==", "dev": true, "dependencies": { - "flat-cache": "^5.0.0" - }, - "engines": { - "node": ">=18" + "flat-cache": "^6.1.6" } }, "node_modules/stylelint/node_modules/fill-range": { @@ -32936,16 +33057,14 @@ } }, "node_modules/stylelint/node_modules/flat-cache": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", - "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.6.tgz", + "integrity": "sha512-F+CKgSwp0pzLx67u+Zy1aCueVWFAHWbXepvXlZ+bWVTaASbm5SyCnSJ80Fp1ePEmS57wU+Bf6cx6525qtMZ4lQ==", "dev": true, "dependencies": { - "flatted": "^3.3.1", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=18" + "cacheable": "^1.8.8", + "flatted": "^3.3.2", + "hookified": "^1.7.0" } }, "node_modules/stylelint/node_modules/global-modules": { @@ -32975,9 +33094,9 @@ } }, "node_modules/stylelint/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", + "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", "dev": true, "engines": { "node": ">= 4" @@ -33013,21 +33132,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/stylelint/node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/stylelint/node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, "node_modules/stylelint/node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -33038,9 +33142,9 @@ } }, "node_modules/stylelint/node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", "dev": true }, "node_modules/stylelint/node_modules/meow": { @@ -33068,6 +33172,47 @@ "node": ">=8.6" } }, + "node_modules/stylelint/node_modules/postcss": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/stylelint/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/stylelint/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -33103,16 +33248,7 @@ "node": ">=8" } }, - "node_modules/stylelint/node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint/node_modules/string-width/node_modules/strip-ansi": { + "node_modules/stylelint/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", @@ -33124,21 +33260,6 @@ "node": ">=8" } }, - "node_modules/stylelint/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/stylelint/node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -33185,6 +33306,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -33303,9 +33425,9 @@ "dev": true }, "node_modules/synckit": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", - "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", "dev": true, "dependencies": { "@pkgr/core": "^0.1.0", @@ -33319,9 +33441,9 @@ } }, "node_modules/table": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", - "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, "dependencies": { "ajv": "^8.0.1", @@ -33431,17 +33553,52 @@ } }, "node_modules/tar-fs": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", - "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", + "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", "dev": true, "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0" + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/tar-fs/node_modules/bare-fs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.0.1.tgz", + "integrity": "sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg==", + "dev": true, + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^3.0.0", + "bare-stream": "^2.0.0" + }, + "engines": { + "bare": ">=1.7.0" + } + }, + "node_modules/tar-fs/node_modules/bare-os": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.4.0.tgz", + "integrity": "sha512-9Ous7UlnKbe3fMi7Y+qh0DwAup6A1JkYgPnjvMDNOlmnxNRQvQ/7Nst+OnUQKzk0iAT0m9BisbDVp9gCv8+ETA==", + "dev": true, + "optional": true, + "engines": { + "bare": ">=1.6.0" + } + }, + "node_modules/tar-fs/node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "dev": true, + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" } }, "node_modules/tar-stream": { @@ -33652,9 +33809,9 @@ "dev": true }, "node_modules/third-party-web": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.23.4.tgz", - "integrity": "sha512-kwYnSZRhEvv0SBW2fp8SBBKRglMoBjV8xz6C31m0ewqOtknB5UL+Ihg+M81hyFY5ldkZuGWPb+e4GVDkzf/gYg==", + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.26.2.tgz", + "integrity": "sha512-taJ0Us0lKoYBqcbccMuDElSUPOxmBfwlHe1OkHQ3KFf+RwovvBHdXhbFk9XJVQE2vHzxbTwvwg5GFsT9hbDokQ==", "dev": true }, "node_modules/through": { @@ -33717,6 +33874,21 @@ "ms": "^2.1.1" } }, + "node_modules/tldts-core": { + "version": "6.1.75", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.75.tgz", + "integrity": "sha512-AOvV5YYIAFFBfransBzSTyztkc3IMfz5Eq3YluaRiEu55nn43Fzaufx70UqEKYr8BoLCach4q8g/bg6e5+/aFw==", + "dev": true + }, + "node_modules/tldts-icann": { + "version": "6.1.75", + "resolved": "https://registry.npmjs.org/tldts-icann/-/tldts-icann-6.1.75.tgz", + "integrity": "sha512-rCkEQd21uiOl+yKcX5DZ0mMd/DKl4f3NDTGH9zbSVG2tiRcJOx9MeBwPcbPr1u0kanopJnpzPEQJ+S2ky9iqFA==", + "dev": true, + "dependencies": { + "tldts-core": "^6.1.75" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -33742,14 +33914,6 @@ "dev": true, "optional": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, "node_modules/to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -33870,9 +34034,9 @@ } }, "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", "dev": true, "engines": { "node": ">=16" @@ -33915,10 +34079,9 @@ } }, "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "license": "0BSD" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -34007,30 +34170,30 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -34040,17 +34203,18 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -34060,17 +34224,17 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -34114,15 +34278,18 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -34166,9 +34333,9 @@ } }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, "engines": { "node": ">=4" @@ -34188,9 +34355,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "dev": true, "engines": { "node": ">=4" @@ -34519,11 +34686,11 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", + "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/util-deprecate": { @@ -35007,9 +35174,9 @@ "dev": true }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", @@ -35018,7 +35185,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -35135,9 +35302,9 @@ } }, "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", @@ -35146,7 +35313,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -35345,39 +35512,43 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-builtin-type": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, "dependencies": { + "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", + "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", + "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -35416,15 +35587,16 @@ "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" }, "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "for-each": "^0.3.3", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { @@ -35697,11 +35869,11 @@ } }, "node_modules/yjs": { - "version": "13.6.19", - "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.19.tgz", - "integrity": "sha512-GNKw4mEUn5yWU2QPHRx8jppxmCm9KzbBhB4qJLUJFiiYD0g/tDVgXQ7aPkyh01YO28kbs2J/BEbWBagjuWyejw==", + "version": "13.6.23", + "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.23.tgz", + "integrity": "sha512-ExtnT5WIOVpkL56bhLeisG/N5c4fmzKn4k0ROVfJa5TY2QHbH7F0Wu2T5ZhR7ErsFWQEFafyrnSI8TPKVF9Few==", "dependencies": { - "lib0": "^0.2.86" + "lib0": "^0.2.99" }, "engines": { "node": ">=16.0.0", diff --git a/package.json b/package.json index 16db3938e79dc..3dfc9bd5e92e9 100644 --- a/package.json +++ b/package.json @@ -27,12 +27,12 @@ "@lodder/grunt-postcss": "^3.1.1", "@playwright/test": "1.49.1", "@pmmmwh/react-refresh-webpack-plugin": "0.5.15", - "@wordpress/babel-preset-default": "8.8.2", - "@wordpress/dependency-extraction-webpack-plugin": "6.8.3", - "@wordpress/e2e-test-utils": "11.8.2", - "@wordpress/e2e-test-utils-playwright": "1.8.1", - "@wordpress/prettier-config": "4.8.1", - "@wordpress/scripts": "30.0.6", + "@wordpress/babel-preset-default": "8.17.0", + "@wordpress/dependency-extraction-webpack-plugin": "6.17.0", + "@wordpress/e2e-test-utils": "11.17.0", + "@wordpress/e2e-test-utils-playwright": "1.17.0", + "@wordpress/prettier-config": "4.17.0", + "@wordpress/scripts": "30.10.0", "autoprefixer": "10.4.20", "chalk": "5.3.0", "check-node-version": "4.2.1", @@ -78,73 +78,74 @@ "webpack-livereload-plugin": "3.0.2" }, "dependencies": { - "@wordpress/a11y": "4.8.2", - "@wordpress/annotations": "3.8.3", - "@wordpress/api-fetch": "7.8.2", - "@wordpress/autop": "4.8.1", - "@wordpress/blob": "4.8.1", - "@wordpress/block-directory": "5.8.18", - "@wordpress/block-editor": "14.3.15", - "@wordpress/block-library": "9.8.16", - "@wordpress/block-serialization-default-parser": "5.8.1", - "@wordpress/blocks": "13.8.5", - "@wordpress/commands": "1.8.11", - "@wordpress/components": "28.8.11", - "@wordpress/compose": "7.8.3", - "@wordpress/core-commands": "1.8.15", - "@wordpress/core-data": "7.8.15", - "@wordpress/customize-widgets": "5.8.16", - "@wordpress/data": "10.8.3", - "@wordpress/data-controls": "4.8.3", - "@wordpress/dataviews": "4.4.11", - "@wordpress/date": "5.8.2", - "@wordpress/deprecated": "4.8.2", - "@wordpress/dom": "4.8.2", - "@wordpress/dom-ready": "4.8.1", - "@wordpress/edit-post": "8.8.18", - "@wordpress/edit-site": "6.8.18", - "@wordpress/edit-widgets": "6.8.16", - "@wordpress/editor": "14.8.18", - "@wordpress/element": "6.8.1", - "@wordpress/escape-html": "3.8.1", - "@wordpress/fields": "0.0.16", - "@wordpress/format-library": "5.8.15", - "@wordpress/hooks": "4.8.2", - "@wordpress/html-entities": "4.8.1", - "@wordpress/i18n": "5.8.2", - "@wordpress/icons": "10.8.2", - "@wordpress/interactivity": "6.8.5", - "@wordpress/interactivity-router": "2.8.6", - "@wordpress/interface": "6.8.11", - "@wordpress/is-shallow-equal": "5.8.1", - "@wordpress/keyboard-shortcuts": "5.8.3", - "@wordpress/keycodes": "4.8.2", - "@wordpress/list-reusable-blocks": "5.8.11", - "@wordpress/media-utils": "5.8.2", - "@wordpress/notices": "5.8.3", - "@wordpress/nux": "9.8.11", - "@wordpress/patterns": "2.8.15", - "@wordpress/plugins": "7.8.11", - "@wordpress/preferences": "4.8.11", - "@wordpress/preferences-persistence": "2.8.2", - "@wordpress/primitives": "4.8.1", - "@wordpress/priority-queue": "3.8.1", - "@wordpress/private-apis": "1.8.1", - "@wordpress/redux-routine": "5.8.1", - "@wordpress/reusable-blocks": "5.8.15", - "@wordpress/rich-text": "7.8.3", - "@wordpress/router": "1.8.1", - "@wordpress/server-side-render": "5.8.11", - "@wordpress/shortcode": "4.8.1", - "@wordpress/style-engine": "2.8.1", - "@wordpress/sync": "1.8.1", - "@wordpress/token-list": "3.8.1", - "@wordpress/undo-manager": "1.8.1", - "@wordpress/url": "4.8.1", - "@wordpress/viewport": "6.8.3", - "@wordpress/warning": "3.8.1", - "@wordpress/widgets": "4.8.15", - "@wordpress/wordcount": "4.8.1", + "@wordpress/a11y": "4.17.0", + "@wordpress/annotations": "3.17.0", + "@wordpress/api-fetch": "7.17.0", + "@wordpress/autop": "4.17.0", + "@wordpress/blob": "4.17.0", + "@wordpress/block-directory": "5.17.1", + "@wordpress/block-editor": "14.12.0", + "@wordpress/block-library": "9.17.0", + "@wordpress/block-serialization-default-parser": "5.17.0", + "@wordpress/blocks": "14.6.0", + "@wordpress/commands": "1.17.0", + "@wordpress/components": "29.3.0", + "@wordpress/compose": "7.17.0", + "@wordpress/core-commands": "1.17.0", + "@wordpress/core-data": "7.17.0", + "@wordpress/customize-widgets": "5.17.0", + "@wordpress/data": "10.17.0", + "@wordpress/data-controls": "4.17.0", + "@wordpress/dataviews": "4.13.0", + "@wordpress/date": "5.17.0", + "@wordpress/deprecated": "4.17.0", + "@wordpress/dom": "4.17.0", + "@wordpress/dom-ready": "4.17.0", + "@wordpress/edit-post": "8.17.1", + "@wordpress/edit-site": "6.17.1", + "@wordpress/edit-widgets": "6.17.0", + "@wordpress/editor": "14.17.1", + "@wordpress/element": "6.17.0", + "@wordpress/escape-html": "3.17.0", + "@wordpress/fields": "0.9.0", + "@wordpress/format-library": "5.17.0", + "@wordpress/hooks": "4.17.0", + "@wordpress/html-entities": "4.17.0", + "@wordpress/i18n": "5.17.0", + "@wordpress/icons": "10.17.0", + "@wordpress/interactivity": "6.17.0", + "@wordpress/interactivity-router": "2.17.0", + "@wordpress/interface": "9.2.0", + "@wordpress/is-shallow-equal": "5.17.0", + "@wordpress/keyboard-shortcuts": "5.17.0", + "@wordpress/keycodes": "4.17.0", + "@wordpress/list-reusable-blocks": "5.17.0", + "@wordpress/media-utils": "5.17.0", + "@wordpress/notices": "5.17.0", + "@wordpress/nux": "9.17.0", + "@wordpress/patterns": "2.17.0", + "@wordpress/plugins": "7.17.0", + "@wordpress/preferences": "4.17.0", + "@wordpress/preferences-persistence": "2.17.0", + "@wordpress/primitives": "4.17.0", + "@wordpress/priority-queue": "3.17.0", + "@wordpress/private-apis": "1.17.0", + "@wordpress/redux-routine": "5.17.0", + "@wordpress/reusable-blocks": "5.17.0", + "@wordpress/rich-text": "7.17.0", + "@wordpress/router": "1.17.0", + "@wordpress/server-side-render": "5.17.0", + "@wordpress/shortcode": "4.17.0", + "@wordpress/style-engine": "2.17.0", + "@wordpress/sync": "1.17.0", + "@wordpress/token-list": "3.17.0", + "@wordpress/undo-manager": "1.17.0", + "@wordpress/upload-media": "0.2.0", + "@wordpress/url": "4.17.0", + "@wordpress/viewport": "6.17.0", + "@wordpress/warning": "3.17.0", + "@wordpress/widgets": "4.17.0", + "@wordpress/wordcount": "4.17.0", "backbone": "1.6.0", "clipboard": "2.0.11", "core-js-url-browser": "3.6.4", diff --git a/src/wp-includes/assets/script-loader-packages.min.php b/src/wp-includes/assets/script-loader-packages.min.php index 9575fa64e4936..221dce78e723b 100644 --- a/src/wp-includes/assets/script-loader-packages.min.php +++ b/src/wp-includes/assets/script-loader-packages.min.php @@ -1 +1 @@ -<?php return array('a11y.min.js' => array('dependencies' => array('wp-dom-ready', 'wp-i18n'), 'version' => '3156534cc54473497e14'), 'annotations.min.js' => array('dependencies' => array('wp-data', 'wp-hooks', 'wp-i18n', 'wp-rich-text'), 'version' => '238360e96c76d37a2468'), 'api-fetch.min.js' => array('dependencies' => array('wp-i18n', 'wp-url'), 'version' => 'd387b816bc1ed2042e28'), 'autop.min.js' => array('dependencies' => array(), 'version' => '9fb50649848277dd318d'), 'blob.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '9113eed771d446f4a556'), 'block-directory.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-plugins', 'wp-primitives', 'wp-url'), 'version' => '39151ef09cafcf3bcb90'), 'block-editor.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-style-engine', 'wp-token-list', 'wp-url', 'wp-warning', 'wp-wordcount'), 'version' => '1bc1536e843749059e17'), 'block-library.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-autop', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-patterns', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-wordcount'), 'version' => '7a4a3cb731837c04e244'), 'block-serialization-default-parser.min.js' => array('dependencies' => array(), 'version' => '14d44daebf663d05d330'), 'blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-autop', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-private-apis', 'wp-rich-text', 'wp-shortcode', 'wp-warning'), 'version' => 'cb271b6aaf12433d00f9'), 'commands.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-primitives', 'wp-private-apis'), 'version' => 'dd13db18ea4531d4fd4f'), 'components.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-compose', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-warning'), 'version' => '9d6405d1df52523cdb7c'), 'compose.min.js' => array('dependencies' => array('react', 'react-jsx-runtime', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-priority-queue'), 'version' => '85dec7c8cc97a2154328'), 'core-commands.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-commands', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-private-apis', 'wp-router', 'wp-url'), 'version' => 'e398c3f43e502a9c4a8f'), 'core-data.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-private-apis', 'wp-rich-text', 'wp-url', 'wp-warning'), 'version' => 'd2e4efaae0db8468d384'), 'customize-widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-widgets'), 'version' => '37501962aef2167588ae'), 'data.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-is-shallow-equal', 'wp-priority-queue', 'wp-private-apis', 'wp-redux-routine'), 'version' => 'fcf175d67ec974dde948'), 'data-controls.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-data', 'wp-deprecated'), 'version' => '49f5587e8b90f9e7cc7e'), 'date.min.js' => array('dependencies' => array('moment', 'wp-deprecated'), 'version' => 'b2f083170ed22ebef396'), 'deprecated.min.js' => array('dependencies' => array('wp-hooks'), 'version' => 'e1f84915c5e8ae38964c'), 'dom.min.js' => array('dependencies' => array('wp-deprecated'), 'version' => '93117dfee2692b04b770'), 'dom-ready.min.js' => array('dependencies' => array(), 'version' => 'f77871ff7694fffea381'), 'edit-post.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-plugins', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-widgets'), 'version' => '7afeea389faaa086488e'), 'edit-site.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-priority-queue', 'wp-private-apis', 'wp-router', 'wp-url', 'wp-warning', 'wp-widgets'), 'version' => '65ffcc054ba0879fe4a8'), 'edit-widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-viewport', 'wp-widgets'), 'version' => '0837e3a0f72404eceec8'), 'editor.min.js' => array('dependencies' => array('react', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport', 'wp-warning', 'wp-wordcount'), 'version' => 'b248ed022e6a138978b3'), 'element.min.js' => array('dependencies' => array('react', 'react-dom', 'wp-escape-html'), 'version' => 'a4eeeadd23c0d7ab1d2d'), 'escape-html.min.js' => array('dependencies' => array(), 'version' => '6561a406d2d232a6fbd2'), 'fields.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-blob', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-patterns', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => '464fc3ce3c9ae20da608'), 'format-library.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-url'), 'version' => '86d7a5d57cc8dd223bba'), 'hooks.min.js' => array('dependencies' => array(), 'version' => '4d63a3d491d11ffd8ac6'), 'html-entities.min.js' => array('dependencies' => array(), 'version' => '2cd3358363e0675638fb'), 'i18n.min.js' => array('dependencies' => array('wp-hooks'), 'version' => '5e580eb46a90c2b997e6'), 'is-shallow-equal.min.js' => array('dependencies' => array(), 'version' => 'e0f9f1d78d83f5196979'), 'keyboard-shortcuts.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-data', 'wp-element', 'wp-keycodes'), 'version' => '32686e58e84193ce808b'), 'keycodes.min.js' => array('dependencies' => array('wp-i18n'), 'version' => '034ff647a54b018581d3'), 'list-reusable-blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-blob', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n'), 'version' => 'ece12b3c74315b4175ef'), 'media-utils.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-blob', 'wp-element', 'wp-i18n'), 'version' => 'e10cc6bfcff4fe474479'), 'notices.min.js' => array('dependencies' => array('wp-data'), 'version' => '673a68a7ac2f556ed50b'), 'nux.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-primitives'), 'version' => '9a0dc535fe222ae46a48'), 'patterns.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => '712ca62469c7d6090da8'), 'plugins.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-element', 'wp-hooks', 'wp-is-shallow-equal', 'wp-primitives'), 'version' => 'ef6da4a9b2747b62c09c'), 'preferences.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-primitives', 'wp-private-apis'), 'version' => '859dd2db2fdba6f5c726'), 'preferences-persistence.min.js' => array('dependencies' => array('wp-api-fetch'), 'version' => '9307a8c9e3254140a223'), 'primitives.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-element'), 'version' => 'aef2543ab60c8c9bb609'), 'priority-queue.min.js' => array('dependencies' => array(), 'version' => '9c21c957c7e50ffdbf48'), 'private-apis.min.js' => array('dependencies' => array(), 'version' => '4b858962c15c2c7a135f'), 'redux-routine.min.js' => array('dependencies' => array(), 'version' => '71b945a4f0f8ce5a037d'), 'reusable-blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-url'), 'version' => '73735a77e4e5095733da'), 'rich-text.min.js' => array('dependencies' => array('wp-a11y', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-escape-html', 'wp-i18n', 'wp-keycodes'), 'version' => '4021b9e4e9ef4d3cd868'), 'router.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-element', 'wp-polyfill', 'wp-private-apis', 'wp-url'), 'version' => 'e4887fecc16ef03e908f'), 'server-side-render.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-i18n', 'wp-url'), 'version' => '345a014347e34be995f0'), 'shortcode.min.js' => array('dependencies' => array(), 'version' => 'b7747eee0efafd2f0c3b'), 'style-engine.min.js' => array('dependencies' => array(), 'version' => '08cc10e9532531e22456'), 'token-list.min.js' => array('dependencies' => array(), 'version' => '3b5f5dcfde830ecef24f'), 'undo-manager.min.js' => array('dependencies' => array('wp-is-shallow-equal'), 'version' => '531015dcaa7cee31c780'), 'url.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'e87eb76272a3a08402d2'), 'viewport.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-data'), 'version' => '829c9a30d366e1e5054c'), 'warning.min.js' => array('dependencies' => array(), 'version' => 'ed7c8b0940914f4fe44b'), 'widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives'), 'version' => '45d6328bc40634dbcd7b'), 'wordcount.min.js' => array('dependencies' => array(), 'version' => '55d8c2bf3dc99e7ea5ec')); +<?php return array('a11y.min.js' => array('dependencies' => array('wp-dom-ready', 'wp-i18n'), 'version' => '3156534cc54473497e14'), 'annotations.min.js' => array('dependencies' => array('wp-data', 'wp-hooks', 'wp-i18n', 'wp-polyfill', 'wp-rich-text'), 'version' => '238360e96c76d37a2468'), 'api-fetch.min.js' => array('dependencies' => array('wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => 'd387b816bc1ed2042e28'), 'autop.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '9fb50649848277dd318d'), 'blob.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '9113eed771d446f4a556'), 'block-directory.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-primitives', 'wp-url'), 'version' => 'd8a269fde03418b64180'), 'block-editor.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-priority-queue', 'wp-private-apis', 'wp-rich-text', 'wp-style-engine', 'wp-token-list', 'wp-url', 'wp-warning'), 'version' => 'ce3d5d2e20d8f6bda917'), 'block-library.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-autop', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-patterns', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-wordcount'), 'version' => 'd405c7e531dc6e50c014'), 'block-serialization-default-parser.min.js' => array('dependencies' => array(), 'version' => '14d44daebf663d05d330'), 'blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-autop', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-private-apis', 'wp-rich-text', 'wp-shortcode', 'wp-warning'), 'version' => '67f3e2ba423886e1dc3f'), 'commands.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-polyfill', 'wp-primitives', 'wp-private-apis'), 'version' => '14ee29ad1743be844b11'), 'components.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-compose', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-warning'), 'version' => '5b49120970e7868c95f0'), 'compose.min.js' => array('dependencies' => array('react', 'react-jsx-runtime', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-priority-queue'), 'version' => '6f9fbd442ced90fef1d1'), 'core-commands.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-commands', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-router', 'wp-url'), 'version' => 'afcb83dba96ea45361e9'), 'core-data.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-private-apis', 'wp-rich-text', 'wp-url', 'wp-warning'), 'version' => '4dec9b0d8d354bec1705'), 'customize-widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-widgets'), 'version' => '42a5462097681fd98f6f'), 'data.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-priority-queue', 'wp-private-apis', 'wp-redux-routine'), 'version' => 'fe6c4835cd00e12493c3'), 'data-controls.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-data', 'wp-deprecated'), 'version' => '49f5587e8b90f9e7cc7e'), 'date.min.js' => array('dependencies' => array('moment', 'wp-deprecated', 'wp-polyfill'), 'version' => 'b2f083170ed22ebef396'), 'deprecated.min.js' => array('dependencies' => array('wp-hooks'), 'version' => 'e1f84915c5e8ae38964c'), 'dom.min.js' => array('dependencies' => array('wp-deprecated', 'wp-polyfill'), 'version' => 'f3a673a30f968c8fa314'), 'dom-ready.min.js' => array('dependencies' => array(), 'version' => 'f77871ff7694fffea381'), 'edit-post.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-widgets'), 'version' => 'b749ebe90a93e194856d'), 'edit-site.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-router', 'wp-url', 'wp-warning', 'wp-widgets'), 'version' => 'cfab9252db425f7d1382'), 'edit-widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-viewport', 'wp-widgets'), 'version' => '9a04bb29c0759b535e9e'), 'editor.min.js' => array('dependencies' => array('react', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport', 'wp-warning', 'wp-wordcount'), 'version' => '0eea218f1b31f50a0f83'), 'element.min.js' => array('dependencies' => array('react', 'react-dom', 'wp-escape-html', 'wp-polyfill'), 'version' => 'a4eeeadd23c0d7ab1d2d'), 'escape-html.min.js' => array('dependencies' => array(), 'version' => '6561a406d2d232a6fbd2'), 'format-library.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-url'), 'version' => '91ae6249c6d0e3b00770'), 'hooks.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '4d63a3d491d11ffd8ac6'), 'html-entities.min.js' => array('dependencies' => array(), 'version' => '2cd3358363e0675638fb'), 'i18n.min.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => '5e580eb46a90c2b997e6'), 'is-shallow-equal.min.js' => array('dependencies' => array(), 'version' => 'e0f9f1d78d83f5196979'), 'keyboard-shortcuts.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-data', 'wp-element', 'wp-keycodes', 'wp-polyfill'), 'version' => '32686e58e84193ce808b'), 'keycodes.min.js' => array('dependencies' => array('wp-i18n', 'wp-polyfill'), 'version' => '034ff647a54b018581d3'), 'list-reusable-blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-blob', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n'), 'version' => 'ece12b3c74315b4175ef'), 'media-utils.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-blob', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-private-apis'), 'version' => 'b0c1e943915981479f43'), 'notices.min.js' => array('dependencies' => array('wp-data', 'wp-polyfill'), 'version' => '673a68a7ac2f556ed50b'), 'nux.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives'), 'version' => '9a0dc535fe222ae46a48'), 'patterns.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => '6497476653868ae9d711'), 'plugins.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-hooks', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-primitives'), 'version' => '20303a2de19246c83e5a'), 'preferences.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives', 'wp-private-apis'), 'version' => '4aa23582b858c882a887'), 'preferences-persistence.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-polyfill'), 'version' => '9307a8c9e3254140a223'), 'primitives.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-element'), 'version' => 'aef2543ab60c8c9bb609'), 'priority-queue.min.js' => array('dependencies' => array(), 'version' => '9c21c957c7e50ffdbf48'), 'private-apis.min.js' => array('dependencies' => array(), 'version' => '0f8478f1ba7e0eea562b'), 'redux-routine.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '71b945a4f0f8ce5a037d'), 'reusable-blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-url'), 'version' => '73735a77e4e5095733da'), 'rich-text.min.js' => array('dependencies' => array('wp-a11y', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-escape-html', 'wp-i18n', 'wp-keycodes', 'wp-polyfill'), 'version' => '74178fc8c4d67d66f1a8'), 'router.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-element', 'wp-polyfill', 'wp-private-apis', 'wp-url'), 'version' => '517fbc2dbcabd4a86568'), 'server-side-render.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-i18n', 'wp-url'), 'version' => '345a014347e34be995f0'), 'shortcode.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'b7747eee0efafd2f0c3b'), 'style-engine.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '08cc10e9532531e22456'), 'token-list.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '3b5f5dcfde830ecef24f'), 'url.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'e87eb76272a3a08402d2'), 'viewport.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-data', 'wp-polyfill'), 'version' => '829c9a30d366e1e5054c'), 'warning.min.js' => array('dependencies' => array(), 'version' => 'ed7c8b0940914f4fe44b'), 'widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives'), 'version' => '0b561f75d41627a9d110'), 'wordcount.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '55d8c2bf3dc99e7ea5ec')); diff --git a/src/wp-includes/assets/script-modules-packages.min.php b/src/wp-includes/assets/script-modules-packages.min.php index d781885650e5a..953466394b1f0 100644 --- a/src/wp-includes/assets/script-modules-packages.min.php +++ b/src/wp-includes/assets/script-modules-packages.min.php @@ -1 +1 @@ -<?php return array('interactivity/index.min.js' => array('dependencies' => array(), 'version' => '04d9948c85e9600ec2a5', 'type' => 'module'), 'interactivity/debug.min.js' => array('dependencies' => array(), 'version' => '03be8c2fdc10a676f363', 'type' => 'module'), 'interactivity-router/index.min.js' => array('dependencies' => array('@wordpress/interactivity', array('id' => '@wordpress/a11y', 'import' => 'dynamic')), 'version' => '2a2ef420d37f6e7e08a0', 'type' => 'module'), 'a11y/index.min.js' => array('dependencies' => array(), 'version' => 'b7d06936b8bc23cff2ad', 'type' => 'module'), 'block-library/file/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => 'fdc2f6842e015af83140', 'type' => 'module'), 'block-library/image/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => 'acfec7b3c0be4a859b31', 'type' => 'module'), 'block-library/navigation/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => '8ff192874fc8910a284c', 'type' => 'module'), 'block-library/query/view.min.js' => array('dependencies' => array('@wordpress/interactivity', array('id' => '@wordpress/interactivity-router', 'import' => 'dynamic')), 'version' => '0661ecffc048a34462c0', 'type' => 'module'), 'block-library/search/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => '2a73400a693958f604de', 'type' => 'module')); +<?php return array('interactivity/index.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'a525209c03a87e74ec45', 'type' => 'module'), 'interactivity/debug.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'b1a15c164ed27698ef82', 'type' => 'module'), 'interactivity-router/index.min.js' => array('dependencies' => array('@wordpress/interactivity', 'wp-polyfill', array('id' => '@wordpress/a11y', 'import' => 'dynamic')), 'version' => '0f01f519e3dce3ad547a', 'type' => 'module'), 'a11y/index.min.js' => array('dependencies' => array(), 'version' => 'b7d06936b8bc23cff2ad', 'type' => 'module'), 'block-library/file/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => 'fdc2f6842e015af83140', 'type' => 'module'), 'block-library/form/view.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'baaf25398238b4f2a821', 'type' => 'module'), 'block-library/image/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => '8f7f3c854009ae207c29', 'type' => 'module'), 'block-library/navigation/view.min.js' => array('dependencies' => array('@wordpress/interactivity', 'wp-polyfill'), 'version' => '8ff192874fc8910a284c', 'type' => 'module'), 'block-library/query/view.min.js' => array('dependencies' => array('@wordpress/interactivity', array('id' => '@wordpress/interactivity-router', 'import' => 'dynamic')), 'version' => '0661ecffc048a34462c0', 'type' => 'module'), 'block-library/search/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => '2a73400a693958f604de', 'type' => 'module')); diff --git a/src/wp-includes/block-editor.php b/src/wp-includes/block-editor.php index bdca0d2c08528..007c713190c45 100644 --- a/src/wp-includes/block-editor.php +++ b/src/wp-includes/block-editor.php @@ -223,6 +223,7 @@ function get_default_block_editor_settings() { 'imageEditing' => true, 'imageSizes' => $available_image_sizes, 'maxUploadFileSize' => $max_upload_size, + '__experimentalDashboardLink' => admin_url( '/' ), // The following flag is required to enable the new Gallery block format on the mobile apps in 5.9. '__unstableGalleryWithImageBlocks' => true, ); diff --git a/src/wp-includes/blocks/archives/block.json b/src/wp-includes/blocks/archives/block.json index e36691f3143c2..7fe956a994ed5 100644 --- a/src/wp-includes/blocks/archives/block.json +++ b/src/wp-includes/blocks/archives/block.json @@ -26,6 +26,12 @@ }, "supports": { "align": true, + "__experimentalBorder": { + "radius": true, + "color": true, + "width": true, + "style": true + }, "html": false, "spacing": { "margin": true, diff --git a/src/wp-includes/blocks/block.php b/src/wp-includes/blocks/block.php index 8beef975fad6f..e8075115cabda 100644 --- a/src/wp-includes/blocks/block.php +++ b/src/wp-includes/blocks/block.php @@ -87,6 +87,26 @@ function render_block_core_block( $attributes ) { add_filter( 'render_block_context', $filter_block_context, 1 ); } + $ignored_hooked_blocks = get_post_meta( $attributes['ref'], '_wp_ignored_hooked_blocks', true ); + if ( ! empty( $ignored_hooked_blocks ) ) { + $ignored_hooked_blocks = json_decode( $ignored_hooked_blocks, true ); + $attributes['metadata'] = array( + 'ignoredHookedBlocks' => $ignored_hooked_blocks, + ); + } + + // Wrap in "Block" block so the Block Hooks algorithm can insert blocks + // that are hooked as first or last child of `core/block`. + $content = get_comment_delimited_block_content( + 'core/block', + $attributes, + $content + ); + // Apply Block Hooks. + $content = apply_block_hooks_to_content( $content, $reusable_block ); + // Remove block wrapper. + $content = remove_serialized_parent_block( $content ); + $content = do_blocks( $content ); unset( $seen_refs[ $attributes['ref'] ] ); diff --git a/src/wp-includes/blocks/blocks-json.php b/src/wp-includes/blocks/blocks-json.php index b297700b8729b..4fd10f0b63647 100644 --- a/src/wp-includes/blocks/blocks-json.php +++ b/src/wp-includes/blocks/blocks-json.php @@ -27,6 +27,12 @@ ), 'supports' => array( 'align' => true, + '__experimentalBorder' => array( + 'radius' => true, + 'color' => true, + 'width' => true, + 'style' => true + ), 'html' => false, 'spacing' => array( 'margin' => true, @@ -324,6 +330,16 @@ ) ), 'typography' => array( + '__experimentalSkipSerialization' => array( + 'fontSize', + 'lineHeight', + 'fontFamily', + 'fontWeight', + 'fontStyle', + 'textTransform', + 'textDecoration', + 'letterSpacing' + ), 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, @@ -364,7 +380,6 @@ 'width' => true ) ), - '__experimentalSelector' => '.wp-block-button .wp-block-button__link', 'interactivity' => array( 'clientNavigation' => true ) @@ -381,7 +396,13 @@ ) ), 'editorStyle' => 'wp-block-button-editor', - 'style' => 'wp-block-button' + 'style' => 'wp-block-button', + 'selectors' => array( + 'root' => '.wp-block-button .wp-block-button__link', + 'typography' => array( + 'writingMode' => '.wp-block-button' + ) + ) ), 'buttons' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', @@ -1314,6 +1335,18 @@ '__experimentalDefaultControls' => array( 'fontSize' => true ) + ), + '__experimentalBorder' => array( + 'radius' => true, + 'color' => true, + 'width' => true, + 'style' => true, + '__experimentalDefaultControls' => array( + 'radius' => true, + 'color' => true, + 'width' => true, + 'style' => true + ) ) ), 'editorStyle' => 'wp-block-comments-editor', @@ -1344,6 +1377,11 @@ 'default' => 'none' ) ), + 'example' => array( + 'attributes' => array( + 'paginationArrow' => 'none' + ) + ), 'providesContext' => array( 'comments/paginationArrow' => 'paginationArrow' ), @@ -1690,6 +1728,9 @@ 'tagName' => array( 'type' => 'string', 'default' => 'div' + ), + 'sizeSlug' => array( + 'type' => 'string' ) ), 'usesContext' => array( @@ -1784,6 +1825,18 @@ 'type' => 'rich-text', 'source' => 'rich-text', 'selector' => 'summary' + ), + 'name' => array( + 'type' => 'string', + 'source' => 'attribute', + 'attribute' => 'name', + 'selector' => '.wp-block-details' + ), + 'allowedBlocks' => array( + 'type' => 'array' + ), + 'placeholder' => array( + 'type' => 'string' ) ), 'supports' => array( @@ -1792,6 +1845,7 @@ 'wide', 'full' ), + 'anchor' => true, 'color' => array( 'gradients' => true, 'link' => true, @@ -1914,7 +1968,8 @@ 'role' => 'local' ), 'href' => array( - 'type' => 'string' + 'type' => 'string', + 'role' => 'content' ), 'fileId' => array( 'type' => 'string', @@ -1925,13 +1980,15 @@ 'fileName' => array( 'type' => 'rich-text', 'source' => 'rich-text', - 'selector' => 'a:not([download])' + 'selector' => 'a:not([download])', + 'role' => 'content' ), 'textLinkHref' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'a:not([download])', - 'attribute' => 'href' + 'attribute' => 'href', + 'role' => 'content' ), 'textLinkTarget' => array( 'type' => 'string', @@ -1946,7 +2003,8 @@ 'downloadButtonText' => array( 'type' => 'rich-text', 'source' => 'rich-text', - 'selector' => 'a[download]' + 'selector' => 'a[download]', + 'role' => 'content' ), 'displayPreview' => array( 'type' => 'boolean' @@ -2420,13 +2478,7 @@ 'color' => true, 'radius' => true, 'style' => true, - 'width' => true, - '__experimentalDefaultControls' => array( - 'color' => true, - 'radius' => true, - 'style' => true, - 'width' => true - ) + 'width' => true ), 'color' => array( 'gradients' => true, @@ -2551,7 +2603,10 @@ 'usesContext' => array( 'allowResize', 'imageCrop', - 'fixedHeight' + 'fixedHeight', + 'postId', + 'postType', + 'queryId' ), 'description' => 'Insert an image to make a visual statement.', 'keywords' => array( @@ -2889,6 +2944,18 @@ 'fontSize' => true ) ), + '__experimentalBorder' => array( + 'radius' => true, + 'color' => true, + 'width' => true, + 'style' => true, + '__experimentalDefaultControls' => array( + 'radius' => true, + 'color' => true, + 'width' => true, + 'style' => true + ) + ), 'interactivity' => array( 'clientNavigation' => true ) @@ -3027,7 +3094,7 @@ '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/list-item', - 'title' => 'List item', + 'title' => 'List Item', 'category' => 'text', 'parent' => array( 'core/list' @@ -3808,6 +3875,31 @@ ), 'interactivity' => array( 'clientNavigation' => true + ), + 'color' => array( + 'text' => true, + 'background' => true, + 'link' => true, + 'gradients' => true, + '__experimentalDefaultControls' => array( + 'background' => true, + 'text' => true, + 'link' => true + ) + ), + '__experimentalBorder' => array( + 'radius' => true, + 'color' => true, + 'width' => true, + 'style' => true + ), + 'spacing' => array( + 'padding' => true, + 'margin' => true, + '__experimentalDefaultControls' => array( + 'padding' => false, + 'margin' => false + ) ) ), 'editorStyle' => 'wp-block-page-list-editor', @@ -3963,7 +4055,7 @@ '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/pattern', - 'title' => 'Pattern placeholder', + 'title' => 'Pattern Placeholder', 'category' => 'theme', 'description' => 'Show a block pattern.', 'supports' => array( @@ -4009,11 +4101,13 @@ ), 'isLink' => array( 'type' => 'boolean', - 'default' => false + 'default' => false, + 'role' => 'content' ), 'linkTarget' => array( 'type' => 'string', - 'default' => '_self' + 'default' => '_self', + 'role' => 'content' ) ), 'usesContext' => array( @@ -4146,11 +4240,13 @@ ), 'isLink' => array( 'type' => 'boolean', - 'default' => false + 'default' => false, + 'role' => 'content' ), 'linkTarget' => array( 'type' => 'string', - 'default' => '_self' + 'default' => '_self', + 'role' => 'content' ) ), 'usesContext' => array( @@ -4267,6 +4363,11 @@ 'wp-block-post-comments-form', 'wp-block-buttons', 'wp-block-button' + ), + 'example' => array( + 'attributes' => array( + 'textAlign' => 'center' + ) ) ), 'post-content' => array( @@ -4305,6 +4406,7 @@ 'spacing' => array( 'blockGap' => true, 'padding' => true, + 'margin' => true, '__experimentalDefaultControls' => array( 'margin' => false, 'padding' => false @@ -4312,6 +4414,7 @@ ), 'color' => array( 'gradients' => true, + 'heading' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => false, @@ -4330,6 +4433,18 @@ '__experimentalDefaultControls' => array( 'fontSize' => true ) + ), + '__experimentalBorder' => array( + 'radius' => true, + 'color' => true, + 'width' => true, + 'style' => true, + '__experimentalDefaultControls' => array( + 'radius' => true, + 'color' => true, + 'width' => true, + 'style' => true + ) ) ), 'style' => 'wp-block-post-content', @@ -4352,7 +4467,8 @@ ), 'isLink' => array( 'type' => 'boolean', - 'default' => false + 'default' => false, + 'role' => 'content' ), 'displayType' => array( 'type' => 'string', @@ -4502,7 +4618,8 @@ 'attributes' => array( 'isLink' => array( 'type' => 'boolean', - 'default' => false + 'default' => false, + 'role' => 'content' ), 'aspectRatio' => array( 'type' => 'string' @@ -4523,11 +4640,13 @@ 'rel' => array( 'type' => 'string', 'attribute' => 'rel', - 'default' => '' + 'default' => '', + 'role' => 'content' ), 'linkTarget' => array( 'type' => 'string', - 'default' => '_self' + 'default' => '_self', + 'role' => 'content' ), 'overlayColor' => array( 'type' => 'string' @@ -4677,7 +4796,7 @@ 'name' => 'core/post-template', 'title' => 'Post Template', 'category' => 'theme', - 'parent' => array( + 'ancestor' => array( 'core/query' ), 'description' => 'Contains the block elements used to render a post, like the title, date, featured image, content or excerpt, and more.', @@ -4688,7 +4807,8 @@ 'displayLayout', 'templateSlug', 'previewPostType', - 'enhancedPagination' + 'enhancedPagination', + 'postType' ), 'supports' => array( 'reusable' => false, @@ -4720,15 +4840,25 @@ ) ), 'spacing' => array( + 'margin' => true, + 'padding' => true, 'blockGap' => array( '__experimentalDefault' => '1.25em' ), '__experimentalDefaultControls' => array( - 'blockGap' => true + 'blockGap' => true, + 'padding' => false, + 'margin' => false ) ), 'interactivity' => array( 'clientNavigation' => true + ), + '__experimentalBorder' => array( + 'radius' => true, + 'color' => true, + 'width' => true, + 'style' => true ) ), 'style' => 'wp-block-post-template', @@ -4841,16 +4971,19 @@ ), 'isLink' => array( 'type' => 'boolean', - 'default' => false + 'default' => false, + 'role' => 'content' ), 'rel' => array( 'type' => 'string', 'attribute' => 'rel', - 'default' => '' + 'default' => '', + 'role' => 'content' ), 'linkTarget' => array( 'type' => 'string', - 'default' => '_self' + 'default' => '_self', + 'role' => 'content' ) ), 'example' => array( @@ -5071,6 +5204,13 @@ 'title' => 'Query Loop', 'category' => 'theme', 'description' => 'An advanced block that allows displaying post types based on different query parameters and visual configurations.', + 'keywords' => array( + 'posts', + 'list', + 'blog', + 'blogs', + 'custom post types' + ), 'textdomain' => 'default', 'attributes' => array( 'queryId' => array( @@ -5114,7 +5254,7 @@ ) ), 'usesContext' => array( - 'postType' + 'templateSlug' ), 'providesContext' => array( 'queryId' => 'queryId', @@ -5137,10 +5277,10 @@ '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/query-no-results', - 'title' => 'No results', + 'title' => 'No Results', 'category' => 'theme', 'description' => 'Contains the block elements used to render content when no query results are found.', - 'parent' => array( + 'ancestor' => array( 'core/query' ), 'textdomain' => 'default', @@ -5432,6 +5572,11 @@ 'default' => true ) ), + 'example' => array( + 'attributes' => array( + 'type' => 'search' + ) + ), 'supports' => array( 'align' => array( 'wide', @@ -5480,6 +5625,72 @@ ), 'style' => 'wp-block-query-title' ), + 'query-total' => array( + '$schema' => 'https://schemas.wp.org/trunk/block.json', + 'apiVersion' => 3, + 'name' => 'core/query-total', + 'title' => 'Query Total', + 'category' => 'theme', + 'ancestor' => array( + 'core/query' + ), + 'description' => 'Display the total number of results in a query.', + 'textdomain' => 'default', + 'attributes' => array( + 'displayType' => array( + 'type' => 'string', + 'default' => 'total-results' + ) + ), + 'usesContext' => array( + 'queryId', + 'query' + ), + 'supports' => array( + 'align' => array( + 'wide', + 'full' + ), + 'html' => false, + 'spacing' => array( + 'margin' => true, + 'padding' => true + ), + 'color' => array( + 'gradients' => true, + 'text' => true, + '__experimentalDefaultControls' => array( + 'background' => true + ) + ), + 'typography' => array( + 'fontSize' => true, + 'lineHeight' => true, + '__experimentalFontFamily' => true, + '__experimentalFontWeight' => true, + '__experimentalFontStyle' => true, + '__experimentalTextTransform' => true, + '__experimentalTextDecoration' => true, + '__experimentalLetterSpacing' => true, + '__experimentalDefaultControls' => array( + 'fontSize' => true + ) + ), + '__experimentalBorder' => array( + 'radius' => true, + 'color' => true, + 'width' => true, + 'style' => true, + '__experimentalDefaultControls' => array( + 'radius' => true, + 'color' => true, + 'width' => true, + 'style' => true + ) + ) + ), + 'style' => 'wp-block-query-total' + ), 'quote' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, @@ -5710,6 +5921,12 @@ 'html' => false, 'interactivity' => array( 'clientNavigation' => true + ), + 'color' => array( + 'background' => true, + 'text' => true, + 'gradients' => true, + 'link' => true ) ), 'editorStyle' => 'wp-block-rss-editor', @@ -5835,6 +6052,14 @@ 'opacity' => array( 'type' => 'string', 'default' => 'alpha-channel' + ), + 'tagName' => array( + 'type' => 'string', + 'enum' => array( + 'hr', + 'div' + ), + 'default' => 'hr' ) ), 'supports' => array( @@ -5917,11 +6142,13 @@ ), 'isLink' => array( 'type' => 'boolean', - 'default' => true + 'default' => true, + 'role' => 'content' ), 'linkTarget' => array( 'type' => 'string', - 'default' => '_self' + 'default' => '_self', + 'role' => 'content' ), 'shouldSyncIcon' => array( 'type' => 'boolean' @@ -6085,11 +6312,13 @@ ), 'isLink' => array( 'type' => 'boolean', - 'default' => true + 'default' => true, + 'role' => 'content' ), 'linkTarget' => array( 'type' => 'string', - 'default' => '_self' + 'default' => '_self', + 'role' => 'content' ) ), 'example' => array( @@ -6158,13 +6387,15 @@ 'textdomain' => 'default', 'attributes' => array( 'url' => array( - 'type' => 'string' + 'type' => 'string', + 'role' => 'content' ), 'service' => array( 'type' => 'string' ), 'label' => array( - 'type' => 'string' + 'type' => 'string', + 'role' => 'content' ), 'rel' => array( 'type' => 'string' @@ -6566,11 +6797,14 @@ 'width' => true ) ), - '__experimentalSelector' => '.wp-block-table > table', 'interactivity' => array( 'clientNavigation' => true ) ), + 'selectors' => array( + 'root' => '.wp-block-table > table', + 'spacing' => '.wp-block-table' + ), 'styles' => array( array( 'name' => 'regular', diff --git a/src/wp-includes/blocks/button/block.json b/src/wp-includes/blocks/button/block.json index 2c1c05baa20dd..6fcb7aca4c592 100644 --- a/src/wp-includes/blocks/button/block.json +++ b/src/wp-includes/blocks/button/block.json @@ -85,6 +85,16 @@ } }, "typography": { + "__experimentalSkipSerialization": [ + "fontSize", + "lineHeight", + "fontFamily", + "fontWeight", + "fontStyle", + "textTransform", + "textDecoration", + "letterSpacing" + ], "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, @@ -122,7 +132,6 @@ "width": true } }, - "__experimentalSelector": ".wp-block-button .wp-block-button__link", "interactivity": { "clientNavigation": true } @@ -132,5 +141,11 @@ { "name": "outline", "label": "Outline" } ], "editorStyle": "wp-block-button-editor", - "style": "wp-block-button" + "style": "wp-block-button", + "selectors": { + "root": ".wp-block-button .wp-block-button__link", + "typography": { + "writingMode": ".wp-block-button" + } + } } diff --git a/src/wp-includes/blocks/comments-pagination/block.json b/src/wp-includes/blocks/comments-pagination/block.json index 28f6c9fdfdb5d..b29d95bc4f1c9 100644 --- a/src/wp-includes/blocks/comments-pagination/block.json +++ b/src/wp-includes/blocks/comments-pagination/block.json @@ -18,6 +18,11 @@ "default": "none" } }, + "example": { + "attributes": { + "paginationArrow": "none" + } + }, "providesContext": { "comments/paginationArrow": "paginationArrow" }, diff --git a/src/wp-includes/blocks/comments/block.json b/src/wp-includes/blocks/comments/block.json index b35ea3505c816..ceb8f750c3472 100644 --- a/src/wp-includes/blocks/comments/block.json +++ b/src/wp-includes/blocks/comments/block.json @@ -45,6 +45,18 @@ "__experimentalDefaultControls": { "fontSize": true } + }, + "__experimentalBorder": { + "radius": true, + "color": true, + "width": true, + "style": true, + "__experimentalDefaultControls": { + "radius": true, + "color": true, + "width": true, + "style": true + } } }, "editorStyle": "wp-block-comments-editor", diff --git a/src/wp-includes/blocks/cover.php b/src/wp-includes/blocks/cover.php index 1ffe7ab3f4dbc..630835a47947b 100644 --- a/src/wp-includes/blocks/cover.php +++ b/src/wp-includes/blocks/cover.php @@ -35,12 +35,12 @@ function render_block_core_cover( $attributes, $content ) { $attr['style'] = 'object-position:' . $object_position . ';'; } - $image = get_the_post_thumbnail( null, 'post-thumbnail', $attr ); + $image = get_the_post_thumbnail( null, $attributes['sizeSlug'] ?? 'post-thumbnail', $attr ); } else { if ( in_the_loop() ) { update_post_thumbnail_cache(); } - $current_featured_image = get_the_post_thumbnail_url(); + $current_featured_image = get_the_post_thumbnail_url( null, $attributes['sizeSlug'] ?? null ); if ( ! $current_featured_image ) { return $content; } diff --git a/src/wp-includes/blocks/cover/block.json b/src/wp-includes/blocks/cover/block.json index 0ce80ca8d424f..733dfc12fc9bc 100644 --- a/src/wp-includes/blocks/cover/block.json +++ b/src/wp-includes/blocks/cover/block.json @@ -78,6 +78,9 @@ "tagName": { "type": "string", "default": "div" + }, + "sizeSlug": { + "type": "string" } }, "usesContext": [ "postId", "postType" ], diff --git a/src/wp-includes/blocks/details/block.json b/src/wp-includes/blocks/details/block.json index a488ae1fa73a7..19d5c554cd26d 100644 --- a/src/wp-includes/blocks/details/block.json +++ b/src/wp-includes/blocks/details/block.json @@ -16,11 +16,24 @@ "type": "rich-text", "source": "rich-text", "selector": "summary" + }, + "name": { + "type": "string", + "source": "attribute", + "attribute": "name", + "selector": ".wp-block-details" + }, + "allowedBlocks": { + "type": "array" + }, + "placeholder": { + "type": "string" } }, "supports": { "__experimentalOnEnter": true, "align": [ "wide", "full" ], + "anchor": true, "color": { "gradients": true, "link": true, diff --git a/src/wp-includes/blocks/file/block.json b/src/wp-includes/blocks/file/block.json index bf0082c576dd1..2c5e888c2aff6 100644 --- a/src/wp-includes/blocks/file/block.json +++ b/src/wp-includes/blocks/file/block.json @@ -16,7 +16,8 @@ "role": "local" }, "href": { - "type": "string" + "type": "string", + "role": "content" }, "fileId": { "type": "string", @@ -27,13 +28,15 @@ "fileName": { "type": "rich-text", "source": "rich-text", - "selector": "a:not([download])" + "selector": "a:not([download])", + "role": "content" }, "textLinkHref": { "type": "string", "source": "attribute", "selector": "a:not([download])", - "attribute": "href" + "attribute": "href", + "role": "content" }, "textLinkTarget": { "type": "string", @@ -48,7 +51,8 @@ "downloadButtonText": { "type": "rich-text", "source": "rich-text", - "selector": "a[download]" + "selector": "a[download]", + "role": "content" }, "displayPreview": { "type": "boolean" diff --git a/src/wp-includes/blocks/heading/block.json b/src/wp-includes/blocks/heading/block.json index 2276bcbbb5017..2869ee85c5520 100644 --- a/src/wp-includes/blocks/heading/block.json +++ b/src/wp-includes/blocks/heading/block.json @@ -37,13 +37,7 @@ "color": true, "radius": true, "style": true, - "width": true, - "__experimentalDefaultControls": { - "color": true, - "radius": true, - "style": true, - "width": true - } + "width": true }, "color": { "gradients": true, diff --git a/src/wp-includes/blocks/home-link.php b/src/wp-includes/blocks/home-link.php index fb7235834459d..d61aa0bc235e2 100644 --- a/src/wp-includes/blocks/home-link.php +++ b/src/wp-includes/blocks/home-link.php @@ -137,9 +137,6 @@ function block_core_home_link_build_li_wrapper_attributes( $context ) { */ function render_block_core_home_link( $attributes, $content, $block ) { if ( empty( $attributes['label'] ) ) { - // Using a fallback for the label attribute allows rendering the block even if no attributes have been set, - // e.g. when using the block as a hooked block. - // Note that the fallback value needs to be kept in sync with the one set in `edit.js` (upon first loading the block in the editor). $attributes['label'] = __( 'Home' ); } $aria_current = ''; diff --git a/src/wp-includes/blocks/image.php b/src/wp-includes/blocks/image.php index 1a5fae7ce9cbb..697f67a927fc8 100644 --- a/src/wp-includes/blocks/image.php +++ b/src/wp-includes/blocks/image.php @@ -149,18 +149,14 @@ function block_core_image_render_lightbox( $block_content, $block ) { return $block_content; } - $alt = $p->get_attribute( 'alt' ); - $img_uploaded_src = $p->get_attribute( 'src' ); - $img_class_names = $p->get_attribute( 'class' ); - $img_styles = $p->get_attribute( 'style' ); - $img_width = 'none'; - $img_height = 'none'; - $aria_label = __( 'Enlarge image' ); - - if ( $alt ) { - /* translators: %s: Image alt text. */ - $aria_label = sprintf( __( 'Enlarge image: %s' ), $alt ); - } + $alt = $p->get_attribute( 'alt' ); + $img_uploaded_src = $p->get_attribute( 'src' ); + $img_class_names = $p->get_attribute( 'class' ); + $img_styles = $p->get_attribute( 'style' ); + $img_width = 'none'; + $img_height = 'none'; + $aria_label = __( 'Enlarge' ); + $dialog_aria_label = __( 'Enlarged image' ); if ( isset( $block['attrs']['id'] ) ) { $img_uploaded_src = wp_get_attachment_url( $block['attrs']['id'] ); @@ -190,7 +186,7 @@ function block_core_image_render_lightbox( $block_content, $block ) { 'targetWidth' => $img_width, 'targetHeight' => $img_height, 'scaleAttr' => $block['attrs']['scale'] ?? false, - 'ariaLabel' => $aria_label, + 'ariaLabel' => $dialog_aria_label, 'alt' => $alt, ), ), @@ -290,6 +286,7 @@ class="wp-lightbox-overlay zoom" data-wp-on-async--click="actions.hideLightbox" data-wp-on-async-window--resize="callbacks.setOverlayStyles" data-wp-on-async-window--scroll="actions.handleScroll" + data-wp-bind--style="state.overlayStyles" tabindex="-1" > <button type="button" aria-label="$close_button_label" style="fill: $close_button_color" class="close-button"> @@ -306,7 +303,6 @@ class="wp-lightbox-overlay zoom" </figure> </div> <div class="scrim" style="background-color: $background_color" aria-hidden="true"></div> - <style data-wp-text="state.overlayStyles"></style> </div> HTML; } diff --git a/src/wp-includes/blocks/image/block.json b/src/wp-includes/blocks/image/block.json index f441a6e893290..26835df9e856c 100644 --- a/src/wp-includes/blocks/image/block.json +++ b/src/wp-includes/blocks/image/block.json @@ -4,7 +4,14 @@ "name": "core/image", "title": "Image", "category": "media", - "usesContext": [ "allowResize", "imageCrop", "fixedHeight" ], + "usesContext": [ + "allowResize", + "imageCrop", + "fixedHeight", + "postId", + "postType", + "queryId" + ], "description": "Insert an image to make a visual statement.", "keywords": [ "img", "photo", "picture" ], "textdomain": "default", diff --git a/src/wp-includes/blocks/latest-posts/block.json b/src/wp-includes/blocks/latest-posts/block.json index bb8c2d24962f3..58b1c6da81ca3 100644 --- a/src/wp-includes/blocks/latest-posts/block.json +++ b/src/wp-includes/blocks/latest-posts/block.json @@ -111,6 +111,18 @@ "fontSize": true } }, + "__experimentalBorder": { + "radius": true, + "color": true, + "width": true, + "style": true, + "__experimentalDefaultControls": { + "radius": true, + "color": true, + "width": true, + "style": true + } + }, "interactivity": { "clientNavigation": true } diff --git a/src/wp-includes/blocks/list-item/block.json b/src/wp-includes/blocks/list-item/block.json index 6eb30cfe6d0af..1cdba86f19b2e 100644 --- a/src/wp-includes/blocks/list-item/block.json +++ b/src/wp-includes/blocks/list-item/block.json @@ -2,7 +2,7 @@ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/list-item", - "title": "List item", + "title": "List Item", "category": "text", "parent": [ "core/list" ], "allowedBlocks": [ "core/list" ], diff --git a/src/wp-includes/blocks/navigation-link.php b/src/wp-includes/blocks/navigation-link.php index 5653e04fca88a..81df2099dfc18 100644 --- a/src/wp-includes/blocks/navigation-link.php +++ b/src/wp-includes/blocks/navigation-link.php @@ -177,7 +177,22 @@ function render_block_core_navigation_link( $attributes, $content, $block ) { // Don't render the block's subtree if it is a draft or if the ID does not exist. if ( $is_post_type && $navigation_link_has_id ) { $post = get_post( $attributes['id'] ); - if ( ! $post || 'publish' !== $post->post_status ) { + /** + * Filter allowed post_status for navigation link block to render. + * + * @since 6.8.0 + * + * @param array $post_status + * @param array $attributes + * @param WP_Block $block + */ + $allowed_post_status = (array) apply_filters( + 'render_block_core_navigation_link_allowed_post_status', + array( 'publish' ), + $attributes, + $block + ); + if ( ! $post || ! in_array( $post->post_status, $allowed_post_status, true ) ) { return ''; } } diff --git a/src/wp-includes/blocks/navigation-submenu.php b/src/wp-includes/blocks/navigation-submenu.php index 92b55e291606e..016e708c3256e 100644 --- a/src/wp-includes/blocks/navigation-submenu.php +++ b/src/wp-includes/blocks/navigation-submenu.php @@ -82,7 +82,6 @@ function render_block_core_navigation_submenu( $attributes, $content, $block ) { $font_sizes = block_core_navigation_submenu_build_css_font_sizes( $block->context ); $style_attribute = $font_sizes['inline_styles']; - $css_classes = trim( implode( ' ', $font_sizes['css_classes'] ) ); $has_submenu = count( $block->inner_blocks ) > 0; $kind = empty( $attributes['kind'] ) ? 'post_type' : str_replace( '-', '_', $attributes['kind'] ); $is_active = ! empty( $attributes['id'] ) && get_queried_object_id() === (int) $attributes['id'] && ! empty( get_queried_object()->$kind ); @@ -99,11 +98,29 @@ function render_block_core_navigation_submenu( $attributes, $content, $block ) { $open_on_hover_and_click = isset( $block->context['openSubmenusOnClick'] ) && ! $block->context['openSubmenusOnClick'] && $show_submenu_indicators; + $classes = array( + 'wp-block-navigation-item', + ); + $classes = array_merge( + $classes, + $font_sizes['css_classes'] + ); + if ( $has_submenu ) { + $classes[] = 'has-child'; + } + if ( $open_on_click ) { + $classes[] = 'open-on-click'; + } + if ( $open_on_hover_and_click ) { + $classes[] = 'open-on-hover-click'; + } + if ( $is_active ) { + $classes[] = 'current-menu-item'; + } + $wrapper_attributes = get_block_wrapper_attributes( array( - 'class' => $css_classes . ' wp-block-navigation-item' . ( $has_submenu ? ' has-child' : '' ) . - ( $open_on_click ? ' open-on-click' : '' ) . ( $open_on_hover_and_click ? ' open-on-hover-click' : '' ) . - ( $is_active ? ' current-menu-item' : '' ), + 'class' => implode( ' ', $classes ), 'style' => $style_attribute, ) ); @@ -159,7 +176,16 @@ function render_block_core_navigation_submenu( $attributes, $content, $block ) { $html .= '>'; // End appending HTML attributes to anchor tag. + $html .= '<span class="wp-block-navigation-item__label">'; $html .= $label; + $html .= '</span>'; + + // Add description if available. + if ( ! empty( $attributes['description'] ) ) { + $html .= '<span class="wp-block-navigation-item__description">'; + $html .= wp_kses_post( $attributes['description'] ); + $html .= '</span>'; + } $html .= '</a>'; // End anchor tag content. @@ -180,6 +206,13 @@ function render_block_core_navigation_submenu( $attributes, $content, $block ) { $html .= '</span>'; + // Add description if available. + if ( ! empty( $attributes['description'] ) ) { + $html .= '<span class="wp-block-navigation-item__description">'; + $html .= wp_kses_post( $attributes['description'] ); + $html .= '</span>'; + } + $html .= '</button>'; $html .= '<span class="wp-block-navigation__submenu-icon">' . block_core_navigation_submenu_render_submenu_icon() . '</span>'; @@ -222,7 +255,7 @@ function render_block_core_navigation_submenu( $attributes, $content, $block ) { if ( strpos( $inner_blocks_html, 'current-menu-item' ) ) { $tag_processor = new WP_HTML_Tag_Processor( $html ); - while ( $tag_processor->next_tag( array( 'class_name' => 'wp-block-navigation-item__content' ) ) ) { + while ( $tag_processor->next_tag( array( 'class_name' => 'wp-block-navigation-item' ) ) ) { $tag_processor->add_class( 'current-menu-ancestor' ); } $html = $tag_processor->get_updated_html(); diff --git a/src/wp-includes/blocks/navigation.php b/src/wp-includes/blocks/navigation.php index fa9bb5a56f801..43ca833153427 100644 --- a/src/wp-includes/blocks/navigation.php +++ b/src/wp-includes/blocks/navigation.php @@ -344,6 +344,10 @@ private static function get_navigation_name( $attributes ) { $navigation_name = $attributes['ariaLabel'] ?? ''; + if ( ! empty( $navigation_name ) ) { + return $navigation_name; + } + // Load the navigation post. if ( array_key_exists( 'ref', $attributes ) ) { $navigation_post = get_post( $attributes['ref'] ); @@ -535,8 +539,8 @@ private static function get_responsive_container_markup( $attributes, $inner_blo $inner_blocks_html, $toggle_aria_label_open, $toggle_aria_label_close, - esc_attr( implode( ' ', $responsive_container_classes ) ), - esc_attr( implode( ' ', $open_button_classes ) ), + esc_attr( trim( implode( ' ', $responsive_container_classes ) ) ), + esc_attr( trim( implode( ' ', $open_button_classes ) ) ), ( ! empty( $overlay_inline_styles ) ) ? "style=\"$overlay_inline_styles\"" : '', $toggle_button_content, $toggle_close_button_content, @@ -563,13 +567,14 @@ private static function get_nav_wrapper_attributes( $attributes, $inner_blocks ) $is_responsive_menu = static::is_responsive( $attributes ); $style = static::get_styles( $attributes ); $class = static::get_classes( $attributes ); - $wrapper_attributes = get_block_wrapper_attributes( - array( - 'class' => $class, - 'style' => $style, - 'aria-label' => $nav_menu_name, - ) + $extra_attributes = array( + 'class' => $class, + 'style' => $style, ); + if ( ! empty( $nav_menu_name ) ) { + $extra_attributes['aria-label'] = $nav_menu_name; + } + $wrapper_attributes = get_block_wrapper_attributes( $extra_attributes ); if ( $is_responsive_menu ) { $nav_element_directives = static::get_nav_element_directives( $is_interactive ); @@ -813,7 +818,7 @@ function block_core_navigation_add_directives_to_submenu( $tags, $block_attribut ) ) { // Add directives to the parent `<li>`. $tags->set_attribute( 'data-wp-interactive', 'core/navigation' ); - $tags->set_attribute( 'data-wp-context', '{ "submenuOpenedBy": { "click": false, "hover": false, "focus": false }, "type": "submenu" }' ); + $tags->set_attribute( 'data-wp-context', '{ "submenuOpenedBy": { "click": false, "hover": false, "focus": false }, "type": "submenu", "modal": null }' ); $tags->set_attribute( 'data-wp-watch', 'callbacks.initMenu' ); $tags->set_attribute( 'data-wp-on--focusout', 'actions.handleMenuFocusout' ); $tags->set_attribute( 'data-wp-on--keydown', 'actions.handleMenuKeydown' ); @@ -1432,20 +1437,6 @@ function block_core_navigation_get_most_recently_published_navigation() { return null; } -/** - * Accepts the serialized markup of a block and its inner blocks, and returns serialized markup of the inner blocks. - * - * @since 6.5.0 - * - * @param string $serialized_block The serialized markup of a block and its inner blocks. - * @return string - */ -function block_core_navigation_remove_serialized_parent_block( $serialized_block ) { - $start = strpos( $serialized_block, '-->' ) + strlen( '-->' ); - $end = strrpos( $serialized_block, '<!--' ); - return substr( $serialized_block, $start, $end - $start ); -} - /** * Mock a parsed block for the Navigation block given its inner blocks and the `wp_navigation` post object. * The `wp_navigation` post's `_wp_ignored_hooked_blocks` meta is queried to add the `metadata.ignoredHookedBlocks` attribute. @@ -1500,169 +1491,6 @@ function block_core_navigation_mock_parsed_block( $inner_blocks, $post ) { function block_core_navigation_insert_hooked_blocks( $inner_blocks, $post ) { $mock_navigation_block = block_core_navigation_mock_parsed_block( $inner_blocks, $post ); - if ( function_exists( 'apply_block_hooks_to_content' ) ) { - $mock_navigation_block_markup = serialize_block( $mock_navigation_block ); - return apply_block_hooks_to_content( $mock_navigation_block_markup, $post, 'insert_hooked_blocks' ); - } - - $hooked_blocks = get_hooked_blocks(); - $before_block_visitor = null; - $after_block_visitor = null; - - if ( ! empty( $hooked_blocks ) || has_filter( 'hooked_block_types' ) ) { - $before_block_visitor = make_before_block_visitor( $hooked_blocks, $post, 'insert_hooked_blocks' ); - $after_block_visitor = make_after_block_visitor( $hooked_blocks, $post, 'insert_hooked_blocks' ); - } - - return traverse_and_serialize_block( $mock_navigation_block, $before_block_visitor, $after_block_visitor ); -} - -/** - * Insert ignoredHookedBlocks meta into the Navigation block and its inner blocks. - * - * Given a Navigation block's inner blocks and its corresponding `wp_navigation` post object, - * this function inserts ignoredHookedBlocks meta into it, and returns the serialized inner blocks in a - * mock Navigation block wrapper. - * - * @since 6.5.0 - * - * @param array $inner_blocks Parsed inner blocks of a Navigation block. - * @param WP_Post $post `wp_navigation` post object corresponding to the block. - * @return string Serialized inner blocks in mock Navigation block wrapper, with hooked blocks inserted, if any. - */ -function block_core_navigation_set_ignored_hooked_blocks_metadata( $inner_blocks, $post ) { - $mock_navigation_block = block_core_navigation_mock_parsed_block( $inner_blocks, $post ); - $hooked_blocks = get_hooked_blocks(); - $before_block_visitor = null; - $after_block_visitor = null; - - if ( ! empty( $hooked_blocks ) || has_filter( 'hooked_block_types' ) ) { - $before_block_visitor = make_before_block_visitor( $hooked_blocks, $post, 'set_ignored_hooked_blocks_metadata' ); - $after_block_visitor = make_after_block_visitor( $hooked_blocks, $post, 'set_ignored_hooked_blocks_metadata' ); - } - - return traverse_and_serialize_block( $mock_navigation_block, $before_block_visitor, $after_block_visitor ); -} - -/** - * Updates the post meta with the list of ignored hooked blocks when the navigation is created or updated via the REST API. - * - * @access private - * @since 6.5.0 - * - * @param stdClass $post Post object. - * @return stdClass The updated post object. - */ -function block_core_navigation_update_ignore_hooked_blocks_meta( $post ) { - /* - * In this scenario the user has likely tried to create a navigation via the REST API. - * In which case we won't have a post ID to work with and store meta against. - */ - if ( empty( $post->ID ) ) { - return $post; - } - - /** - * Skip meta generation when consumers intentionally update specific Navigation fields - * and omit the content update. - */ - if ( ! isset( $post->post_content ) ) { - return $post; - } - - /* - * We run the Block Hooks mechanism to inject the `metadata.ignoredHookedBlocks` attribute into - * all anchor blocks. For the root level, we create a mock Navigation and extract them from there. - */ - $blocks = parse_blocks( $post->post_content ); - - /* - * Block Hooks logic requires a `WP_Post` object (rather than the `stdClass` with the updates that - * we're getting from the `rest_pre_insert_wp_navigation` filter) as its second argument (to be - * used as context for hooked blocks insertion). - * We thus have to look it up from the DB,based on `$post->ID`. - */ - $markup = block_core_navigation_set_ignored_hooked_blocks_metadata( $blocks, get_post( $post->ID ) ); - - $root_nav_block = parse_blocks( $markup )[0]; - $ignored_hooked_blocks = isset( $root_nav_block['attrs']['metadata']['ignoredHookedBlocks'] ) - ? $root_nav_block['attrs']['metadata']['ignoredHookedBlocks'] - : array(); - - if ( ! empty( $ignored_hooked_blocks ) ) { - $existing_ignored_hooked_blocks = get_post_meta( $post->ID, '_wp_ignored_hooked_blocks', true ); - if ( ! empty( $existing_ignored_hooked_blocks ) ) { - $existing_ignored_hooked_blocks = json_decode( $existing_ignored_hooked_blocks, true ); - $ignored_hooked_blocks = array_unique( array_merge( $ignored_hooked_blocks, $existing_ignored_hooked_blocks ) ); - } - update_post_meta( $post->ID, '_wp_ignored_hooked_blocks', json_encode( $ignored_hooked_blocks ) ); - } - - $post->post_content = block_core_navigation_remove_serialized_parent_block( $markup ); - return $post; -} - -/* - * Before adding our filter, we verify if it's already added in Core. - * However, during the build process, Gutenberg automatically prefixes our functions with "gutenberg_". - * Therefore, we concatenate the Core's function name to circumvent this prefix for our check. - */ -$rest_insert_wp_navigation_core_callback = 'block_core_navigation_' . 'update_ignore_hooked_blocks_meta'; // phpcs:ignore Generic.Strings.UnnecessaryStringConcat.Found - -/* - * Do not add the `block_core_navigation_update_ignore_hooked_blocks_meta` filter in the following cases: - * - If Core has added the `update_ignored_hooked_blocks_postmeta` filter already (WP >= 6.6); - * - or if the `$rest_insert_wp_navigation_core_callback` filter has already been added. - */ -if ( - ! has_filter( 'rest_pre_insert_wp_navigation', 'update_ignored_hooked_blocks_postmeta' ) && - ! has_filter( 'rest_pre_insert_wp_navigation', $rest_insert_wp_navigation_core_callback ) -) { - add_filter( 'rest_pre_insert_wp_navigation', 'block_core_navigation_update_ignore_hooked_blocks_meta' ); -} - -/** - * Hooks into the REST API response for the core/navigation block and adds the first and last inner blocks. - * - * @since 6.5.0 - * - * @param WP_REST_Response $response The response object. - * @param WP_Post $post Post object. - * @return WP_REST_Response The response object. - */ -function block_core_navigation_insert_hooked_blocks_into_rest_response( $response, $post ) { - if ( ! isset( $response->data['content']['raw'] ) || ! isset( $response->data['content']['rendered'] ) ) { - return $response; - } - $parsed_blocks = parse_blocks( $response->data['content']['raw'] ); - $content = block_core_navigation_insert_hooked_blocks( $parsed_blocks, $post ); - - // Remove mock Navigation block wrapper. - $content = block_core_navigation_remove_serialized_parent_block( $content ); - - $response->data['content']['raw'] = $content; - - /** This filter is documented in wp-includes/post-template.php */ - $response->data['content']['rendered'] = apply_filters( 'the_content', $content ); - - return $response; -} - -/* - * Before adding our filter, we verify if it's already added in Core. - * However, during the build process, Gutenberg automatically prefixes our functions with "gutenberg_". - * Therefore, we concatenate the Core's function name to circumvent this prefix for our check. - */ -$rest_prepare_wp_navigation_core_callback = 'block_core_navigation_' . 'insert_hooked_blocks_into_rest_response'; - -/* - * Do not add the `block_core_navigation_insert_hooked_blocks_into_rest_response` filter in the following cases: - * - If Core has added the `insert_hooked_blocks_into_rest_response` filter already (WP >= 6.6); - * - or if the `$rest_prepare_wp_navigation_core_callback` filter has already been added. - */ -if ( - ! has_filter( 'rest_prepare_wp_navigation', 'insert_hooked_blocks_into_rest_response' ) && - ! has_filter( 'rest_prepare_wp_navigation', $rest_prepare_wp_navigation_core_callback ) -) { - add_filter( 'rest_prepare_wp_navigation', 'block_core_navigation_insert_hooked_blocks_into_rest_response', 10, 3 ); + $mock_navigation_block_markup = serialize_block( $mock_navigation_block ); + return apply_block_hooks_to_content( $mock_navigation_block_markup, $post, 'insert_hooked_blocks' ); } diff --git a/src/wp-includes/blocks/page-list/block.json b/src/wp-includes/blocks/page-list/block.json index b465e4ef5dc3d..8802022382241 100644 --- a/src/wp-includes/blocks/page-list/block.json +++ b/src/wp-includes/blocks/page-list/block.json @@ -51,6 +51,31 @@ }, "interactivity": { "clientNavigation": true + }, + "color": { + "text": true, + "background": true, + "link": true, + "gradients": true, + "__experimentalDefaultControls": { + "background": true, + "text": true, + "link": true + } + }, + "__experimentalBorder": { + "radius": true, + "color": true, + "width": true, + "style": true + }, + "spacing": { + "padding": true, + "margin": true, + "__experimentalDefaultControls": { + "padding": false, + "margin": false + } } }, "editorStyle": "wp-block-page-list-editor", diff --git a/src/wp-includes/blocks/pattern.php b/src/wp-includes/blocks/pattern.php index 5595818a2271b..870313eb5e86d 100644 --- a/src/wp-includes/blocks/pattern.php +++ b/src/wp-includes/blocks/pattern.php @@ -58,13 +58,6 @@ function render_block_core_pattern( $attributes ) { $pattern = $registry->get_registered( $slug ); $content = $pattern['content']; - // Backward compatibility for handling Block Hooks and injecting the theme attribute in the Gutenberg plugin. - // This can be removed when the minimum supported WordPress is >= 6.4. - if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN && ! function_exists( 'traverse_and_serialize_blocks' ) ) { - $blocks = parse_blocks( $content ); - $content = gutenberg_serialize_blocks( $blocks ); - } - $seen_refs[ $attributes['slug'] ] = true; $content = do_blocks( $content ); diff --git a/src/wp-includes/blocks/pattern/block.json b/src/wp-includes/blocks/pattern/block.json index 13fc9d154b15a..c30be8458e636 100644 --- a/src/wp-includes/blocks/pattern/block.json +++ b/src/wp-includes/blocks/pattern/block.json @@ -2,7 +2,7 @@ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/pattern", - "title": "Pattern placeholder", + "title": "Pattern Placeholder", "category": "theme", "description": "Show a block pattern.", "supports": { diff --git a/src/wp-includes/blocks/post-author-name.php b/src/wp-includes/blocks/post-author-name.php index effc83962a354..243d78ca70129 100644 --- a/src/wp-includes/blocks/post-author-name.php +++ b/src/wp-includes/blocks/post-author-name.php @@ -26,6 +26,10 @@ function render_block_core_post_author_name( $attributes, $content, $block ) { return ''; } + if ( ! post_type_supports( $block->context['postType'], 'author' ) ) { + return ''; + } + $author_name = get_the_author_meta( 'display_name', $author_id ); if ( isset( $attributes['isLink'] ) && $attributes['isLink'] ) { $author_name = sprintf( '<a href="%1$s" target="%2$s" class="wp-block-post-author-name__link">%3$s</a>', get_author_posts_url( $author_id ), esc_attr( $attributes['linkTarget'] ), $author_name ); diff --git a/src/wp-includes/blocks/post-author-name/block.json b/src/wp-includes/blocks/post-author-name/block.json index 68d2c49bd9105..23211f0bf5bf4 100644 --- a/src/wp-includes/blocks/post-author-name/block.json +++ b/src/wp-includes/blocks/post-author-name/block.json @@ -12,11 +12,13 @@ }, "isLink": { "type": "boolean", - "default": false + "default": false, + "role": "content" }, "linkTarget": { "type": "string", - "default": "_self" + "default": "_self", + "role": "content" } }, "usesContext": [ "postType", "postId" ], diff --git a/src/wp-includes/blocks/post-author.php b/src/wp-includes/blocks/post-author.php index faf894d997d73..2d01de508b94a 100644 --- a/src/wp-includes/blocks/post-author.php +++ b/src/wp-includes/blocks/post-author.php @@ -26,6 +26,10 @@ function render_block_core_post_author( $attributes, $content, $block ) { return ''; } + if ( ! post_type_supports( $block->context['postType'], 'author' ) ) { + return ''; + } + $avatar = ! empty( $attributes['avatarSize'] ) ? get_avatar( $author_id, $attributes['avatarSize'] diff --git a/src/wp-includes/blocks/post-author/block.json b/src/wp-includes/blocks/post-author/block.json index d66498c8ee3df..c7f2f01550a61 100644 --- a/src/wp-includes/blocks/post-author/block.json +++ b/src/wp-includes/blocks/post-author/block.json @@ -26,11 +26,13 @@ }, "isLink": { "type": "boolean", - "default": false + "default": false, + "role": "content" }, "linkTarget": { "type": "string", - "default": "_self" + "default": "_self", + "role": "content" } }, "usesContext": [ "postType", "postId", "queryId" ], diff --git a/src/wp-includes/blocks/post-comments-form/block.json b/src/wp-includes/blocks/post-comments-form/block.json index af893ccb67a08..4b6b333b75cfa 100644 --- a/src/wp-includes/blocks/post-comments-form/block.json +++ b/src/wp-includes/blocks/post-comments-form/block.json @@ -56,5 +56,10 @@ "wp-block-post-comments-form", "wp-block-buttons", "wp-block-button" - ] + ], + "example": { + "attributes": { + "textAlign": "center" + } + } } diff --git a/src/wp-includes/blocks/post-content.php b/src/wp-includes/blocks/post-content.php index 25be880cc4788..e0a06b7217eeb 100644 --- a/src/wp-includes/blocks/post-content.php +++ b/src/wp-includes/blocks/post-content.php @@ -46,10 +46,33 @@ function render_block_core_post_content( $attributes, $content, $block ) { $content .= wp_link_pages( array( 'echo' => 0 ) ); } + $ignored_hooked_blocks = get_post_meta( $post_id, '_wp_ignored_hooked_blocks', true ); + if ( ! empty( $ignored_hooked_blocks ) ) { + $ignored_hooked_blocks = json_decode( $ignored_hooked_blocks, true ); + $attributes['metadata'] = array( + 'ignoredHookedBlocks' => $ignored_hooked_blocks, + ); + } + + // Wrap in Post Content block so the Block Hooks algorithm can insert blocks + // that are hooked as first or last child of `core/post-content`. + $content = get_comment_delimited_block_content( + 'core/post-content', + $attributes, + $content + ); + + // We need to remove the `core/post-content` block wrapper after the Block Hooks algorithm, + // but before `do_blocks` runs, as it would otherwise attempt to render the same block again -- + // thus recursing infinitely. + add_filter( 'the_content', 'remove_serialized_parent_block', 8 ); + /** This filter is documented in wp-includes/post-template.php */ $content = apply_filters( 'the_content', str_replace( ']]>', ']]&gt;', $content ) ); unset( $seen_ids[ $post_id ] ); + remove_filter( 'the_content', 'remove_serialized_parent_block', 8 ); + if ( empty( $content ) ) { return ''; } diff --git a/src/wp-includes/blocks/post-content/block.json b/src/wp-includes/blocks/post-content/block.json index 1b9de707cb322..1348cb296af08 100644 --- a/src/wp-includes/blocks/post-content/block.json +++ b/src/wp-includes/blocks/post-content/block.json @@ -27,6 +27,7 @@ "spacing": { "blockGap": true, "padding": true, + "margin": true, "__experimentalDefaultControls": { "margin": false, "padding": false @@ -34,6 +35,7 @@ }, "color": { "gradients": true, + "heading": true, "link": true, "__experimentalDefaultControls": { "background": false, @@ -52,6 +54,18 @@ "__experimentalDefaultControls": { "fontSize": true } + }, + "__experimentalBorder": { + "radius": true, + "color": true, + "width": true, + "style": true, + "__experimentalDefaultControls": { + "radius": true, + "color": true, + "width": true, + "style": true + } } }, "style": "wp-block-post-content", diff --git a/src/wp-includes/blocks/post-date/block.json b/src/wp-includes/blocks/post-date/block.json index 470bddae53bdf..dadc0d2f489fe 100644 --- a/src/wp-includes/blocks/post-date/block.json +++ b/src/wp-includes/blocks/post-date/block.json @@ -15,7 +15,8 @@ }, "isLink": { "type": "boolean", - "default": false + "default": false, + "role": "content" }, "displayType": { "type": "string", diff --git a/src/wp-includes/blocks/post-featured-image/block.json b/src/wp-includes/blocks/post-featured-image/block.json index 8b431ffc62579..3cd144caa0cf4 100644 --- a/src/wp-includes/blocks/post-featured-image/block.json +++ b/src/wp-includes/blocks/post-featured-image/block.json @@ -9,7 +9,8 @@ "attributes": { "isLink": { "type": "boolean", - "default": false + "default": false, + "role": "content" }, "aspectRatio": { "type": "string" @@ -30,11 +31,13 @@ "rel": { "type": "string", "attribute": "rel", - "default": "" + "default": "", + "role": "content" }, "linkTarget": { "type": "string", - "default": "_self" + "default": "_self", + "role": "content" }, "overlayColor": { "type": "string" diff --git a/src/wp-includes/blocks/post-template/block.json b/src/wp-includes/blocks/post-template/block.json index 6a57585558352..d379a46d3142f 100644 --- a/src/wp-includes/blocks/post-template/block.json +++ b/src/wp-includes/blocks/post-template/block.json @@ -4,7 +4,7 @@ "name": "core/post-template", "title": "Post Template", "category": "theme", - "parent": [ "core/query" ], + "ancestor": [ "core/query" ], "description": "Contains the block elements used to render a post, like the title, date, featured image, content or excerpt, and more.", "textdomain": "default", "usesContext": [ @@ -13,7 +13,8 @@ "displayLayout", "templateSlug", "previewPostType", - "enhancedPagination" + "enhancedPagination", + "postType" ], "supports": { "reusable": false, @@ -42,15 +43,25 @@ } }, "spacing": { + "margin": true, + "padding": true, "blockGap": { "__experimentalDefault": "1.25em" }, "__experimentalDefaultControls": { - "blockGap": true + "blockGap": true, + "padding": false, + "margin": false } }, "interactivity": { "clientNavigation": true + }, + "__experimentalBorder": { + "radius": true, + "color": true, + "width": true, + "style": true } }, "style": "wp-block-post-template", diff --git a/src/wp-includes/blocks/post-terms.php b/src/wp-includes/blocks/post-terms.php index 69d7b04b096b5..3e7a05f10117e 100644 --- a/src/wp-includes/blocks/post-terms.php +++ b/src/wp-includes/blocks/post-terms.php @@ -24,11 +24,6 @@ function render_block_core_post_terms( $attributes, $content, $block ) { return ''; } - $post_terms = get_the_terms( $block->context['postId'], $attributes['term'] ); - if ( is_wp_error( $post_terms ) || empty( $post_terms ) ) { - return ''; - } - $classes = array( 'taxonomy-' . $attributes['term'] ); if ( isset( $attributes['textAlign'] ) ) { $classes[] = 'has-text-align-' . $attributes['textAlign']; @@ -51,13 +46,19 @@ function render_block_core_post_terms( $attributes, $content, $block ) { $suffix = '<span class="wp-block-post-terms__suffix">' . $attributes['suffix'] . '</span>' . $suffix; } - return get_the_term_list( + $post_terms = get_the_term_list( $block->context['postId'], $attributes['term'], wp_kses_post( $prefix ), '<span class="wp-block-post-terms__separator">' . esc_html( $separator ) . '</span>', wp_kses_post( $suffix ) ); + + if ( is_wp_error( $post_terms ) || empty( $post_terms ) ) { + return ''; + } + + return $post_terms; } /** diff --git a/src/wp-includes/blocks/post-title/block.json b/src/wp-includes/blocks/post-title/block.json index ecb5053d6cd39..5587d71b148d0 100644 --- a/src/wp-includes/blocks/post-title/block.json +++ b/src/wp-includes/blocks/post-title/block.json @@ -20,16 +20,19 @@ }, "isLink": { "type": "boolean", - "default": false + "default": false, + "role": "content" }, "rel": { "type": "string", "attribute": "rel", - "default": "" + "default": "", + "role": "content" }, "linkTarget": { "type": "string", - "default": "_self" + "default": "_self", + "role": "content" } }, "example": { diff --git a/src/wp-includes/blocks/query-no-results/block.json b/src/wp-includes/blocks/query-no-results/block.json index 8f3ba56adcc36..44d2ceef987e2 100644 --- a/src/wp-includes/blocks/query-no-results/block.json +++ b/src/wp-includes/blocks/query-no-results/block.json @@ -2,10 +2,10 @@ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/query-no-results", - "title": "No results", + "title": "No Results", "category": "theme", "description": "Contains the block elements used to render content when no query results are found.", - "parent": [ "core/query" ], + "ancestor": [ "core/query" ], "textdomain": "default", "usesContext": [ "queryId", "query" ], "supports": { diff --git a/src/wp-includes/blocks/query-pagination-previous.php b/src/wp-includes/blocks/query-pagination-previous.php index 1592f0a10cbff..20b59109874d9 100644 --- a/src/wp-includes/blocks/query-pagination-previous.php +++ b/src/wp-includes/blocks/query-pagination-previous.php @@ -19,14 +19,14 @@ function render_block_core_query_pagination_previous( $attributes, $content, $block ) { $page_key = isset( $block->context['queryId'] ) ? 'query-' . $block->context['queryId'] . '-page' : 'query-page'; $enhanced_pagination = isset( $block->context['enhancedPagination'] ) && $block->context['enhancedPagination']; + $max_page = isset( $block->context['query']['pages'] ) ? (int) $block->context['query']['pages'] : 0; $page = empty( $_GET[ $page_key ] ) ? 1 : (int) $_GET[ $page_key ]; - - $wrapper_attributes = get_block_wrapper_attributes(); - $show_label = isset( $block->context['showLabel'] ) ? (bool) $block->context['showLabel'] : true; - $default_label = __( 'Previous Page' ); - $label_text = isset( $attributes['label'] ) && ! empty( $attributes['label'] ) ? esc_html( $attributes['label'] ) : $default_label; - $label = $show_label ? $label_text : ''; - $pagination_arrow = get_query_pagination_arrow( $block, false ); + $wrapper_attributes = get_block_wrapper_attributes(); + $show_label = isset( $block->context['showLabel'] ) ? (bool) $block->context['showLabel'] : true; + $default_label = __( 'Previous Page' ); + $label_text = isset( $attributes['label'] ) && ! empty( $attributes['label'] ) ? esc_html( $attributes['label'] ) : $default_label; + $label = $show_label ? $label_text : ''; + $pagination_arrow = get_query_pagination_arrow( $block, false ); if ( ! $label ) { $wrapper_attributes .= ' aria-label="' . $label_text . '"'; } @@ -44,13 +44,20 @@ function render_block_core_query_pagination_previous( $attributes, $content, $bl add_filter( 'previous_posts_link_attributes', $filter_link_attributes ); $content = get_previous_posts_link( $label ); remove_filter( 'previous_posts_link_attributes', $filter_link_attributes ); - } elseif ( 1 !== $page ) { - $content = sprintf( - '<a href="%1$s" %2$s>%3$s</a>', - esc_url( add_query_arg( $page_key, $page - 1 ) ), - $wrapper_attributes, - $label - ); + } else { + $block_query = new WP_Query( build_query_vars_from_query_block( $block, $page ) ); + $block_max_pages = $block_query->max_num_pages; + $total = ! $max_page || $max_page > $block_max_pages ? $block_max_pages : $max_page; + wp_reset_postdata(); + + if ( 1 < $page && $page <= $total ) { + $content = sprintf( + '<a href="%1$s" %2$s>%3$s</a>', + esc_url( add_query_arg( $page_key, $page - 1 ) ), + $wrapper_attributes, + $label + ); + } } if ( $enhanced_pagination && isset( $content ) ) { diff --git a/src/wp-includes/blocks/query-title/block.json b/src/wp-includes/blocks/query-title/block.json index de3e60214685c..5d5c9113bda08 100644 --- a/src/wp-includes/blocks/query-title/block.json +++ b/src/wp-includes/blocks/query-title/block.json @@ -29,6 +29,11 @@ "default": true } }, + "example": { + "attributes": { + "type": "search" + } + }, "supports": { "align": [ "wide", "full" ], "html": false, diff --git a/src/wp-includes/blocks/query.php b/src/wp-includes/blocks/query.php index 043f351e11d7f..6b544cd99ae8c 100644 --- a/src/wp-includes/blocks/query.php +++ b/src/wp-includes/blocks/query.php @@ -79,7 +79,7 @@ function register_block_core_query() { * @since 6.4.0 * * @param array $parsed_block The block being rendered. - * @return string Returns the parsed block, unmodified. + * @return array Returns the parsed block, unmodified. */ function block_core_query_disable_enhanced_pagination( $parsed_block ) { static $enhanced_query_stack = array(); diff --git a/src/wp-includes/blocks/query/block.json b/src/wp-includes/blocks/query/block.json index 22bfa7b713801..6ccafc50c8201 100644 --- a/src/wp-includes/blocks/query/block.json +++ b/src/wp-includes/blocks/query/block.json @@ -5,6 +5,7 @@ "title": "Query Loop", "category": "theme", "description": "An advanced block that allows displaying post types based on different query parameters and visual configurations.", + "keywords": [ "posts", "list", "blog", "blogs", "custom post types" ], "textdomain": "default", "attributes": { "queryId": { @@ -41,7 +42,7 @@ "default": false } }, - "usesContext": [ "postType" ], + "usesContext": [ "templateSlug" ], "providesContext": { "queryId": "queryId", "query": "query", diff --git a/src/wp-includes/blocks/require-dynamic-blocks.php b/src/wp-includes/blocks/require-dynamic-blocks.php index 47c39e280d28f..bd1f11608d601 100644 --- a/src/wp-includes/blocks/require-dynamic-blocks.php +++ b/src/wp-includes/blocks/require-dynamic-blocks.php @@ -57,6 +57,7 @@ require_once ABSPATH . WPINC . '/blocks/query-pagination-numbers.php'; require_once ABSPATH . WPINC . '/blocks/query-pagination-previous.php'; require_once ABSPATH . WPINC . '/blocks/query-title.php'; +require_once ABSPATH . WPINC . '/blocks/query-total.php'; require_once ABSPATH . WPINC . '/blocks/read-more.php'; require_once ABSPATH . WPINC . '/blocks/rss.php'; require_once ABSPATH . WPINC . '/blocks/search.php'; diff --git a/src/wp-includes/blocks/rss.php b/src/wp-includes/blocks/rss.php index 32885863402d5..85e4e63c9dbf7 100644 --- a/src/wp-includes/blocks/rss.php +++ b/src/wp-includes/blocks/rss.php @@ -61,17 +61,20 @@ function render_block_core_rss( $attributes ) { $author = $item->get_author(); if ( is_object( $author ) ) { $author = $author->get_name(); - $author = '<span class="wp-block-rss__item-author">' . sprintf( - /* translators: byline. %s: author. */ - __( 'by %s' ), - esc_html( strip_tags( $author ) ) - ) . '</span>'; + if ( ! empty( $author ) ) { + $author = '<span class="wp-block-rss__item-author">' . sprintf( + /* translators: byline. %s: author. */ + __( 'by %s' ), + esc_html( strip_tags( $author ) ) + ) . '</span>'; + } } } - $excerpt = ''; - if ( $attributes['displayExcerpt'] ) { - $excerpt = html_entity_decode( $item->get_description(), ENT_QUOTES, get_option( 'blog_charset' ) ); + $excerpt = ''; + $description = $item->get_description(); + if ( $attributes['displayExcerpt'] && ! empty( $description ) ) { + $excerpt = html_entity_decode( $description, ENT_QUOTES, get_option( 'blog_charset' ) ); $excerpt = esc_attr( wp_trim_words( $excerpt, $attributes['excerptLength'], ' [&hellip;]' ) ); // Change existing [...] to [&hellip;]. diff --git a/src/wp-includes/blocks/rss/block.json b/src/wp-includes/blocks/rss/block.json index 36d70e7b7ccb9..844104b7d8113 100644 --- a/src/wp-includes/blocks/rss/block.json +++ b/src/wp-includes/blocks/rss/block.json @@ -46,6 +46,12 @@ "html": false, "interactivity": { "clientNavigation": true + }, + "color": { + "background": true, + "text": true, + "gradients": true, + "link": true } }, "editorStyle": "wp-block-rss-editor", diff --git a/src/wp-includes/blocks/search.php b/src/wp-includes/blocks/search.php index e4259bb0ce2c7..87e12f5d33d07 100644 --- a/src/wp-includes/blocks/search.php +++ b/src/wp-includes/blocks/search.php @@ -31,8 +31,8 @@ function render_block_core_search( $attributes ) { $input_id = wp_unique_id( 'wp-block-search__input-' ); $classnames = classnames_for_block_core_search( $attributes ); - $show_label = ( ! empty( $attributes['showLabel'] ) ) ? true : false; - $use_icon_button = ( ! empty( $attributes['buttonUseIcon'] ) ) ? true : false; + $show_label = ! empty( $attributes['showLabel'] ); + $use_icon_button = ! empty( $attributes['buttonUseIcon'] ); $show_button = ( ! empty( $attributes['buttonPosition'] ) && 'no-button' === $attributes['buttonPosition'] ) ? false : true; $button_position = $show_button ? $attributes['buttonPosition'] : null; $query_params = ( ! empty( $attributes['query'] ) ) ? $attributes['query'] : array(); @@ -177,9 +177,9 @@ function render_block_core_search( $attributes ) { ) ); $form_directives = ' - data-wp-interactive="core/search"' - . $form_context . - 'data-wp-class--wp-block-search__searchfield-hidden="!context.isSearchInputVisible" + data-wp-interactive="core/search" + ' . $form_context . ' + data-wp-class--wp-block-search__searchfield-hidden="!context.isSearchInputVisible" data-wp-on-async--keydown="actions.handleSearchKeydown" data-wp-on-async--focusout="actions.handleSearchFocusout" '; diff --git a/src/wp-includes/blocks/separator/block.json b/src/wp-includes/blocks/separator/block.json index 484627aaa1612..926d978b7e4d5 100644 --- a/src/wp-includes/blocks/separator/block.json +++ b/src/wp-includes/blocks/separator/block.json @@ -11,6 +11,11 @@ "opacity": { "type": "string", "default": "alpha-channel" + }, + "tagName": { + "type": "string", + "enum": [ "hr", "div" ], + "default": "hr" } }, "supports": { diff --git a/src/wp-includes/blocks/site-logo/block.json b/src/wp-includes/blocks/site-logo/block.json index 3bdbdc1b809ab..1f5b3a5525e3e 100644 --- a/src/wp-includes/blocks/site-logo/block.json +++ b/src/wp-includes/blocks/site-logo/block.json @@ -12,11 +12,13 @@ }, "isLink": { "type": "boolean", - "default": true + "default": true, + "role": "content" }, "linkTarget": { "type": "string", - "default": "_self" + "default": "_self", + "role": "content" }, "shouldSyncIcon": { "type": "boolean" diff --git a/src/wp-includes/blocks/site-title/block.json b/src/wp-includes/blocks/site-title/block.json index c75b1bc229beb..8edf6b945f9ce 100644 --- a/src/wp-includes/blocks/site-title/block.json +++ b/src/wp-includes/blocks/site-title/block.json @@ -20,11 +20,13 @@ }, "isLink": { "type": "boolean", - "default": true + "default": true, + "role": "content" }, "linkTarget": { "type": "string", - "default": "_self" + "default": "_self", + "role": "content" } }, "example": { diff --git a/src/wp-includes/blocks/social-link.php b/src/wp-includes/blocks/social-link.php index da28034f5a55d..f241daff2a11a 100644 --- a/src/wp-includes/blocks/social-link.php +++ b/src/wp-includes/blocks/social-link.php @@ -42,9 +42,9 @@ function render_block_core_social_link( $attributes, $content, $block ) { /** * Prepend URL with https:// if it doesn't appear to contain a scheme - * and it's not a relative link starting with //. + * and it's not a relative link or a fragment. */ - if ( ! parse_url( $url, PHP_URL_SCHEME ) && ! str_starts_with( $url, '//' ) ) { + if ( ! parse_url( $url, PHP_URL_SCHEME ) && ! str_starts_with( $url, '//' ) && ! str_starts_with( $url, '#' ) ) { $url = 'https://' . $url; } diff --git a/src/wp-includes/blocks/social-link/block.json b/src/wp-includes/blocks/social-link/block.json index 37e8376f22ff0..667fd74b208f2 100644 --- a/src/wp-includes/blocks/social-link/block.json +++ b/src/wp-includes/blocks/social-link/block.json @@ -9,13 +9,15 @@ "textdomain": "default", "attributes": { "url": { - "type": "string" + "type": "string", + "role": "content" }, "service": { "type": "string" }, "label": { - "type": "string" + "type": "string", + "role": "content" }, "rel": { "type": "string" diff --git a/src/wp-includes/blocks/table/block.json b/src/wp-includes/blocks/table/block.json index 11dd5b5f323e3..2f0ea753f6f8d 100644 --- a/src/wp-includes/blocks/table/block.json +++ b/src/wp-includes/blocks/table/block.json @@ -195,11 +195,14 @@ "width": true } }, - "__experimentalSelector": ".wp-block-table > table", "interactivity": { "clientNavigation": true } }, + "selectors": { + "root": ".wp-block-table > table", + "spacing": ".wp-block-table" + }, "styles": [ { "name": "regular", diff --git a/tests/phpunit/includes/unregister-blocks-hooks.php b/tests/phpunit/includes/unregister-blocks-hooks.php index 93e57ad477e76..827b827d04d23 100644 --- a/tests/phpunit/includes/unregister-blocks-hooks.php +++ b/tests/phpunit/includes/unregister-blocks-hooks.php @@ -56,6 +56,7 @@ remove_action( 'init', 'register_block_core_query_pagination_numbers' ); remove_action( 'init', 'register_block_core_query_pagination_previous' ); remove_action( 'init', 'register_block_core_query_title' ); +remove_action( 'init', 'register_block_core_query_total' ); remove_action( 'init', 'register_block_core_read_more' ); remove_action( 'init', 'register_block_core_rss' ); remove_action( 'init', 'register_block_core_search' ); diff --git a/tests/phpunit/tests/blocks/editor.php b/tests/phpunit/tests/blocks/editor.php index 0682839605da9..838137fa76f0d 100644 --- a/tests/phpunit/tests/blocks/editor.php +++ b/tests/phpunit/tests/blocks/editor.php @@ -203,7 +203,7 @@ public function test_get_allowed_block_types_deprecated_filter_post_editor() { public function test_get_default_block_editor_settings() { $settings = get_default_block_editor_settings(); - $this->assertCount( 19, $settings ); + $this->assertCount( 20, $settings ); $this->assertFalse( $settings['alignWide'] ); $this->assertIsArray( $settings['allowedMimeTypes'] ); $this->assertTrue( $settings['allowedBlockTypes'] ); @@ -299,6 +299,7 @@ public function test_get_default_block_editor_settings() { $settings['imageSizes'] ); $this->assertIsInt( $settings['maxUploadFileSize'] ); + $this->assertSame( admin_url( '/' ), $settings['__experimentalDashboardLink'] ); $this->assertTrue( $settings['__unstableGalleryWithImageBlocks'] ); } diff --git a/tests/phpunit/tests/dependencies/scripts.php b/tests/phpunit/tests/dependencies/scripts.php index 89bfb4ef922e6..b4b72cf552ac5 100644 --- a/tests/phpunit/tests/dependencies/scripts.php +++ b/tests/phpunit/tests/dependencies/scripts.php @@ -2068,6 +2068,9 @@ public function test_wp_add_inline_script_before_with_concat_and_core_dependency public function test_wp_add_inline_script_before_after_concat_with_core_dependency() { global $wp_scripts, $wp_version; + // See: https://github.com/WordPress/gutenberg/pull/69070. + $this->markTestSkipped( 'Temporarily skipping to sync while wp-polyfill is removed.' ); + wp_default_scripts( $wp_scripts ); wp_default_packages( $wp_scripts ); diff --git a/tools/webpack/shared.js b/tools/webpack/shared.js index c690235a2114e..75adcef4f3ba3 100644 --- a/tools/webpack/shared.js +++ b/tools/webpack/shared.js @@ -97,6 +97,9 @@ const BUNDLED_PACKAGES = [ '@wordpress/interface', '@wordpress/interactivity', '@wordpress/sync', + '@wordpress/undo-manager', + '@wordpress/upload-media', + '@wordpress/fields', ]; const MODULES = [ '@wordpress/interactivity', From 5745d6f4389ad5b34f684fb7f4a2c7173436b16c Mon Sep 17 00:00:00 2001 From: Joe McGill <joemcgill@git.wordpress.org> Date: Fri, 7 Feb 2025 15:56:43 +0000 Subject: [PATCH 295/323] Editor: Add query-total block files. This is a follow-up to [59775] to add new files that were missed in the original commit. See #62887. git-svn-id: https://develop.svn.wordpress.org/trunk@59776 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/blocks/query-total/block.json | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/wp-includes/blocks/query-total/block.json diff --git a/src/wp-includes/blocks/query-total/block.json b/src/wp-includes/blocks/query-total/block.json new file mode 100644 index 0000000000000..d52c3dd5ebab1 --- /dev/null +++ b/src/wp-includes/blocks/query-total/block.json @@ -0,0 +1,58 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "core/query-total", + "title": "Query Total", + "category": "theme", + "ancestor": [ "core/query" ], + "description": "Display the total number of results in a query.", + "textdomain": "default", + "attributes": { + "displayType": { + "type": "string", + "default": "total-results" + } + }, + "usesContext": [ "queryId", "query" ], + "supports": { + "align": [ "wide", "full" ], + "html": false, + "spacing": { + "margin": true, + "padding": true + }, + "color": { + "gradients": true, + "text": true, + "__experimentalDefaultControls": { + "background": true + } + }, + "typography": { + "fontSize": true, + "lineHeight": true, + "__experimentalFontFamily": true, + "__experimentalFontWeight": true, + "__experimentalFontStyle": true, + "__experimentalTextTransform": true, + "__experimentalTextDecoration": true, + "__experimentalLetterSpacing": true, + "__experimentalDefaultControls": { + "fontSize": true + } + }, + "__experimentalBorder": { + "radius": true, + "color": true, + "width": true, + "style": true, + "__experimentalDefaultControls": { + "radius": true, + "color": true, + "width": true, + "style": true + } + } + }, + "style": "wp-block-query-total" +} From 712a7affff85c668296906c8ff6f9888c606fccc Mon Sep 17 00:00:00 2001 From: Joe McGill <joemcgill@git.wordpress.org> Date: Fri, 7 Feb 2025 16:04:57 +0000 Subject: [PATCH 296/323] Editor: Add remaining query block file. This is a follow-up to [59776] and [59775] to add yet another file that was missed in the original commit. See #62887. git-svn-id: https://develop.svn.wordpress.org/trunk@59777 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/blocks/query-total.php | 88 ++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 src/wp-includes/blocks/query-total.php diff --git a/src/wp-includes/blocks/query-total.php b/src/wp-includes/blocks/query-total.php new file mode 100644 index 0000000000000..ff2ac486727b9 --- /dev/null +++ b/src/wp-includes/blocks/query-total.php @@ -0,0 +1,88 @@ +<?php +/** + * Server-side rendering of the `core/query-total` block. + * + * @package WordPress + */ + +/** + * Renders the `query-total` block on the server. + * + * @since 6.8.0 + * + * @param array $attributes Block attributes. + * @param string $content Block default content. + * @param WP_Block $block Block instance. + * + * @return string The rendered block content. + */ +function render_block_core_query_total( $attributes, $content, $block ) { + global $wp_query; + $wrapper_attributes = get_block_wrapper_attributes(); + if ( isset( $block->context['query']['inherit'] ) && $block->context['query']['inherit'] ) { + $query_to_use = $wp_query; + $current_page = max( 1, get_query_var( 'paged', 1 ) ); + } else { + $page_key = isset( $block->context['queryId'] ) ? 'query-' . $block->context['queryId'] . '-page' : 'query-page'; + $current_page = isset( $_GET[ $page_key ] ) ? (int) $_GET[ $page_key ] : 1; + $query_to_use = new WP_Query( build_query_vars_from_query_block( $block, $current_page ) ); + } + + $max_rows = $query_to_use->found_posts; + $posts_per_page = $query_to_use->get( 'posts_per_page' ); + + // Calculate the range of posts being displayed. + $start = ( $current_page - 1 ) * $posts_per_page + 1; + $end = min( $start + $posts_per_page - 1, $max_rows ); + + // Prepare the display based on the `displayType` attribute. + $output = ''; + switch ( $attributes['displayType'] ) { + case 'range-display': + if ( $start === $end ) { + $output = sprintf( + /* translators: 1: Start index of posts, 2: Total number of posts */ + __( 'Displaying %1$s of %2$s' ), + $start, + $max_rows + ); + } else { + $output = sprintf( + /* translators: 1: Start index of posts, 2: End index of posts, 3: Total number of posts */ + __( 'Displaying %1$s – %2$s of %3$s' ), + $start, + $end, + $max_rows + ); + } + + break; + + case 'total-results': + default: + // translators: %d: number of results. + $output = sprintf( _n( '%d result found', '%d results found', $max_rows ), $max_rows ); + break; + } + + return sprintf( + '<div %1$s>%2$s</div>', + $wrapper_attributes, + $output + ); +} + +/** + * Registers the `query-total` block. + * + * @since 6.8.0 + */ +function register_block_core_query_total() { + register_block_type_from_metadata( + __DIR__ . '/query-total', + array( + 'render_callback' => 'render_block_core_query_total', + ) + ); +} +add_action( 'init', 'register_block_core_query_total' ); From 6fea443d8f5f80090d01eab828ec8bbe6acbf2e5 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Fri, 7 Feb 2025 18:52:54 +0000 Subject: [PATCH 297/323] General: Introduce polyfills for new array related functions in PHP 8.4. PHP 8.4 introduced four new functions to provide a common way to more easily perform common operations on arrays. - `array_find()`: https://www.php.net/manual/en/function.array-find.php - `array_find_key()`: https://www.php.net/manual/en/function.array-find-key.php - `array_all()`: https://www.php.net/manual/en/function.array-all.php - `array_any()`: https://www.php.net/manual/en/function.array-any.php These functions are now polyfilled making them available on all supported versions of PHP (currently 7.2+). Props Soean, swissspidy, TobiasBg, ayeshrajans, mukesh27, joemcgill. Fixes #62558. git-svn-id: https://develop.svn.wordpress.org/trunk@59783 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/compat.php | 92 +++++++++++++++++++++ tests/phpunit/tests/compat/arrayAll.php | 80 ++++++++++++++++++ tests/phpunit/tests/compat/arrayAny.php | 73 ++++++++++++++++ tests/phpunit/tests/compat/arrayFind.php | 81 ++++++++++++++++++ tests/phpunit/tests/compat/arrayFindKey.php | 84 +++++++++++++++++++ 5 files changed, 410 insertions(+) create mode 100644 tests/phpunit/tests/compat/arrayAll.php create mode 100644 tests/phpunit/tests/compat/arrayAny.php create mode 100644 tests/phpunit/tests/compat/arrayFind.php create mode 100644 tests/phpunit/tests/compat/arrayFindKey.php diff --git a/src/wp-includes/compat.php b/src/wp-includes/compat.php index 6a393f7c984e3..01b9996c75dcb 100644 --- a/src/wp-includes/compat.php +++ b/src/wp-includes/compat.php @@ -549,6 +549,98 @@ function str_ends_with( $haystack, $needle ) { } } +if ( ! function_exists( 'array_find' ) ) { + /** + * Polyfill for `array_find()` function added in PHP 8.4. + * + * Searches an array for the first element that passes a given callback. + * + * @since 6.8.0 + * + * @param array $array The array to search. + * @param callable $callback The callback to run for each element. + * @return mixed|null The first element in the array that passes the `$callback`, otherwise null. + */ + function array_find( array $array, callable $callback ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.arrayFound + foreach ( $array as $key => $value ) { + if ( $callback( $value, $key ) ) { + return $value; + } + } + + return null; + } +} + +if ( ! function_exists( 'array_find_key' ) ) { + /** + * Polyfill for `array_find_key()` function added in PHP 8.4. + * + * Searches an array for the first key that passes a given callback. + * + * @since 6.8.0 + * + * @param array $array The array to search. + * @param callable $callback The callback to run for each element. + * @return int|string|null The first key in the array that passes the `$callback`, otherwise null. + */ + function array_find_key( array $array, callable $callback ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.arrayFound + foreach ( $array as $key => $value ) { + if ( $callback( $value, $key ) ) { + return $key; + } + } + + return null; + } +} + +if ( ! function_exists( 'array_any' ) ) { + /** + * Polyfill for `array_any()` function added in PHP 8.4. + * + * Checks if any element of an array passes a given callback. + * + * @since 6.8.0 + * + * @param array $array The array to check. + * @param callable $callback The callback to run for each element. + * @return bool True if any element in the array passes the `$callback`, otherwise false. + */ + function array_any( array $array, callable $callback ): bool { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.arrayFound + foreach ( $array as $key => $value ) { + if ( $callback( $value, $key ) ) { + return true; + } + } + + return false; + } +} + +if ( ! function_exists( 'array_all' ) ) { + /** + * Polyfill for `array_all()` function added in PHP 8.4. + * + * Checks if all elements of an array pass a given callback. + * + * @since 6.8.0 + * + * @param array $array The array to check. + * @param callable $callback The callback to run for each element. + * @return bool True if all elements in the array pass the `$callback`, otherwise false. + */ + function array_all( array $array, callable $callback ): bool { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.arrayFound + foreach ( $array as $key => $value ) { + if ( ! $callback( $value, $key ) ) { + return false; + } + } + + return true; + } +} + // IMAGETYPE_AVIF constant is only defined in PHP 8.x or later. if ( ! defined( 'IMAGETYPE_AVIF' ) ) { define( 'IMAGETYPE_AVIF', 19 ); diff --git a/tests/phpunit/tests/compat/arrayAll.php b/tests/phpunit/tests/compat/arrayAll.php new file mode 100644 index 0000000000000..4eeff04bc886e --- /dev/null +++ b/tests/phpunit/tests/compat/arrayAll.php @@ -0,0 +1,80 @@ +<?php + +/** + * @group compat + * + * @covers ::array_all + */ +class Test_Compat_arrayAll extends WP_UnitTestCase { + + /** + * Test that array_all() is always available (either from PHP or WP). + * + * @ticket 62558 + */ + public function test_array_all_availability() { + $this->assertTrue( function_exists( 'array_all' ) ); + } + + /** + * @dataProvider data_array_all + * + * @ticket 62558 + * + * @param bool $expected The expected value. + * @param array $arr The array. + * @param callable $callback The callback. + */ + public function test_array_all( bool $expected, array $arr, callable $callback ) { + $this->assertSame( $expected, array_all( $arr, $callback ) ); + } + + /** + * Data provider. + * + * @return array[] + */ + public function data_array_all(): array { + return array( + 'empty array' => array( + 'expected' => true, + 'arr' => array(), + 'callback' => function ( $value ) { + return 1 === $value; + }, + ), + 'no match' => array( + 'expected' => false, + 'arr' => array( 2, 3, 4 ), + 'callback' => function ( $value ) { + return 1 === $value; + }, + ), + 'not all match' => array( + 'expected' => false, + 'arr' => array( 2, 3, 4 ), + 'callback' => function ( $value ) { + return 0 === $value % 2; + }, + ), + 'match' => array( + 'expected' => true, + 'arr' => array( 2, 4, 6 ), + 'callback' => function ( $value ) { + return 0 === $value % 2; + }, + ), + 'key match' => array( + 'expected' => true, + 'arr' => array( + 'a' => 2, + 'b' => 4, + 'c' => 6, + ), + 'callback' => function ( $value, $key ) { + return strlen( $key ) === 1; + }, + ), + ); + } +} diff --git a/tests/phpunit/tests/compat/arrayAny.php b/tests/phpunit/tests/compat/arrayAny.php new file mode 100644 index 0000000000000..97cfce1f89574 --- /dev/null +++ b/tests/phpunit/tests/compat/arrayAny.php @@ -0,0 +1,73 @@ +<?php + +/** + * @group compat + * + * @covers ::array_any + */ +class Test_Compat_arrayAny extends WP_UnitTestCase { + + /** + * Test that array_any() is always available (either from PHP or WP). + * + * @ticket 62558 + */ + public function test_array_any_availability() { + $this->assertTrue( function_exists( 'array_any' ) ); + } + + /** + * @dataProvider data_array_any + * + * @ticket 62558 + * + * @param bool $expected The expected value. + * @param array $arr The array. + * @param callable $callback The callback. + */ + public function test_array_any( bool $expected, array $arr, callable $callback ) { + $this->assertSame( $expected, array_any( $arr, $callback ) ); + } + + /** + * Data provider. + * + * @return array[] + */ + public function data_array_any(): array { + return array( + 'empty array' => array( + 'expected' => false, + 'arr' => array(), + 'callback' => function ( $value ) { + return 1 === $value; + }, + ), + 'no match' => array( + 'expected' => false, + 'arr' => array( 2, 3, 4 ), + 'callback' => function ( $value ) { + return 1 === $value; + }, + ), + 'match' => array( + 'expected' => true, + 'arr' => array( 2, 3, 4 ), + 'callback' => function ( $value ) { + return 3 === $value; + }, + ), + 'key match' => array( + 'expected' => true, + 'arr' => array( + 'a' => 2, + 'b' => 3, + 'c' => 4, + ), + 'callback' => function ( $value, $key ) { + return 'c' === $key; + }, + ), + ); + } +} diff --git a/tests/phpunit/tests/compat/arrayFind.php b/tests/phpunit/tests/compat/arrayFind.php new file mode 100644 index 0000000000000..62c3c7386a57d --- /dev/null +++ b/tests/phpunit/tests/compat/arrayFind.php @@ -0,0 +1,81 @@ +<?php + +/** + * @group compat + * + * @covers ::array_find + */ +class Tests_Compat_arrayFind extends WP_UnitTestCase { + + /** + * Test that array_find() is always available (either from PHP or WP). + * + * @ticket 62558 + */ + public function test_array_find_availability() { + $this->assertTrue( function_exists( 'array_find' ) ); + } + + /** + * @dataProvider data_array_find + * + * @ticket 62558 + * + * @param mixed $expected The expected value. + * @param array $arr The array. + * @param callable $callback The needle. + */ + public function test_array_find( $expected, array $arr, callable $callback ) { + $this->assertSame( $expected, array_find( $arr, $callback ) ); + } + + /** + * Data provider. + * + * @return array[] + */ + public function data_array_find(): array { + return array( + 'empty array' => array( + 'expected' => null, + 'arr' => array(), + 'callback' => function ( $value ) { + return 1 === $value; + }, + ), + 'no match' => array( + 'expected' => null, + 'arr' => array( 2, 3, 4 ), + 'callback' => function ( $value ) { + return 1 === $value; + }, + ), + 'match' => array( + 'expected' => 3, + 'arr' => array( 2, 3, 4 ), + 'callback' => function ( $value ) { + return 3 === $value; + }, + ), + 'key match' => array( + 'expected' => 3, + 'arr' => array( + 'a' => 2, + 'b' => 3, + 'c' => 4, + ), + 'callback' => function ( $value ) { + return 3 === $value; + }, + ), + 'two callback matches' => array( + 'expected' => 2, + 'arr' => array( 2, 3, 4 ), + 'callback' => function ( $value ) { + return 0 === $value % 2; + }, + ), + + ); + } +} diff --git a/tests/phpunit/tests/compat/arrayFindKey.php b/tests/phpunit/tests/compat/arrayFindKey.php new file mode 100644 index 0000000000000..140067b0dbc49 --- /dev/null +++ b/tests/phpunit/tests/compat/arrayFindKey.php @@ -0,0 +1,84 @@ +<?php + +/** + * @group compat + * + * @covers ::array_find_key + */ +class Test_Compat_arrayFindKey extends WP_UnitTestCase { + + /** + * Test that array_find_key() is always available (either from PHP or WP). + * + * @ticket 62558 + */ + public function test_array_find_key_availability() { + $this->assertTrue( function_exists( 'array_find_key' ) ); + } + + /** + * @dataProvider data_array_find_key + * + * @ticket 62558 + * + * @param mixed $expected The expected value. + * @param array $arr The array. + * @param callable $callback The callback. + */ + public function test_array_find_key( $expected, array $arr, callable $callback ) { + $this->assertSame( $expected, array_find_key( $arr, $callback ) ); + } + + /** + * Data provider. + * + * @return array[] + */ + public function data_array_find_key(): array { + return array( + 'empty array' => array( + 'expected' => null, + 'arr' => array(), + 'callback' => function ( $value ) { + return 1 === $value; + }, + ), + 'no match' => array( + 'expected' => null, + 'arr' => array( 2, 3, 4 ), + 'callback' => function ( $value ) { + return 1 === $value; + }, + ), + 'match' => array( + 'expected' => 1, + 'arr' => array( 2, 3, 4 ), + 'callback' => function ( $value ) { + return 3 === $value; + }, + ), + 'key match' => array( + 'expected' => 'b', + 'arr' => array( + 'a' => 2, + 'b' => 3, + 'c' => 4, + ), + 'callback' => function ( $value ) { + return 3 === $value; + }, + ), + 'two callback matches' => array( + 'expected' => 'b', + 'arr' => array( + 'a' => 2, + 'b' => 3, + 'c' => 3, + ), + 'callback' => function ( $value ) { + return 3 === $value; + }, + ), + ); + } +} From 3f4d3585c31a72eab5e32afa057a458426aa42fd Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Sat, 8 Feb 2025 11:42:29 +0000 Subject: [PATCH 298/323] Administration: Replace "Add New {Item}" wording with "Add {Item}" across the administration. This changeset replaces each occurrence of "Add New {Item}" label with "Add {Item}" in WordPress administration, to make the interface more consistent and simplify the translation effort. Props jameskoster, audrasjb, ntsekouras, afercia, peterwilsoncc, youknowriad, joedolson, sukhendu2002, jdy68, beryldlg, fxbenard. See #61219. git-svn-id: https://develop.svn.wordpress.org/trunk@59784 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/edit-link-form.php | 4 +-- src/wp-admin/includes/meta-boxes.php | 4 +-- src/wp-admin/includes/template.php | 4 +-- src/wp-admin/link-add.php | 2 +- src/wp-admin/link-manager.php | 2 +- src/wp-admin/menu.php | 14 +++++----- src/wp-admin/network/menu.php | 8 +++--- src/wp-admin/network/settings.php | 4 +-- src/wp-admin/network/site-new.php | 4 +-- src/wp-admin/network/site-users.php | 5 +++- src/wp-admin/network/sites.php | 4 +-- src/wp-admin/network/themes.php | 2 +- src/wp-admin/network/user-new.php | 6 ++-- src/wp-admin/network/users.php | 2 +- src/wp-admin/plugins.php | 4 +-- src/wp-admin/theme-install.php | 2 +- src/wp-admin/themes.php | 6 ++-- src/wp-admin/upload.php | 4 +-- src/wp-admin/user-edit.php | 4 +-- src/wp-admin/user-new.php | 12 ++++---- src/wp-admin/users.php | 4 +-- .../class-wp-customize-control.php | 2 +- src/wp-includes/class-wp-post-type.php | 4 +-- src/wp-includes/class-wp-taxonomy.php | 2 +- ...lass-wp-customize-header-image-control.php | 10 +++---- src/wp-includes/media-template.php | 2 +- src/wp-includes/post.php | 26 +++++++++--------- src/wp-includes/taxonomy.php | 6 ++-- .../profile/applications-passwords.test.js | 2 +- tests/phpunit/data/l10n/fa_IR.mo | Bin 541 -> 528 bytes tests/phpunit/tests/formatting/wpAutop.php | 12 ++++---- .../tests/l10n/wpTranslationsConvert.php | 2 +- .../specs/visual-snapshots.test.js | 8 +++--- 33 files changed, 90 insertions(+), 87 deletions(-) diff --git a/src/wp-admin/edit-link-form.php b/src/wp-admin/edit-link-form.php index 1bbb32d3a6718..a6c919a8c01a4 100644 --- a/src/wp-admin/edit-link-form.php +++ b/src/wp-admin/edit-link-form.php @@ -19,7 +19,7 @@ $nonce_action = 'update-bookmark_' . $link_id; } else { /* translators: %s: URL to Links screen. */ - $heading = sprintf( __( '<a href="%s">Links</a> / Add New Link' ), 'link-manager.php' ); + $heading = sprintf( __( '<a href="%s">Links</a> / Add Link' ), 'link-manager.php' ); $submit_text = __( 'Add Link' ); $form_name = 'addlink'; $nonce_action = 'add-bookmark'; @@ -87,7 +87,7 @@ ?> </h1> -<a href="link-add.php" class="page-title-action"><?php echo esc_html__( 'Add New Link' ); ?></a> +<a href="link-add.php" class="page-title-action"><?php echo esc_html__( 'Add Link' ); ?></a> <hr class="wp-header-end"> diff --git a/src/wp-admin/includes/meta-boxes.php b/src/wp-admin/includes/meta-boxes.php index f1d6b87a37a55..0dfb1c9e8619d 100644 --- a/src/wp-admin/includes/meta-boxes.php +++ b/src/wp-admin/includes/meta-boxes.php @@ -1200,12 +1200,12 @@ function link_categories_meta_box( $link ) { </div> <div id="category-adder" class="wp-hidden-children"> - <a id="category-add-toggle" href="#category-add" class="taxonomy-add-new"><?php _e( '+ Add New Category' ); ?></a> + <a id="category-add-toggle" href="#category-add" class="taxonomy-add-new"><?php _e( '+ Add Category' ); ?></a> <p id="link-category-add" class="wp-hidden-child"> <label class="screen-reader-text" for="newcat"> <?php /* translators: Hidden accessibility text. */ - _e( '+ Add New Category' ); + _e( '+ Add Category' ); ?> </label> <input type="text" name="newcat" id="newcat" class="form-required form-input-tip" value="<?php esc_attr_e( 'New category name' ); ?>" aria-required="true" /> diff --git a/src/wp-admin/includes/template.php b/src/wp-admin/includes/template.php index a0d07696d3019..127027d8f543d 100644 --- a/src/wp-admin/includes/template.php +++ b/src/wp-admin/includes/template.php @@ -461,7 +461,7 @@ function wp_comment_reply( $position = 1, $checkbox = false, $mode = 'single', $ <legend> <span class="hidden" id="editlegend"><?php _e( 'Edit Comment' ); ?></span> <span class="hidden" id="replyhead"><?php _e( 'Reply to Comment' ); ?></span> - <span class="hidden" id="addhead"><?php _e( 'Add New Comment' ); ?></span> + <span class="hidden" id="addhead"><?php _e( 'Add Comment' ); ?></span> </legend> <div id="replycontainer"> @@ -735,7 +735,7 @@ function meta_form( $post = null ) { natcasesort( $keys ); } ?> -<p><strong><?php _e( 'Add New Custom Field:' ); ?></strong></p> +<p><strong><?php _e( 'Add Custom Field:' ); ?></strong></p> <table id="newmeta"> <thead> <tr> diff --git a/src/wp-admin/link-add.php b/src/wp-admin/link-add.php index 57450f0a529a9..c99630990cfbe 100644 --- a/src/wp-admin/link-add.php +++ b/src/wp-admin/link-add.php @@ -14,7 +14,7 @@ } // Used in the HTML title tag. -$title = __( 'Add New Link' ); +$title = __( 'Add Link' ); $parent_file = 'link-manager.php'; $action = ! empty( $_REQUEST['action'] ) ? sanitize_text_field( $_REQUEST['action'] ) : ''; diff --git a/src/wp-admin/link-manager.php b/src/wp-admin/link-manager.php index 4ae6c4bcc9eb8..2748bf8a2a56c 100644 --- a/src/wp-admin/link-manager.php +++ b/src/wp-admin/link-manager.php @@ -101,7 +101,7 @@ ?> </h1> -<a href="link-add.php" class="page-title-action"><?php echo esc_html__( 'Add New Link' ); ?></a> +<a href="link-add.php" class="page-title-action"><?php echo esc_html__( 'Add Link' ); ?></a> <?php if ( isset( $_REQUEST['s'] ) && strlen( $_REQUEST['s'] ) ) { diff --git a/src/wp-admin/menu.php b/src/wp-admin/menu.php index 5726570da6b8a..81fdefb8bd127 100644 --- a/src/wp-admin/menu.php +++ b/src/wp-admin/menu.php @@ -70,7 +70,7 @@ $menu[10] = array( __( 'Media' ), 'upload_files', 'upload.php', '', 'menu-top menu-icon-media', 'menu-media', 'dashicons-admin-media' ); $submenu['upload.php'][5] = array( __( 'Library' ), 'upload_files', 'upload.php' ); - $submenu['upload.php'][10] = array( __( 'Add New Media File' ), 'upload_files', 'media-new.php' ); + $submenu['upload.php'][10] = array( __( 'Add Media File' ), 'upload_files', 'media-new.php' ); $i = 15; foreach ( get_taxonomies_for_attachments( 'objects' ) as $tax ) { if ( ! $tax->show_ui || ! $tax->show_in_menu ) { @@ -83,7 +83,7 @@ $menu[15] = array( __( 'Links' ), 'manage_links', 'link-manager.php', '', 'menu-top menu-icon-links', 'menu-links', 'dashicons-admin-links' ); $submenu['link-manager.php'][5] = array( _x( 'All Links', 'admin menu' ), 'manage_links', 'link-manager.php' ); - $submenu['link-manager.php'][10] = array( __( 'Add New Link' ), 'manage_links', 'link-add.php' ); + $submenu['link-manager.php'][10] = array( __( 'Add Link' ), 'manage_links', 'link-add.php' ); $submenu['link-manager.php'][15] = array( __( 'Link Categories' ), 'manage_categories', 'edit-tags.php?taxonomy=link_category' ); // $menu[20] = Pages. @@ -302,7 +302,7 @@ function _add_plugin_file_editor_to_tools() { $submenu['plugins.php'][5] = array( __( 'Installed Plugins' ), 'activate_plugins', 'plugins.php' ); if ( ! is_multisite() ) { - $submenu['plugins.php'][10] = array( __( 'Add New Plugin' ), 'install_plugins', 'plugin-install.php' ); + $submenu['plugins.php'][10] = array( __( 'Add Plugin' ), 'install_plugins', 'plugin-install.php' ); if ( wp_is_block_theme() ) { // Place the menu item below the Theme File Editor menu item. add_action( 'admin_menu', '_add_plugin_file_editor_to_tools', 101 ); @@ -323,9 +323,9 @@ function _add_plugin_file_editor_to_tools() { $_wp_real_parent_file['profile.php'] = 'users.php'; // Back-compat for plugins adding submenus to profile.php. $submenu['users.php'][5] = array( __( 'All Users' ), 'list_users', 'users.php' ); if ( current_user_can( 'create_users' ) ) { - $submenu['users.php'][10] = array( __( 'Add New User' ), 'create_users', 'user-new.php' ); + $submenu['users.php'][10] = array( __( 'Add User' ), 'create_users', 'user-new.php' ); } elseif ( is_multisite() ) { - $submenu['users.php'][10] = array( __( 'Add New User' ), 'promote_users', 'user-new.php' ); + $submenu['users.php'][10] = array( __( 'Add User' ), 'promote_users', 'user-new.php' ); } $submenu['users.php'][15] = array( __( 'Profile' ), 'read', 'profile.php' ); @@ -333,9 +333,9 @@ function _add_plugin_file_editor_to_tools() { $_wp_real_parent_file['users.php'] = 'profile.php'; $submenu['profile.php'][5] = array( __( 'Profile' ), 'read', 'profile.php' ); if ( current_user_can( 'create_users' ) ) { - $submenu['profile.php'][10] = array( __( 'Add New User' ), 'create_users', 'user-new.php' ); + $submenu['profile.php'][10] = array( __( 'Add User' ), 'create_users', 'user-new.php' ); } elseif ( is_multisite() ) { - $submenu['profile.php'][10] = array( __( 'Add New User' ), 'promote_users', 'user-new.php' ); + $submenu['profile.php'][10] = array( __( 'Add User' ), 'promote_users', 'user-new.php' ); } } diff --git a/src/wp-admin/network/menu.php b/src/wp-admin/network/menu.php index 852c36004cbab..ee987c83c64ed 100644 --- a/src/wp-admin/network/menu.php +++ b/src/wp-admin/network/menu.php @@ -55,11 +55,11 @@ /* translators: Sites menu item. */ $menu[5] = array( __( 'Sites' ), 'manage_sites', 'sites.php', '', 'menu-top menu-icon-site', 'menu-site', 'dashicons-admin-multisite' ); $submenu['sites.php'][5] = array( __( 'All Sites' ), 'manage_sites', 'sites.php' ); -$submenu['sites.php'][10] = array( __( 'Add New Site' ), 'create_sites', 'site-new.php' ); +$submenu['sites.php'][10] = array( __( 'Add Site' ), 'create_sites', 'site-new.php' ); $menu[10] = array( __( 'Users' ), 'manage_network_users', 'users.php', '', 'menu-top menu-icon-users', 'menu-users', 'dashicons-admin-users' ); $submenu['users.php'][5] = array( __( 'All Users' ), 'manage_network_users', 'users.php' ); -$submenu['users.php'][10] = array( __( 'Add New User' ), 'create_users', 'user-new.php' ); +$submenu['users.php'][10] = array( __( 'Add User' ), 'create_users', 'user-new.php' ); if ( current_user_can( 'update_themes' ) && $update_data['counts']['themes'] ) { $menu[15] = array( @@ -83,7 +83,7 @@ $menu[15] = array( __( 'Themes' ), 'manage_network_themes', 'themes.php', '', 'menu-top menu-icon-appearance', 'menu-appearance', 'dashicons-admin-appearance' ); } $submenu['themes.php'][5] = array( __( 'Installed Themes' ), 'manage_network_themes', 'themes.php' ); -$submenu['themes.php'][10] = array( __( 'Add New Theme' ), 'install_themes', 'theme-install.php' ); +$submenu['themes.php'][10] = array( __( 'Add Theme' ), 'install_themes', 'theme-install.php' ); $submenu['themes.php'][15] = array( __( 'Theme File Editor' ), 'edit_themes', 'theme-editor.php' ); if ( current_user_can( 'update_plugins' ) && $update_data['counts']['plugins'] ) { @@ -108,7 +108,7 @@ $menu[20] = array( __( 'Plugins' ), 'manage_network_plugins', 'plugins.php', '', 'menu-top menu-icon-plugins', 'menu-plugins', 'dashicons-admin-plugins' ); } $submenu['plugins.php'][5] = array( __( 'Installed Plugins' ), 'manage_network_plugins', 'plugins.php' ); -$submenu['plugins.php'][10] = array( __( 'Add New Plugin' ), 'install_plugins', 'plugin-install.php' ); +$submenu['plugins.php'][10] = array( __( 'Add Plugin' ), 'install_plugins', 'plugin-install.php' ); $submenu['plugins.php'][15] = array( __( 'Plugin File Editor' ), 'edit_plugins', 'plugin-editor.php' ); $menu[25] = array( __( 'Settings' ), 'manage_network_options', 'settings.php', '', 'menu-top menu-icon-settings', 'menu-settings', 'dashicons-admin-settings' ); diff --git a/src/wp-admin/network/settings.php b/src/wp-admin/network/settings.php index 82543f6219f85..e0f7909ab8a6b 100644 --- a/src/wp-admin/network/settings.php +++ b/src/wp-admin/network/settings.php @@ -248,9 +248,9 @@ </tr> <tr id="addnewusers"> - <th scope="row"><?php _e( 'Add New Users' ); ?></th> + <th scope="row"><?php _e( 'Add Users' ); ?></th> <td> - <label><input name="add_new_users" type="checkbox" id="add_new_users" value="1"<?php checked( get_site_option( 'add_new_users' ) ); ?> /> <?php _e( 'Allow site administrators to add new users to their site via the "Users &rarr; Add New User" page' ); ?></label> + <label><input name="add_new_users" type="checkbox" id="add_new_users" value="1"<?php checked( get_site_option( 'add_new_users' ) ); ?> /> <?php _e( 'Allow site administrators to add new users to their site via the "Users &rarr; Add User" page' ); ?></label> </td> </tr> diff --git a/src/wp-admin/network/site-new.php b/src/wp-admin/network/site-new.php index 25500de3066fa..a3b0919155876 100644 --- a/src/wp-admin/network/site-new.php +++ b/src/wp-admin/network/site-new.php @@ -179,7 +179,7 @@ } // Used in the HTML title tag. -$title = __( 'Add New Site' ); +$title = __( 'Add Site' ); $parent_file = 'sites.php'; wp_enqueue_script( 'user-suggest' ); @@ -189,7 +189,7 @@ ?> <div class="wrap"> -<h1 id="add-new-site"><?php _e( 'Add New Site' ); ?></h1> +<h1 id="add-new-site"><?php _e( 'Add Site' ); ?></h1> <?php if ( ! empty( $messages ) ) { $notice_args = array( diff --git a/src/wp-admin/network/site-users.php b/src/wp-admin/network/site-users.php index 78af65b9ed7a8..3b970c5e53d35 100644 --- a/src/wp-admin/network/site-users.php +++ b/src/wp-admin/network/site-users.php @@ -341,6 +341,9 @@ /** * Filters whether to show the Add New User form on the Multisite Users screen. * + * Note: While WordPress is moving towards simplifying labels by removing "New" from "Add New X" labels, + * we keep "Add New User" here to maintain a clear distinction from the "Add Existing User" section above. + * * @since 3.1.0 * * @param bool $bool Whether to show the Add New User form. Default true. @@ -374,7 +377,7 @@ </tr> </table> <?php wp_nonce_field( 'add-user', '_wpnonce_add-new-user' ); ?> - <?php submit_button( __( 'Add New User' ), 'primary', 'add-user', true, array( 'id' => 'submit-add-user' ) ); ?> + <?php submit_button( __( 'Add User' ), 'primary', 'add-user', true, array( 'id' => 'submit-add-user' ) ); ?> </form> <?php endif; ?> </div> diff --git a/src/wp-admin/network/sites.php b/src/wp-admin/network/sites.php index b5835092ae608..69ee15d95c099 100644 --- a/src/wp-admin/network/sites.php +++ b/src/wp-admin/network/sites.php @@ -28,7 +28,7 @@ 'id' => 'overview', 'title' => __( 'Overview' ), 'content' => - '<p>' . __( 'Add New Site takes you to the screen for adding a new site to the network. You can search for a site by Name, ID number, or IP address. Screen Options allows you to choose how many sites to display on one page.' ) . '</p>' . + '<p>' . __( 'Add Site takes you to the screen for adding a new site to the network. You can search for a site by Name, ID number, or IP address. Screen Options allows you to choose how many sites to display on one page.' ) . '</p>' . '<p>' . __( 'This is the main table of all sites on this network. Switch between list and excerpt views by using the icons above the right side of the table.' ) . '</p>' . '<p>' . __( 'Hovering over each site reveals seven options (three for the primary site):' ) . '</p>' . '<ul><li>' . __( 'An Edit link to a separate Edit Site screen.' ) . '</li>' . @@ -388,7 +388,7 @@ <h1 class="wp-heading-inline"><?php _e( 'Sites' ); ?></h1> <?php if ( current_user_can( 'create_sites' ) ) : ?> - <a href="<?php echo esc_url( network_admin_url( 'site-new.php' ) ); ?>" class="page-title-action"><?php echo esc_html__( 'Add New Site' ); ?></a> + <a href="<?php echo esc_url( network_admin_url( 'site-new.php' ) ); ?>" class="page-title-action"><?php echo esc_html__( 'Add Site' ); ?></a> <?php endif; ?> <?php diff --git a/src/wp-admin/network/themes.php b/src/wp-admin/network/themes.php index 7252fa744fc78..9794c08f8f5e0 100644 --- a/src/wp-admin/network/themes.php +++ b/src/wp-admin/network/themes.php @@ -363,7 +363,7 @@ <h1 class="wp-heading-inline"><?php echo esc_html( $title ); ?></h1> <?php if ( current_user_can( 'install_themes' ) ) : ?> - <a href="theme-install.php" class="page-title-action"><?php echo esc_html__( 'Add New Theme' ); ?></a> + <a href="theme-install.php" class="page-title-action"><?php echo esc_html__( 'Add Theme' ); ?></a> <?php endif; ?> <?php diff --git a/src/wp-admin/network/user-new.php b/src/wp-admin/network/user-new.php index 6c9b69bc7c7e9..0f7eba1c2d650 100644 --- a/src/wp-admin/network/user-new.php +++ b/src/wp-admin/network/user-new.php @@ -1,6 +1,6 @@ <?php /** - * Add New User network administration panel. + * Add User network administration panel. * * @package WordPress * @subpackage Multisite @@ -97,14 +97,14 @@ } // Used in the HTML title tag. -$title = __( 'Add New User' ); +$title = __( 'Add User' ); $parent_file = 'users.php'; require_once ABSPATH . 'wp-admin/admin-header.php'; ?> <div class="wrap"> -<h1 id="add-new-user"><?php _e( 'Add New User' ); ?></h1> +<h1 id="add-new-user"><?php _e( 'Add User' ); ?></h1> <?php if ( '' !== $message ) { wp_admin_notice( diff --git a/src/wp-admin/network/users.php b/src/wp-admin/network/users.php index d0b40e710d286..7ddd5f40a662b 100644 --- a/src/wp-admin/network/users.php +++ b/src/wp-admin/network/users.php @@ -289,7 +289,7 @@ <?php if ( current_user_can( 'create_users' ) ) : ?> - <a href="<?php echo esc_url( network_admin_url( 'user-new.php' ) ); ?>" class="page-title-action"><?php echo esc_html__( 'Add New User' ); ?></a> + <a href="<?php echo esc_url( network_admin_url( 'user-new.php' ) ); ?>" class="page-title-action"><?php echo esc_html__( 'Add User' ); ?></a> <?php endif; diff --git a/src/wp-admin/plugins.php b/src/wp-admin/plugins.php index 339056b28278d..6a359c822fac1 100644 --- a/src/wp-admin/plugins.php +++ b/src/wp-admin/plugins.php @@ -566,7 +566,7 @@ '<p>' . __( 'The search for installed plugins will search for terms in their name, description, or author.' ) . ' <span id="live-search-desc" class="hide-if-no-js">' . __( 'The search results will be updated as you type.' ) . '</span></p>' . '<p>' . sprintf( /* translators: %s: WordPress Plugin Directory URL. */ - __( 'If you would like to see more plugins to choose from, click on the &#8220;Add New Plugin&#8221; button and you will be able to browse or search for additional plugins from the <a href="%s">WordPress Plugin Directory</a>. Plugins in the WordPress Plugin Directory are designed and developed by third parties, and are compatible with the license WordPress uses. Oh, and they are free!' ), + __( 'If you would like to see more plugins to choose from, click on the &#8220;Add Plugin&#8221; button and you will be able to browse or search for additional plugins from the <a href="%s">WordPress Plugin Directory</a>. Plugins in the WordPress Plugin Directory are designed and developed by third parties, and are compatible with the license WordPress uses. Oh, and they are free!' ), __( 'https://wordpress.org/plugins/' ) ) . '</p>', ) @@ -767,7 +767,7 @@ <?php if ( ( ! is_multisite() || is_network_admin() ) && current_user_can( 'install_plugins' ) ) { ?> - <a href="<?php echo esc_url( self_admin_url( 'plugin-install.php' ) ); ?>" class="page-title-action"><?php echo esc_html__( 'Add New Plugin' ); ?></a> + <a href="<?php echo esc_url( self_admin_url( 'plugin-install.php' ) ); ?>" class="page-title-action"><?php echo esc_html__( 'Add Plugin' ); ?></a> <?php } diff --git a/src/wp-admin/theme-install.php b/src/wp-admin/theme-install.php index bfd962d4fdb1c..ff456f32d318b 100644 --- a/src/wp-admin/theme-install.php +++ b/src/wp-admin/theme-install.php @@ -54,7 +54,7 @@ 'adminUrl' => parse_url( self_admin_url(), PHP_URL_PATH ), ), 'l10n' => array( - 'addNew' => __( 'Add New Theme' ), + 'addNew' => __( 'Add Theme' ), 'search' => __( 'Search Themes' ), 'upload' => __( 'Upload Theme' ), 'back' => __( 'Back' ), diff --git a/src/wp-admin/themes.php b/src/wp-admin/themes.php index 4c814dd42b6d1..a7ebd42c6018c 100644 --- a/src/wp-admin/themes.php +++ b/src/wp-admin/themes.php @@ -153,7 +153,7 @@ } else { $help_install = '<p>' . sprintf( /* translators: %s: https://wordpress.org/themes/ */ - __( 'If you would like to see more themes to choose from, click on the &#8220;Add New Theme&#8221; button and you will be able to browse or search for additional themes from the <a href="%s">WordPress Theme Directory</a>. Themes in the WordPress Theme Directory are designed and developed by third parties, and are compatible with the license WordPress uses. Oh, and they are free!' ), + __( 'If you would like to see more themes to choose from, click on the &#8220;Add Theme&#8221; button and you will be able to browse or search for additional themes from the <a href="%s">WordPress Theme Directory</a>. Themes in the WordPress Theme Directory are designed and developed by third parties, and are compatible with the license WordPress uses. Oh, and they are free!' ), __( 'https://wordpress.org/themes/' ) ) . '</p>'; } @@ -231,7 +231,7 @@ 'adminUrl' => parse_url( admin_url(), PHP_URL_PATH ), ), 'l10n' => array( - 'addNew' => __( 'Add New Theme' ), + 'addNew' => __( 'Add Theme' ), 'search' => __( 'Search installed themes' ), /* translators: %d: Number of themes. */ 'themesFound' => __( 'Number of Themes found: %d' ), @@ -252,7 +252,7 @@ <span class="title-count theme-count"><?php echo ! empty( $_GET['search'] ) ? __( '&hellip;' ) : count( $themes ); ?></span> </h1> <?php if ( ! is_multisite() && current_user_can( 'install_themes' ) ) : ?> - <a href="<?php echo esc_url( admin_url( 'theme-install.php' ) ); ?>" class="hide-if-no-js page-title-action"><?php echo esc_html__( 'Add New Theme' ); ?></a> + <a href="<?php echo esc_url( admin_url( 'theme-install.php' ) ); ?>" class="hide-if-no-js page-title-action"><?php echo esc_html__( 'Add Theme' ); ?></a> <?php endif; ?> <hr class="wp-header-end"> <form class="search-form search-themes"><p class="search-box"></p></form> diff --git a/src/wp-admin/upload.php b/src/wp-admin/upload.php index 8267ad50be506..7c1cd8551d21c 100644 --- a/src/wp-admin/upload.php +++ b/src/wp-admin/upload.php @@ -212,7 +212,7 @@ function () { <?php if ( current_user_can( 'upload_files' ) ) { ?> - <a href="<?php echo esc_url( admin_url( 'media-new.php' ) ); ?>" class="page-title-action aria-button-if-js"><?php echo esc_html__( 'Add New Media File' ); ?></a> + <a href="<?php echo esc_url( admin_url( 'media-new.php' ) ); ?>" class="page-title-action aria-button-if-js"><?php echo esc_html__( 'Add Media File' ); ?></a> <?php } ?> @@ -419,7 +419,7 @@ function () { <?php if ( current_user_can( 'upload_files' ) ) { ?> - <a href="<?php echo esc_url( admin_url( 'media-new.php' ) ); ?>" class="page-title-action"><?php echo esc_html__( 'Add New Media File' ); ?></a> + <a href="<?php echo esc_url( admin_url( 'media-new.php' ) ); ?>" class="page-title-action"><?php echo esc_html__( 'Add Media File' ); ?></a> <?php } diff --git a/src/wp-admin/user-edit.php b/src/wp-admin/user-edit.php index 1e9fe4dcc4213..564009ede859c 100644 --- a/src/wp-admin/user-edit.php +++ b/src/wp-admin/user-edit.php @@ -266,7 +266,7 @@ <?php if ( ! IS_PROFILE_PAGE ) : ?> <?php if ( current_user_can( 'create_users' ) ) : ?> - <a href="user-new.php" class="page-title-action"><?php echo esc_html__( 'Add New User' ); ?></a> + <a href="user-new.php" class="page-title-action"><?php echo esc_html__( 'Add User' ); ?></a> <?php elseif ( is_multisite() && current_user_can( 'promote_users' ) ) : ?> <a href="user-new.php" class="page-title-action"><?php echo esc_html__( 'Add Existing User' ); ?></a> <?php endif; ?> @@ -832,7 +832,7 @@ do_action( 'wp_create_application_password_form', $profile_user ); ?> - <button type="button" name="do_new_application_password" id="do_new_application_password" class="button button-secondary"><?php _e( 'Add New Application Password' ); ?></button> + <button type="button" name="do_new_application_password" id="do_new_application_password" class="button button-secondary"><?php _e( 'Add Application Password' ); ?></button> </div> <?php else : diff --git a/src/wp-admin/user-new.php b/src/wp-admin/user-new.php index 22a955abb928a..aed07ff1c3321 100644 --- a/src/wp-admin/user-new.php +++ b/src/wp-admin/user-new.php @@ -261,7 +261,7 @@ } // Used in the HTML title tag. -$title = __( 'Add New User' ); +$title = __( 'Add User' ); $parent_file = 'users.php'; $do_both = false; @@ -269,7 +269,7 @@ $do_both = true; } -$help = '<p>' . __( 'To add a new user to your site, fill in the form on this screen and click the Add New User button at the bottom.' ) . '</p>'; +$help = '<p>' . __( 'To add a new user to your site, fill in the form on this screen and click the Add User button at the bottom.' ) . '</p>'; if ( is_multisite() ) { $help .= '<p>' . __( 'Because this is a multisite installation, you may add accounts that already exist on the Network by specifying a username or email, and defining a role. For more options, such as specifying a password, you have to be a Network Administrator and use the hover link under an existing user&#8217;s name to Edit the user profile under Network Admin > All Users.' ) . '</p>' . @@ -280,7 +280,7 @@ '<p>' . __( 'By default, new users will receive an email letting them know they&#8217;ve been added as a user for your site. This email will also contain a password reset link. Uncheck the box if you do not want to send the new user a welcome email.' ) . '</p>'; } -$help .= '<p>' . __( 'Remember to click the Add New User button at the bottom of this screen when you are finished.' ) . '</p>'; +$help .= '<p>' . __( 'Remember to click the Add User button at the bottom of this screen when you are finished.' ) . '</p>'; get_current_screen()->add_help_tab( array( @@ -383,7 +383,7 @@ <h1 id="add-new-user"> <?php if ( current_user_can( 'create_users' ) ) { - _e( 'Add New User' ); + _e( 'Add User' ); } elseif ( current_user_can( 'promote_users' ) ) { _e( 'Add Existing User' ); } @@ -507,7 +507,7 @@ if ( current_user_can( 'create_users' ) ) { if ( $do_both ) { - echo '<h2 id="create-new-user">' . __( 'Add New User' ) . '</h2>'; + echo '<h2 id="create-new-user">' . __( 'Add User' ) . '</h2>'; } ?> <p><?php _e( 'Create a brand new user and add them to this site.' ); ?></p> @@ -659,7 +659,7 @@ do_action( 'user_new_form', 'add-new-user' ); ?> - <?php submit_button( __( 'Add New User' ), 'primary', 'createuser', true, array( 'id' => 'createusersub' ) ); ?> + <?php submit_button( __( 'Add User' ), 'primary', 'createuser', true, array( 'id' => 'createusersub' ) ); ?> </form> <?php } // End if current_user_can( 'create_users' ). ?> diff --git a/src/wp-admin/users.php b/src/wp-admin/users.php index 4951a7e9bfb0b..c6f0efe9d4b06 100644 --- a/src/wp-admin/users.php +++ b/src/wp-admin/users.php @@ -33,7 +33,7 @@ 'id' => 'overview', 'title' => __( 'Overview' ), 'content' => '<p>' . __( 'This screen lists all the existing users for your site. Each user has one of five defined roles as set by the site admin: Site Administrator, Editor, Author, Contributor, or Subscriber. Users with roles other than Administrator will see fewer options in the dashboard navigation when they are logged in, based on their role.' ) . '</p>' . - '<p>' . __( 'To add a new user for your site, click the Add New User button at the top of the screen or Add New User in the Users menu section.' ) . '</p>', + '<p>' . __( 'To add a new user for your site, click the Add User button at the top of the screen or Add User in the Users menu section.' ) . '</p>', ) ); @@ -778,7 +778,7 @@ printf( '<a href="%1$s" class="page-title-action">%2$s</a>', esc_url( admin_url( 'user-new.php' ) ), - esc_html__( 'Add New User' ) + esc_html__( 'Add User' ) ); } elseif ( is_multisite() && current_user_can( 'promote_users' ) ) { printf( diff --git a/src/wp-includes/class-wp-customize-control.php b/src/wp-includes/class-wp-customize-control.php index c85322fd9114b..6952f9f6df2ab 100644 --- a/src/wp-includes/class-wp-customize-control.php +++ b/src/wp-includes/class-wp-customize-control.php @@ -636,7 +636,7 @@ protected function render_content() { <?php if ( $this->allow_addition && current_user_can( 'publish_pages' ) && current_user_can( 'edit_theme_options' ) ) : // Currently tied to menus functionality. ?> <button type="button" class="button-link add-new-toggle"> <?php - /* translators: %s: Add New Page label. */ + /* translators: %s: Add Page label. */ printf( __( '+ %s' ), get_post_type_object( 'page' )->labels->add_new_item ); ?> </button> diff --git a/src/wp-includes/class-wp-post-type.php b/src/wp-includes/class-wp-post-type.php index 400fd0b698c1e..049d7ac97676d 100644 --- a/src/wp-includes/class-wp-post-type.php +++ b/src/wp-includes/class-wp-post-type.php @@ -989,8 +989,8 @@ public static function get_default_labels() { self::$default_labels = array( 'name' => array( _x( 'Posts', 'post type general name' ), _x( 'Pages', 'post type general name' ) ), 'singular_name' => array( _x( 'Post', 'post type singular name' ), _x( 'Page', 'post type singular name' ) ), - 'add_new' => array( __( 'Add New' ), __( 'Add New' ) ), - 'add_new_item' => array( __( 'Add New Post' ), __( 'Add New Page' ) ), + 'add_new' => array( __( 'Add' ), __( 'Add New' ) ), + 'add_new_item' => array( __( 'Add Post' ), __( 'Add New Page' ) ), 'edit_item' => array( __( 'Edit Post' ), __( 'Edit Page' ) ), 'new_item' => array( __( 'New Post' ), __( 'New Page' ) ), 'view_item' => array( __( 'View Post' ), __( 'View Page' ) ), diff --git a/src/wp-includes/class-wp-taxonomy.php b/src/wp-includes/class-wp-taxonomy.php index 254ea6a15c98b..44f1964886106 100644 --- a/src/wp-includes/class-wp-taxonomy.php +++ b/src/wp-includes/class-wp-taxonomy.php @@ -624,7 +624,7 @@ public static function get_default_labels() { 'edit_item' => array( __( 'Edit Tag' ), __( 'Edit Category' ) ), 'view_item' => array( __( 'View Tag' ), __( 'View Category' ) ), 'update_item' => array( __( 'Update Tag' ), __( 'Update Category' ) ), - 'add_new_item' => array( __( 'Add New Tag' ), __( 'Add New Category' ) ), + 'add_new_item' => array( __( 'Add Tag' ), __( 'Add New Category' ) ), 'new_item_name' => array( __( 'New Tag Name' ), __( 'New Category Name' ) ), 'separate_items_with_commas' => array( __( 'Separate tags with commas' ), null ), 'add_or_remove_items' => array( __( 'Add or remove tags' ), null ), diff --git a/src/wp-includes/customize/class-wp-customize-header-image-control.php b/src/wp-includes/customize/class-wp-customize-header-image-control.php index ecb134a5d1d5f..2d36ecccc459d 100644 --- a/src/wp-includes/customize/class-wp-customize-header-image-control.php +++ b/src/wp-includes/customize/class-wp-customize-header-image-control.php @@ -212,23 +212,23 @@ public function render_content() { <p class="customizer-section-intro customize-control-description"> <?php if ( current_theme_supports( 'custom-header', 'video' ) ) { - _e( 'Click &#8220;Add New Image&#8221; to upload an image file from your computer. Your theme works best with an image that matches the size of your video &#8212; you&#8217;ll be able to crop your image once you upload it for a perfect fit.' ); + _e( 'Click &#8220;Add Image&#8221; to upload an image file from your computer. Your theme works best with an image that matches the size of your video &#8212; you&#8217;ll be able to crop your image once you upload it for a perfect fit.' ); } elseif ( $width && $height ) { printf( /* translators: %s: Header size in pixels. */ - __( 'Click &#8220;Add New Image&#8221; to upload an image file from your computer. Your theme works best with an image with a header size of %s pixels &#8212; you&#8217;ll be able to crop your image once you upload it for a perfect fit.' ), + __( 'Click &#8220;Add Image&#8221; to upload an image file from your computer. Your theme works best with an image with a header size of %s pixels &#8212; you&#8217;ll be able to crop your image once you upload it for a perfect fit.' ), sprintf( '<strong>%s &times; %s</strong>', $width, $height ) ); } elseif ( $width ) { printf( /* translators: %s: Header width in pixels. */ - __( 'Click &#8220;Add New Image&#8221; to upload an image file from your computer. Your theme works best with an image with a header width of %s pixels &#8212; you&#8217;ll be able to crop your image once you upload it for a perfect fit.' ), + __( 'Click &#8220;Add Image&#8221; to upload an image file from your computer. Your theme works best with an image with a header width of %s pixels &#8212; you&#8217;ll be able to crop your image once you upload it for a perfect fit.' ), sprintf( '<strong>%s</strong>', $width ) ); } else { printf( /* translators: %s: Header height in pixels. */ - __( 'Click &#8220;Add New Image&#8221; to upload an image file from your computer. Your theme works best with an image with a header height of %s pixels &#8212; you&#8217;ll be able to crop your image once you upload it for a perfect fit.' ), + __( 'Click &#8220;Add Image&#8221; to upload an image file from your computer. Your theme works best with an image with a header height of %s pixels &#8212; you&#8217;ll be able to crop your image once you upload it for a perfect fit.' ), sprintf( '<strong>%s</strong>', $height ) ); } @@ -246,7 +246,7 @@ public function render_content() { <div class="actions"> <?php if ( current_user_can( 'upload_files' ) ) : ?> <button type="button"<?php echo $visibility; ?> class="button remove" aria-label="<?php esc_attr_e( 'Hide header image' ); ?>"><?php _e( 'Hide image' ); ?></button> - <button type="button" class="button new" id="header_image-button" aria-label="<?php esc_attr_e( 'Add New Header Image' ); ?>"><?php _e( 'Add New Image' ); ?></button> + <button type="button" class="button new" id="header_image-button" aria-label="<?php esc_attr_e( 'Add Header Image' ); ?>"><?php _e( 'Add Image' ); ?></button> <?php endif; ?> </div> <div class="choices"> diff --git a/src/wp-includes/media-template.php b/src/wp-includes/media-template.php index ab84d18fd2ac0..a5991ab748b8f 100644 --- a/src/wp-includes/media-template.php +++ b/src/wp-includes/media-template.php @@ -223,7 +223,7 @@ function wp_print_media_templates() { </div> </script> - <?php // Template for the inline uploader, used for example in the Media Library admin page - Add New. ?> + <?php // Template for the inline uploader, used for example in the Media Library admin page - Add. ?> <script type="text/html" id="tmpl-uploader-inline"> <# var messageClass = data.message ? 'has-upload-message' : 'no-upload-message'; #> <# if ( data.canClose ) { #> diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index a78e97b6c1dd9..58504e140a139 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -75,7 +75,7 @@ function create_initial_post_types() { 'labels' => array( 'name' => _x( 'Media', 'post type general name' ), 'name_admin_bar' => _x( 'Media', 'add new from admin bar' ), - 'add_new' => __( 'Add New Media File' ), + 'add_new' => __( 'Add Media File' ), 'edit_item' => __( 'Edit Media' ), 'view_item' => ( '1' === get_option( 'wp_attachment_pages_enabled' ) ) ? __( 'View Attachment Page' ) : __( 'View Media File' ), 'attributes' => __( 'Attachment Attributes' ), @@ -202,8 +202,8 @@ function create_initial_post_types() { 'labels' => array( 'name' => _x( 'Changesets', 'post type general name' ), 'singular_name' => _x( 'Changeset', 'post type singular name' ), - 'add_new' => __( 'Add New Changeset' ), - 'add_new_item' => __( 'Add New Changeset' ), + 'add_new' => __( 'Add Changeset' ), + 'add_new_item' => __( 'Add Changeset' ), 'new_item' => __( 'New Changeset' ), 'edit_item' => __( 'Edit Changeset' ), 'view_item' => __( 'View Changeset' ), @@ -284,8 +284,8 @@ function create_initial_post_types() { 'labels' => array( 'name' => _x( 'Patterns', 'post type general name' ), 'singular_name' => _x( 'Pattern', 'post type singular name' ), - 'add_new' => __( 'Add New Pattern' ), - 'add_new_item' => __( 'Add New Pattern' ), + 'add_new' => __( 'Add Pattern' ), + 'add_new_item' => __( 'Add Pattern' ), 'new_item' => __( 'New Pattern' ), 'edit_item' => __( 'Edit Block Pattern' ), 'view_item' => __( 'View Pattern' ), @@ -350,8 +350,8 @@ function create_initial_post_types() { 'labels' => array( 'name' => _x( 'Templates', 'post type general name' ), 'singular_name' => _x( 'Template', 'post type singular name' ), - 'add_new' => __( 'Add New Template' ), - 'add_new_item' => __( 'Add New Template' ), + 'add_new' => __( 'Add Template' ), + 'add_new_item' => __( 'Add Template' ), 'new_item' => __( 'New Template' ), 'edit_item' => __( 'Edit Template' ), 'view_item' => __( 'View Template' ), @@ -415,8 +415,8 @@ function create_initial_post_types() { 'labels' => array( 'name' => _x( 'Template Parts', 'post type general name' ), 'singular_name' => _x( 'Template Part', 'post type singular name' ), - 'add_new' => __( 'Add New Template Part' ), - 'add_new_item' => __( 'Add New Template Part' ), + 'add_new' => __( 'Add Template Part' ), + 'add_new_item' => __( 'Add Template Part' ), 'new_item' => __( 'New Template Part' ), 'edit_item' => __( 'Edit Template Part' ), 'view_item' => __( 'View Template Part' ), @@ -522,8 +522,8 @@ function create_initial_post_types() { 'labels' => array( 'name' => _x( 'Navigation Menus', 'post type general name' ), 'singular_name' => _x( 'Navigation Menu', 'post type singular name' ), - 'add_new' => __( 'Add New Navigation Menu' ), - 'add_new_item' => __( 'Add New Navigation Menu' ), + 'add_new' => __( 'Add Navigation Menu' ), + 'add_new_item' => __( 'Add Navigation Menu' ), 'new_item' => __( 'New Navigation Menu' ), 'edit_item' => __( 'Edit Navigation Menu' ), 'view_item' => __( 'View Navigation Menu' ), @@ -2026,8 +2026,8 @@ function _post_type_meta_capabilities( $capabilities = null ) { * - `name` - General name for the post type, usually plural. The same and overridden * by `$post_type_object->label`. Default is 'Posts' / 'Pages'. * - `singular_name` - Name for one object of this post type. Default is 'Post' / 'Page'. - * - `add_new` - Label for adding a new item. Default is 'Add New' / 'Add New'. - * - `add_new_item` - Label for adding a new singular item. Default is 'Add New Post' / 'Add New Page'. + * - `add_new` - Label for adding a new item. Default is 'Add Post' / 'Add Page'. + * - `add_new_item` - Label for adding a new singular item. Default is 'Add Post' / 'Add Page'. * - `edit_item` - Label for editing a singular item. Default is 'Edit Post' / 'Edit Page'. * - `new_item` - Label for the new item page title. Default is 'New Post' / 'New Page'. * - `view_item` - Label for viewing a singular item. Default is 'View Post' / 'View Page'. diff --git a/src/wp-includes/taxonomy.php b/src/wp-includes/taxonomy.php index 1af1b5a76b70d..3e235b780fabb 100644 --- a/src/wp-includes/taxonomy.php +++ b/src/wp-includes/taxonomy.php @@ -146,7 +146,7 @@ function create_initial_taxonomies() { 'all_items' => __( 'All Link Categories' ), 'edit_item' => __( 'Edit Link Category' ), 'update_item' => __( 'Update Link Category' ), - 'add_new_item' => __( 'Add New Link Category' ), + 'add_new_item' => __( 'Add Link Category' ), 'new_item_name' => __( 'New Link Category Name' ), 'separate_items_with_commas' => null, 'add_or_remove_items' => null, @@ -233,7 +233,7 @@ function create_initial_taxonomies() { 'labels' => array( 'name' => _x( 'Pattern Categories', 'taxonomy general name' ), 'singular_name' => _x( 'Pattern Category', 'taxonomy singular name' ), - 'add_new_item' => __( 'Add New Category' ), + 'add_new_item' => __( 'Add Category' ), 'add_or_remove_items' => __( 'Add or remove pattern categories' ), 'back_to_items' => __( '&larr; Go to Pattern Categories' ), 'choose_from_most_used' => __( 'Choose from the most used pattern categories' ), @@ -678,7 +678,7 @@ function unregister_taxonomy( $taxonomy ) { * @type string $edit_item Default 'Edit Tag'/'Edit Category'. * @type string $view_item Default 'View Tag'/'View Category'. * @type string $update_item Default 'Update Tag'/'Update Category'. - * @type string $add_new_item Default 'Add New Tag'/'Add New Category'. + * @type string $add_new_item Default 'Add Tag'/'Add Category'. * @type string $new_item_name Default 'New Tag Name'/'New Category Name'. * @type string $template_name Default 'Tag Archives'/'Category Archives'. * @type string $separate_items_with_commas This label is only used for non-hierarchical taxonomies. Default diff --git a/tests/e2e/specs/profile/applications-passwords.test.js b/tests/e2e/specs/profile/applications-passwords.test.js index 3ff4ef4ad7795..f6c5cf7a781b7 100644 --- a/tests/e2e/specs/profile/applications-passwords.test.js +++ b/tests/e2e/specs/profile/applications-passwords.test.js @@ -101,7 +101,7 @@ class ApplicationPasswords { await expect( newPasswordField ).toBeVisible(); await newPasswordField.fill( applicationName ); - await this.page.getByRole( 'button', { name: 'Add New Application Password' } ).click(); + await this.page.getByRole( 'button', { name: 'Add Application Password' } ).click(); await expect( this.page.getByRole( 'alert' ) ).toBeVisible(); } diff --git a/tests/phpunit/data/l10n/fa_IR.mo b/tests/phpunit/data/l10n/fa_IR.mo index 19f165658ea5cfe2930d9f923e38811053e93a0c..5be133413454463acc2d0d511ff06ba5a36d7ec7 100644 GIT binary patch delta 53 zcmbQsGJ$1+i7E#J1H*hER%B#gSOKK@f%p`VtpTKO0cjo}%{(#EZ{z9=Mn(nz-x&yc delta 67 zcmbQhGM8n7i7F2R1H*hER%B#gSOcW_f%qJdtpTL(0clYn%|0>Gk43>RwS4393`Q=6 O8*6T?zuj|VJp%xW8xR8k diff --git a/tests/phpunit/tests/formatting/wpAutop.php b/tests/phpunit/tests/formatting/wpAutop.php index 8f17cd5d282b2..ee4d90645d09c 100644 --- a/tests/phpunit/tests/formatting/wpAutop.php +++ b/tests/phpunit/tests/formatting/wpAutop.php @@ -22,9 +22,9 @@ public function test_first_post() { <p>Then you can start enjoying the WordPress experience:</p> <ul> <li>Edit your personal information at <a href="%3$s" title="Edit settings like your password, your display name and your contact information">Users &#8250; Profile</a></li> -<li>Start publishing at <a href="%4$s" title="Create a new post">Posts &#8250; Add New</a> and at <a href="%5$s" title="Create a new page">Pages &#8250; Add New</a></li> -<li>Browse and install plugins at <a href="%6$s" title="Browse and install plugins at the official WordPress repository directly from your Dashboard">Plugins &#8250; Add New</a></li> -<li>Browse and install themes at <a href="%7$s" title="Browse and install themes at the official WordPress repository directly from your Dashboard">Appearance &#8250; Add New Themes</a></li> +<li>Start publishing at <a href="%4$s" title="Create a new post">Posts &#8250; Add</a> and at <a href="%5$s" title="Create a new page">Pages &#8250; Add</a></li> +<li>Browse and install plugins at <a href="%6$s" title="Browse and install plugins at the official WordPress repository directly from your Dashboard">Plugins &#8250; Add</a></li> +<li>Browse and install themes at <a href="%7$s" title="Browse and install themes at the official WordPress repository directly from your Dashboard">Appearance &#8250; Add Themes</a></li> <li>Modify and prettify your website&#8217;s links at <a href="%8$s" title="For example, select a link structure like: http://example.com/1999/12/post-name">Settings &#8250; Permalinks</a></li> <li>Import content from another system or WordPress site at <a href="%9$s" title="WordPress comes with importers for the most common publishing systems">Tools &#8250; Import</a></li> <li>Find answers to your questions at the <a href="%10$s" title="The official WordPress documentation, maintained by the WordPress community">WordPress Codex</a></li> @@ -47,9 +47,9 @@ public function test_first_post() { Then you can start enjoying the WordPress experience: <ul> <li>Edit your personal information at <a href="%3$s" title="Edit settings like your password, your display name and your contact information">Users &#8250; Profile</a></li> -<li>Start publishing at <a href="%4$s" title="Create a new post">Posts &#8250; Add New</a> and at <a href="%5$s" title="Create a new page">Pages &#8250; Add New</a></li> -<li>Browse and install plugins at <a href="%6$s" title="Browse and install plugins at the official WordPress repository directly from your Dashboard">Plugins &#8250; Add New</a></li> -<li>Browse and install themes at <a href="%7$s" title="Browse and install themes at the official WordPress repository directly from your Dashboard">Appearance &#8250; Add New Themes</a></li> +<li>Start publishing at <a href="%4$s" title="Create a new post">Posts &#8250; Add</a> and at <a href="%5$s" title="Create a new page">Pages &#8250; Add</a></li> +<li>Browse and install plugins at <a href="%6$s" title="Browse and install plugins at the official WordPress repository directly from your Dashboard">Plugins &#8250; Add</a></li> +<li>Browse and install themes at <a href="%7$s" title="Browse and install themes at the official WordPress repository directly from your Dashboard">Appearance &#8250; Add Themes</a></li> <li>Modify and prettify your website&#8217;s links at <a href="%8$s" title="For example, select a link structure like: http://example.com/1999/12/post-name">Settings &#8250; Permalinks</a></li> <li>Import content from another system or WordPress site at <a href="%9$s" title="WordPress comes with importers for the most common publishing systems">Tools &#8250; Import</a></li> <li>Find answers to your questions at the <a href="%10$s" title="The official WordPress documentation, maintained by the WordPress community">WordPress Codex</a></li> diff --git a/tests/phpunit/tests/l10n/wpTranslationsConvert.php b/tests/phpunit/tests/l10n/wpTranslationsConvert.php index cd046fdb80894..564857b041a48 100644 --- a/tests/phpunit/tests/l10n/wpTranslationsConvert.php +++ b/tests/phpunit/tests/l10n/wpTranslationsConvert.php @@ -398,7 +398,7 @@ public function test_load_no_plurals() { $this->assertFalse( $controller->translate( "string that doesn't exist", '', 'unittest' ) ); $this->assertSame( 'رونوشت‌ها فعال نشدند.', $controller->translate( 'Revisions not enabled.', '', 'unittest' ) ); - $this->assertSame( 'افزودن جدید', $controller->translate( 'Add New', 'file', 'unittest' ) ); + $this->assertSame( 'افزودن', $controller->translate( 'Add', 'file', 'unittest' ) ); $this->assertSame( '%s دیدگاه', $controller->translate_plural( array( '%s comment', '%s comments' ), 0, '', 'unittest' ) ); $this->assertSame( '%s دیدگاه', $controller->translate_plural( array( '%s comment', '%s comments' ), 1, '', 'unittest' ) ); diff --git a/tests/visual-regression/specs/visual-snapshots.test.js b/tests/visual-regression/specs/visual-snapshots.test.js index d2f1eb9e7ebe0..048a6bc0b47cb 100644 --- a/tests/visual-regression/specs/visual-snapshots.test.js +++ b/tests/visual-regression/specs/visual-snapshots.test.js @@ -35,9 +35,9 @@ test.describe( 'Admin Visual Snapshots', () => { }); } ); - test( 'Add New Media', async ({ admin, page }) => { + test( 'Add Media', async ({ admin, page }) => { await admin.visitAdminPage( '/media-new.php' ); - await expect( page ).toHaveScreenshot( 'Add New Media.png', { + await expect( page ).toHaveScreenshot( 'Add Media.png', { mask: elementsToHide.map( ( selector ) => page.locator( selector ) ), }); } ); @@ -84,9 +84,9 @@ test.describe( 'Admin Visual Snapshots', () => { }); } ); - test( 'Add New User', async ({ admin, page }) => { + test( 'Add User', async ({ admin, page }) => { await admin.visitAdminPage( '/user-new.php' ); - await expect( page ).toHaveScreenshot( 'Add New User.png', { + await expect( page ).toHaveScreenshot( 'Add User.png', { mask: [ ...elementsToHide, '.password-input-wrapper' From 37f4f61d1eac4f942b291587903a60285b85f7da Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Sat, 8 Feb 2025 11:58:35 +0000 Subject: [PATCH 299/323] Docs: Various Docblock fixes in `wp-includes/class-wp-customize-control.php`, as per WP Docs standards; See #62281. git-svn-id: https://develop.svn.wordpress.org/trunk@59785 602fd350-edb4-49c9-b593-d223f7449a82 --- .../class-wp-customize-control.php | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/wp-includes/class-wp-customize-control.php b/src/wp-includes/class-wp-customize-control.php index 6952f9f6df2ab..e6697078d5fe5 100644 --- a/src/wp-includes/class-wp-customize-control.php +++ b/src/wp-includes/class-wp-customize-control.php @@ -247,14 +247,14 @@ public function __construct( $manager, $id, $args = array() ) { } /** - * Enqueue control related scripts/styles. + * Enqueues control related scripts/styles. * * @since 3.4.0 */ public function enqueue() {} /** - * Check whether control is active to current Customizer preview. + * Checks whether control is active to current Customizer preview. * * @since 4.0.0 * @@ -292,7 +292,7 @@ public function active_callback() { } /** - * Fetch a setting's value. + * Fetches a setting's value. * Grabs the main setting by default. * * @since 3.4.0 @@ -307,7 +307,7 @@ final public function value( $setting_key = 'default' ) { } /** - * Refresh the parameters passed to the JavaScript via JSON. + * Refreshes the parameters passed to the JavaScript via JSON. * * @since 3.4.0 */ @@ -332,7 +332,7 @@ public function to_json() { } /** - * Get the data to export to the client via JSON. + * Gets the data to export to the client via JSON. * * @since 4.1.0 * @@ -375,7 +375,7 @@ final public function check_capabilities() { } /** - * Get the control's content for insertion into the Customizer pane. + * Gets the control's content for insertion into the Customizer pane. * * @since 4.1.0 * @@ -388,7 +388,7 @@ final public function get_content() { } /** - * Check capabilities and render the control. + * Checks capabilities and render the control. * * @since 3.4.0 * @uses WP_Customize_Control::render() @@ -437,14 +437,15 @@ protected function render() { } /** - * Get the data link attribute for a setting. + * Gets the data link attribute for a setting. * * @since 3.4.0 * @since 4.9.0 Return a `data-customize-setting-key-link` attribute if a setting is not registered for the supplied setting key. * * @param string $setting_key - * @return string Data link parameter, a `data-customize-setting-link` attribute if the `$setting_key` refers to a pre-registered setting, - * and a `data-customize-setting-key-link` attribute if the setting is not yet registered. + * @return string Data link parameter, a `data-customize-setting-link` attribute if the `$setting_key` refers + * to a pre-registered setting, and a `data-customize-setting-key-link` attribute if the setting + * is not yet registered. */ public function get_link( $setting_key = 'default' ) { if ( isset( $this->settings[ $setting_key ] ) && $this->settings[ $setting_key ] instanceof WP_Customize_Setting ) { @@ -455,19 +456,19 @@ public function get_link( $setting_key = 'default' ) { } /** - * Render the data link attribute for the control's input element. + * Renders the data link attribute for the control's input element. * * @since 3.4.0 * @uses WP_Customize_Control::get_link() * - * @param string $setting_key + * @param string $setting_key Default 'default'. */ public function link( $setting_key = 'default' ) { echo $this->get_link( $setting_key ); } /** - * Render the custom attributes for the control's input element. + * Renders the custom attributes for the control's input element. * * @since 4.0.0 */ @@ -478,7 +479,7 @@ public function input_attrs() { } /** - * Render the control's content. + * Renders the control's content. * * Allows the content to be overridden without having to rewrite the wrapper in `$this::render()`. * @@ -674,7 +675,7 @@ protected function render_content() { } /** - * Render the control's JS template. + * Renders the control's JS template. * * This function is only run for control types that have been registered with * WP_Customize_Manager::register_control_type(). From 9a362dad6198de447df2d4121a7b224bf33267ee Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Sat, 8 Feb 2025 12:12:40 +0000 Subject: [PATCH 300/323] Bundled Themes: Replace references to "Add New" theme screen in bundled themes readme files. Follow-up to [59784]. Props jameskoster, audrasjb, ntsekouras, afercia, peterwilsoncc, youknowriad, joedolson, sukhendu2002, jdy68, beryldlg, fxbenard. Fixes #61219. git-svn-id: https://develop.svn.wordpress.org/trunk@59786 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-content/themes/twentyeleven/readme.txt | 2 +- src/wp-content/themes/twentyfifteen/readme.txt | 2 +- src/wp-content/themes/twentyfourteen/readme.txt | 2 +- src/wp-content/themes/twentynineteen/readme.txt | 2 +- src/wp-content/themes/twentyseventeen/readme.txt | 2 +- src/wp-content/themes/twentysixteen/readme.txt | 2 +- src/wp-content/themes/twentyten/readme.txt | 2 +- src/wp-content/themes/twentythirteen/readme.txt | 2 +- src/wp-content/themes/twentytwelve/readme.txt | 2 +- src/wp-content/themes/twentytwentyone/readme.txt | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/wp-content/themes/twentyeleven/readme.txt b/src/wp-content/themes/twentyeleven/readme.txt index f8d794b9b8a23..c84ec78d76201 100644 --- a/src/wp-content/themes/twentyeleven/readme.txt +++ b/src/wp-content/themes/twentyeleven/readme.txt @@ -15,7 +15,7 @@ For more information about Twenty Eleven please go to https://codex.wordpress.or == Installation == -1. In your admin panel, go to Appearance -> Themes and click the 'Add New' button. +1. In your admin panel, go to Appearance -> Themes and click the 'Add' button. 2. Type in Twenty Eleven in the search form and press the 'Enter' key in your keyboard. 3. Click on the 'Activate' button to use your new theme right away. 4. Go to https://codex.wordpress.org/Twenty_Eleven for a guide to customize this theme. diff --git a/src/wp-content/themes/twentyfifteen/readme.txt b/src/wp-content/themes/twentyfifteen/readme.txt index 2fd9ff16029ad..ca0f4b5e16b7e 100644 --- a/src/wp-content/themes/twentyfifteen/readme.txt +++ b/src/wp-content/themes/twentyfifteen/readme.txt @@ -23,7 +23,7 @@ For more information about Twenty Fifteen please go to https://wordpress.org/doc == Installation == -1. In your admin panel, go to Appearance -> Themes and click the 'Add New' button. +1. In your admin panel, go to Appearance -> Themes and click the 'Add' button. 2. Type in Twenty Fifteen in the search form and press the 'Enter' key on your keyboard. 3. Click on the 'Activate' button to use your new theme right away. 4. Go to https://wordpress.org/documentation/article/twenty-fifteen/ for a guide on how to customize this theme. diff --git a/src/wp-content/themes/twentyfourteen/readme.txt b/src/wp-content/themes/twentyfourteen/readme.txt index af119167596ea..35e59371eb824 100644 --- a/src/wp-content/themes/twentyfourteen/readme.txt +++ b/src/wp-content/themes/twentyfourteen/readme.txt @@ -15,7 +15,7 @@ For more information about Twenty Fourteen please go to https://codex.wordpress. == Installation == -1. In your admin panel, go to Appearance -> Themes and click the 'Add New' button. +1. In your admin panel, go to Appearance -> Themes and click the 'Add' button. 2. Type in Twenty Fourteen in the search form and press the 'Enter' key in your keyboard. 3. Click on the 'Activate' button to use your new theme right away. 4. Go to https://codex.wordpress.org/Twenty_Fourteen for a guide to customize this theme. diff --git a/src/wp-content/themes/twentynineteen/readme.txt b/src/wp-content/themes/twentynineteen/readme.txt index e30e9291c221d..5ad9f2eecad3d 100644 --- a/src/wp-content/themes/twentynineteen/readme.txt +++ b/src/wp-content/themes/twentynineteen/readme.txt @@ -17,7 +17,7 @@ For more information about Twenty Nineteen please go to https://wordpress.org/do == Installation == -1. In your admin panel, go to Appearance -> Themes and click the 'Add New' button. +1. In your admin panel, go to Appearance -> Themes and click the 'Add' button. 2. Type in Twenty Nineteen in the search form and press the 'Enter' key on your keyboard. 3. Click on the 'Activate' button to use your new theme right away. 4. Go to https://wordpress.org/documentation/article/twenty-nineteen/ for a guide on how to customize this theme. diff --git a/src/wp-content/themes/twentyseventeen/readme.txt b/src/wp-content/themes/twentyseventeen/readme.txt index cc3246ea4d8e3..ce34921203d07 100644 --- a/src/wp-content/themes/twentyseventeen/readme.txt +++ b/src/wp-content/themes/twentyseventeen/readme.txt @@ -16,7 +16,7 @@ For more information about Twenty Seventeen please go to https://wordpress.org/d == Installation == -1. In your admin panel, go to Appearance -> Themes and click the 'Add New' button. +1. In your admin panel, go to Appearance -> Themes and click the 'Add' button. 2. Type in Twenty Seventeen in the search form and press the 'Enter' key on your keyboard. 3. Click on the 'Activate' button to use your new theme right away. 4. Go to https://wordpress.org/documentation/article/twenty-seventeen/ for a guide on how to customize this theme. diff --git a/src/wp-content/themes/twentysixteen/readme.txt b/src/wp-content/themes/twentysixteen/readme.txt index e5a5a2776773d..39cd82277f87f 100644 --- a/src/wp-content/themes/twentysixteen/readme.txt +++ b/src/wp-content/themes/twentysixteen/readme.txt @@ -22,7 +22,7 @@ For more information about Twenty Sixteen please go to https://wordpress.org/doc == Installation == -1. In your admin panel, go to Appearance -> Themes and click the 'Add New' button. +1. In your admin panel, go to Appearance -> Themes and click the 'Add' button. 2. Type in Twenty Sixteen in the search form and press the 'Enter' key on your keyboard. 3. Click on the 'Activate' button to use your new theme right away. 4. Go to https://wordpress.org/documentation/article/twenty-sixteen/ for a guide on how to customize this theme. diff --git a/src/wp-content/themes/twentyten/readme.txt b/src/wp-content/themes/twentyten/readme.txt index f0e8c057cfb64..67145e2d29180 100644 --- a/src/wp-content/themes/twentyten/readme.txt +++ b/src/wp-content/themes/twentyten/readme.txt @@ -15,7 +15,7 @@ For more information about Twenty Ten theme please go to https://codex.wordpress == Installation == -1. In your admin panel, go to Appearance -> Themes and click the 'Add New' button. +1. In your admin panel, go to Appearance -> Themes and click the 'Add' button. 2. Type in Twenty Ten in the search form and press the 'Enter' key in your keyboard. 3. Click on the 'Activate' button to use your new theme right away. 4. Go to https://codex.wordpress.org/Twenty_Ten for a guide to customize this theme. diff --git a/src/wp-content/themes/twentythirteen/readme.txt b/src/wp-content/themes/twentythirteen/readme.txt index 94261e7c4c002..138498e1a3917 100644 --- a/src/wp-content/themes/twentythirteen/readme.txt +++ b/src/wp-content/themes/twentythirteen/readme.txt @@ -15,7 +15,7 @@ For more information about Twenty Thirteen please go to https://codex.wordpress. == Installation == -1. In your admin panel, go to Appearance -> Themes and click the 'Add New' button. +1. In your admin panel, go to Appearance -> Themes and click the 'Add' button. 2. Type in Twenty Thirteen in the search form and press the 'Enter' key in your keyboard. 3. Click on the 'Activate' button to use your new theme right away. 4. Go to https://codex.wordpress.org/Twenty_Thirteen for a guide to customize this theme. diff --git a/src/wp-content/themes/twentytwelve/readme.txt b/src/wp-content/themes/twentytwelve/readme.txt index f746e9add5048..af7129746e777 100644 --- a/src/wp-content/themes/twentytwelve/readme.txt +++ b/src/wp-content/themes/twentytwelve/readme.txt @@ -15,7 +15,7 @@ For more information about Twenty Twelve please go to https://codex.wordpress.or == Installation == -1. In your admin panel, go to Appearance -> Themes and click the 'Add New' button. +1. In your admin panel, go to Appearance -> Themes and click the 'Add' button. 2. Type in Twenty Twelve in the search form and press the 'Enter' key in your keyboard. 3. Click on the 'Activate' button to use your new theme right away. 4. Go to https://codex.wordpress.org/Twenty_Twelve for a guide to customize this theme. diff --git a/src/wp-content/themes/twentytwentyone/readme.txt b/src/wp-content/themes/twentytwentyone/readme.txt index b955225ca6a83..5ff4c1df34619 100644 --- a/src/wp-content/themes/twentytwentyone/readme.txt +++ b/src/wp-content/themes/twentytwentyone/readme.txt @@ -17,7 +17,7 @@ Take it for a spin! See how Twenty Twenty-One elevates your portfolio, business == Installation == -1. In your admin panel, go to Appearance -> Themes and click the 'Add New' button. +1. In your admin panel, go to Appearance -> Themes and click the 'Add' button. 2. Type in Twenty Twenty-One in the search form and press the 'Enter' key on your keyboard. 3. Click on the 'Activate' button to use your new theme right away. 4. Go to INSERT ABOUT PAGE for a guide on how to customize this theme. From e9b075e543a603b799a3af8d344330246372374e Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Sat, 8 Feb 2025 15:09:41 +0000 Subject: [PATCH 301/323] Docs: Fix Docblock parameters indentation for `wp_determine_option_autoload_value()`, as per WP Docs standards. See #62281. git-svn-id: https://develop.svn.wordpress.org/trunk@59787 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/option.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/wp-includes/option.php b/src/wp-includes/option.php index 8114b51bc7499..cff8e352de809 100644 --- a/src/wp-includes/option.php +++ b/src/wp-includes/option.php @@ -1292,15 +1292,15 @@ function delete_option( $option ) { * @since 6.6.0 * @access private * - * @param string $option The name of the option. - * @param mixed $value The value of the option to check its autoload value. - * @param mixed $serialized_value The serialized value of the option to check its autoload value. - * @param bool|null $autoload The autoload value to check. - * Accepts 'on'|true to enable or 'off'|false to disable, or - * 'auto-on', 'auto-off', or 'auto' for internal purposes. - * Any other autoload value will be forced to either 'auto-on', - * 'auto-off', or 'auto'. - * 'yes' and 'no' are supported for backward compatibility. + * @param string $option The name of the option. + * @param mixed $value The value of the option to check its autoload value. + * @param mixed $serialized_value The serialized value of the option to check its autoload value. + * @param bool|null $autoload The autoload value to check. + * Accepts 'on'|true to enable or 'off'|false to disable, or + * 'auto-on', 'auto-off', or 'auto' for internal purposes. + * Any other autoload value will be forced to either 'auto-on', + * 'auto-off', or 'auto'. + * 'yes' and 'no' are supported for backward compatibility. * @return string Returns the original $autoload value if explicit, or 'auto-on', 'auto-off', * or 'auto' depending on default heuristics. */ From fc8fa6a615083419689d36b785908b79ad153c73 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sat, 8 Feb 2025 15:30:08 +0000 Subject: [PATCH 302/323] Coding Standards: Use strict comparison in `WP_Query::is_page()` and `::is_single()`. Follow-up to [29039]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59788 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-query.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/class-wp-query.php b/src/wp-includes/class-wp-query.php index 51cd8b1084e2e..06b1e582a7b2c 100644 --- a/src/wp-includes/class-wp-query.php +++ b/src/wp-includes/class-wp-query.php @@ -4533,9 +4533,10 @@ public function is_page( $page = '' ) { if ( ! strpos( $pagepath, '/' ) ) { continue; } + $pagepath_obj = get_page_by_path( $pagepath ); - if ( $pagepath_obj && ( $pagepath_obj->ID == $page_obj->ID ) ) { + if ( $pagepath_obj && ( $pagepath_obj->ID === $page_obj->ID ) ) { return true; } } @@ -4643,9 +4644,10 @@ public function is_single( $post = '' ) { if ( ! strpos( $postpath, '/' ) ) { continue; } + $postpath_obj = get_page_by_path( $postpath, OBJECT, $post_obj->post_type ); - if ( $postpath_obj && ( $postpath_obj->ID == $post_obj->ID ) ) { + if ( $postpath_obj && ( $postpath_obj->ID === $post_obj->ID ) ) { return true; } } From 3428f3a0f972e6f46f48827edb61e13a7b953583 Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Sat, 8 Feb 2025 15:51:03 +0000 Subject: [PATCH 303/323] Administration: Error messages improvements in WP Admin. This changeset improves a bunch of WP-Admin error messages, notably replacing the good old cryptic "Something went wrong" message with more helpful information. Props peterwilsoncc, netweb, karmatosed, JoshuaWold, mrtortai, audrasjb, sukhendu2002, joedolson. See #43622. git-svn-id: https://develop.svn.wordpress.org/trunk@59789 602fd350-edb4-49c9-b593-d223f7449a82 --- src/js/_enqueues/admin/tags.js | 2 +- src/js/_enqueues/lib/ajax-response.js | 2 +- src/js/_enqueues/wp/theme-plugin-editor.js | 2 +- src/js/_enqueues/wp/updates.js | 2 +- src/wp-admin/customize.php | 4 ++-- src/wp-admin/includes/class-custom-image-header.php | 10 +++++----- src/wp-admin/includes/file.php | 2 +- src/wp-admin/includes/revision.php | 2 +- src/wp-admin/media-upload.php | 4 ++-- src/wp-admin/network/site-users.php | 2 +- src/wp-admin/themes.php | 4 ++-- src/wp-admin/users.php | 2 +- 12 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/js/_enqueues/admin/tags.js b/src/js/_enqueues/admin/tags.js index 2e55e2ed20d93..edc61c80c987f 100644 --- a/src/js/_enqueues/admin/tags.js +++ b/src/js/_enqueues/admin/tags.js @@ -59,7 +59,7 @@ jQuery( function($) { tr.children().css('backgroundColor', ''); } else { - $('#ajax-response').empty().append('<div class="error"><p>' + wp.i18n.__( 'Something went wrong.' ) + '</p></div>'); + $('#ajax-response').empty().append('<div class="error"><p>' + wp.i18n.__( 'An error occurred while processing your request. Please try again later.' ) + '</p></div>'); tr.children().css('backgroundColor', ''); } }); diff --git a/src/js/_enqueues/lib/ajax-response.js b/src/js/_enqueues/lib/ajax-response.js index af59d8183ad61..d1a05ca52c8b8 100644 --- a/src/js/_enqueues/lib/ajax-response.js +++ b/src/js/_enqueues/lib/ajax-response.js @@ -83,7 +83,7 @@ window.wpAjax = jQuery.extend( { selector = jQuery( selector ); return !wpAjax.invalidateForm( selector.find('.form-required').filter( function() { return jQuery('input:visible', this).val() === ''; } ) ).length; } -}, wpAjax || { noPerm: 'Sorry, you are not allowed to do that.', broken: 'Something went wrong.' } ); +}, wpAjax || { noPerm: 'Sorry, you are not allowed to do that.', broken: 'An error occurred while processing your request. Please refresh the page and try again.' } ); // Basic form validation. jQuery( function($){ diff --git a/src/js/_enqueues/wp/theme-plugin-editor.js b/src/js/_enqueues/wp/theme-plugin-editor.js index 2fd866531f362..1e3ac0d904c77 100644 --- a/src/js/_enqueues/wp/theme-plugin-editor.js +++ b/src/js/_enqueues/wp/theme-plugin-editor.js @@ -226,7 +226,7 @@ wp.themePluginEditor = (function( $ ) { var notice = $.extend( { code: 'save_error', - message: __( 'Something went wrong. Your change may not have been saved. Please try again. There is also a chance that you may need to manually fix and upload the file over FTP.' ) + message: __( 'An error occurred while saving your changes. Please try again. If the problem persists, you may need to manually update the file via FTP.' ) }, response, { diff --git a/src/js/_enqueues/wp/updates.js b/src/js/_enqueues/wp/updates.js index 396fcbb6ffe06..aca73fdd4f748 100644 --- a/src/js/_enqueues/wp/updates.js +++ b/src/js/_enqueues/wp/updates.js @@ -2333,7 +2333,7 @@ * 'update' or 'install'. */ wp.updates.isValidResponse = function( response, action ) { - var error = __( 'Something went wrong.' ), + var error = __( 'An error occurred during the update process. Please try again.' ), errorMessage; // Make sure the response is a valid data object and not a Promise object. diff --git a/src/wp-admin/customize.php b/src/wp-admin/customize.php index b27292d9eb949..9fe0b3f6d3912 100644 --- a/src/wp-admin/customize.php +++ b/src/wp-admin/customize.php @@ -76,8 +76,8 @@ if ( in_array( get_post_status( $changeset_post->ID ), array( 'publish', 'trash' ), true ) ) { wp_die( - '<h1>' . __( 'Something went wrong.' ) . '</h1>' . - '<p>' . __( 'This changeset cannot be further modified.' ) . '</p>' . + '<h1>' . __( 'An error occurred while saving your changeset.' ) . '</h1>' . + '<p>' . __( 'Please try again or start a new changeset. This changeset cannot be further modified.' ) . '</p>' . '<p><a href="' . esc_url( remove_query_arg( 'changeset_uuid' ) ) . '">' . __( 'Customize New Changes' ) . '</a></p>', 403 ); diff --git a/src/wp-admin/includes/class-custom-image-header.php b/src/wp-admin/includes/class-custom-image-header.php index 2e1bf47fdaf5e..54be1d90e4228 100644 --- a/src/wp-admin/includes/class-custom-image-header.php +++ b/src/wp-admin/includes/class-custom-image-header.php @@ -830,8 +830,8 @@ public function step_2() { if ( ! current_theme_supports( 'custom-header', 'uploads' ) ) { wp_die( - '<h1>' . __( 'Something went wrong.' ) . '</h1>' . - '<p>' . __( 'The active theme does not support uploading a custom header image.' ) . '</p>', + '<h1>' . __( 'An error occurred while processing your header image.' ) . '</h1>' . + '<p>' . __( 'The active theme does not support uploading a custom header image. Please ensure your theme supports custom headers and try again.' ) . '</p>', 403 ); } @@ -1018,8 +1018,8 @@ public function step_3() { if ( ! current_theme_supports( 'custom-header', 'uploads' ) ) { wp_die( - '<h1>' . __( 'Something went wrong.' ) . '</h1>' . - '<p>' . __( 'The active theme does not support uploading a custom header image.' ) . '</p>', + '<h1>' . __( 'An error occurred while processing your header image.' ) . '</h1>' . + '<p>' . __( 'The active theme does not support uploading a custom header image. Please ensure your theme supports custom headers and try again.' ) . '</p>', 403 ); } @@ -1029,7 +1029,7 @@ public function step_3() { && ! current_theme_supports( 'custom-header', 'flex-width' ) ) { wp_die( - '<h1>' . __( 'Something went wrong.' ) . '</h1>' . + '<h1>' . __( 'An error occurred while processing your header image.' ) . '</h1>' . '<p>' . __( 'The active theme does not support a flexible sized header image.' ) . '</p>', 403 ); diff --git a/src/wp-admin/includes/file.php b/src/wp-admin/includes/file.php index b1ea3fba1bda2..152a1e2f21395 100644 --- a/src/wp-admin/includes/file.php +++ b/src/wp-admin/includes/file.php @@ -635,7 +635,7 @@ function wp_edit_theme_plugin_file( $args ) { wp_opcache_invalidate( $real_file, true ); if ( ! isset( $result['message'] ) ) { - $message = __( 'Something went wrong.' ); + $message = __( 'An error occurred. Please try again later.' ); } else { $message = $result['message']; unset( $result['message'] ); diff --git a/src/wp-admin/includes/revision.php b/src/wp-admin/includes/revision.php index ab3842fc552bc..df7201e958098 100644 --- a/src/wp-admin/includes/revision.php +++ b/src/wp-admin/includes/revision.php @@ -466,7 +466,7 @@ function wp_print_revision_templates() { <script id="tmpl-revisions-diff" type="text/html"> <div class="loading-indicator"><span class="spinner"></span></div> - <div class="diff-error"><?php _e( 'Sorry, something went wrong. The requested comparison could not be loaded.' ); ?></div> + <div class="diff-error"><?php _e( 'An error occurred while loading the comparison. Please refresh the page and try again.' ); ?></div> <div class="diff"> <# _.each( data.fields, function( field ) { #> <h2>{{ field.name }}</h2> diff --git a/src/wp-admin/media-upload.php b/src/wp-admin/media-upload.php index 015bc9d63de69..2755cb32147bf 100644 --- a/src/wp-admin/media-upload.php +++ b/src/wp-admin/media-upload.php @@ -35,8 +35,8 @@ // Require an ID for the edit screen. if ( isset( $action ) && 'edit' === $action && ! $ID ) { // phpcs:ignore WordPress.NamingConventions.ValidVariableName wp_die( - '<h1>' . __( 'Something went wrong.' ) . '</h1>' . - '<p>' . __( 'Invalid item ID.' ) . '</p>', + '<h1>' . __( 'An error occurred during the upload process.' ) . '</h1>' . + '<p>' . __( 'Invalid item ID. You can view all media items in the <a href="upload.php">Media Library</a>.' ) . '</p>', 403 ); } diff --git a/src/wp-admin/network/site-users.php b/src/wp-admin/network/site-users.php index 3b970c5e53d35..b3041176d3376 100644 --- a/src/wp-admin/network/site-users.php +++ b/src/wp-admin/network/site-users.php @@ -155,7 +155,7 @@ // If the user doesn't already belong to the blog, bail. if ( ! is_user_member_of_blog( $user_id ) ) { wp_die( - '<h1>' . __( 'Something went wrong.' ) . '</h1>' . + '<h1>' . __( 'An error occurred.' ) . '</h1>' . '<p>' . __( 'One of the selected users is not a member of this site.' ) . '</p>', 403 ); diff --git a/src/wp-admin/themes.php b/src/wp-admin/themes.php index a7ebd42c6018c..24b93d44260fd 100644 --- a/src/wp-admin/themes.php +++ b/src/wp-admin/themes.php @@ -24,7 +24,7 @@ if ( ! $theme->exists() || ! $theme->is_allowed() ) { wp_die( - '<h1>' . __( 'Something went wrong.' ) . '</h1>' . + '<h1>' . __( 'An error occurred.' ) . '</h1>' . '<p>' . __( 'The requested theme does not exist.' ) . '</p>', 403 ); @@ -67,7 +67,7 @@ if ( ! $theme->exists() ) { wp_die( - '<h1>' . __( 'Something went wrong.' ) . '</h1>' . + '<h1>' . __( 'An error occurred while deleting the theme.' ) . '</h1>' . '<p>' . __( 'The requested theme does not exist.' ) . '</p>', 403 ); diff --git a/src/wp-admin/users.php b/src/wp-admin/users.php index c6f0efe9d4b06..6e10c2b8311f7 100644 --- a/src/wp-admin/users.php +++ b/src/wp-admin/users.php @@ -155,7 +155,7 @@ // If the user doesn't already belong to the blog, bail. if ( is_multisite() && ! is_user_member_of_blog( $id ) ) { wp_die( - '<h1>' . __( 'Something went wrong.' ) . '</h1>' . + '<h1>' . __( 'An error occurred.' ) . '</h1>' . '<p>' . __( 'One of the selected users is not a member of this site.' ) . '</p>', 403 ); From bd3fdcce0768e53a52c1331eb25c21a7926fbe82 Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Sat, 8 Feb 2025 15:58:11 +0000 Subject: [PATCH 304/323] General: Error messages improvements in `/wp-includes` files. This changeset improves a bunch of error messages, notably replacing the good old cryptic "Something went wrong" message with more helpful information. Props peterwilsoncc, netweb, karmatosed, JoshuaWold, mrtortai, audrasjb, sukhendu2002, joedolson. Fixes #43622. git-svn-id: https://develop.svn.wordpress.org/trunk@59790 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-customize-manager.php | 2 +- src/wp-includes/class-wp-xmlrpc-server.php | 6 +++--- src/wp-includes/functions.php | 2 +- src/wp-includes/script-loader.php | 4 ++-- src/wp-mail.php | 10 +++++++++- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/wp-includes/class-wp-customize-manager.php b/src/wp-includes/class-wp-customize-manager.php index 8d5e94af94b8d..51c88ef5fcf81 100644 --- a/src/wp-includes/class-wp-customize-manager.php +++ b/src/wp-includes/class-wp-customize-manager.php @@ -454,7 +454,7 @@ protected function wp_die( $ajax_message, $message = null ) { } if ( ! $message ) { - $message = __( 'Something went wrong.' ); + $message = __( 'An error occurred while customizing. Please refresh the page and try again.' ); } if ( $this->messenger_channel ) { diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index e69d0eb395acf..c5a4eba66e858 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -4031,7 +4031,7 @@ public function wp_newComment( $args ) { } if ( ! $comment_id ) { - return new IXR_Error( 403, __( 'Something went wrong.' ) ); + return new IXR_Error( 403, __( 'An error occurred while processing your comment. Please ensure all fields are filled correctly and try again.' ) ); } /** @@ -5051,7 +5051,7 @@ public function blogger_getRecentPosts( $args ) { $posts_list = wp_get_recent_posts( $query ); if ( ! $posts_list ) { - $this->error = new IXR_Error( 500, __( 'Either there are no posts, or something went wrong.' ) ); + $this->error = new IXR_Error( 500, __( 'No posts found or an error occurred while retrieving posts.' ) ); return $this->error; } @@ -6584,7 +6584,7 @@ public function mt_getRecentPostTitles( $args ) { $posts_list = wp_get_recent_posts( $query ); if ( ! $posts_list ) { - $this->error = new IXR_Error( 500, __( 'Either there are no posts, or something went wrong.' ) ); + $this->error = new IXR_Error( 500, __( 'No posts found or an error occurred while retrieving posts.' ) ); return $this->error; } diff --git a/src/wp-includes/functions.php b/src/wp-includes/functions.php index fd772424abce4..fbad1f721a94a 100644 --- a/src/wp-includes/functions.php +++ b/src/wp-includes/functions.php @@ -3672,7 +3672,7 @@ function get_allowed_mime_types( $user = null ) { */ function wp_nonce_ays( $action ) { // Default title and response code. - $title = __( 'Something went wrong.' ); + $title = __( 'An error occurred.' ); $response_code = 403; if ( 'log-out' === $action ) { diff --git a/src/wp-includes/script-loader.php b/src/wp-includes/script-loader.php index 15ee7c6d2501c..aceeffcdc99af 100644 --- a/src/wp-includes/script-loader.php +++ b/src/wp-includes/script-loader.php @@ -810,7 +810,7 @@ function wp_default_scripts( $scripts ) { 'wpAjax', array( 'noPerm' => __( 'Sorry, you are not allowed to do that.' ), - 'broken' => __( 'Something went wrong.' ), + 'broken' => __( 'An error occurred while processing your request. Please try again later.' ), ) ); @@ -1292,7 +1292,7 @@ function wp_default_scripts( $scripts ) { 'close' => __( 'Close' ), 'action' => __( 'Action' ), 'discardChanges' => __( 'Discard changes' ), - 'cheatin' => __( 'Something went wrong.' ), + 'cheatin' => __( 'An error occurred. Please try again later.' ), 'notAllowedHeading' => __( 'You need a higher level of permission.' ), 'notAllowed' => __( 'Sorry, you are not allowed to customize this site.' ), 'previewIframeTitle' => __( 'Site Preview' ), diff --git a/src/wp-mail.php b/src/wp-mail.php index 7b18dd4ad1494..19c449b64506d 100644 --- a/src/wp-mail.php +++ b/src/wp-mail.php @@ -39,7 +39,15 @@ $last_checked = get_transient( 'mailserver_last_checked' ); if ( $last_checked ) { - wp_die( __( 'Slow down cowboy, no need to check for new mails so often!' ) ); + wp_die( + sprintf( + // translators: %s human readable rate limit. + __( 'Email checks are rate limited to once every %s.' ), + human_time_diff( time() - WP_MAIL_INTERVAL, time() ) + ), + __( 'Slow down, no need to check for new mails so often!' ), + 429 + ); } set_transient( 'mailserver_last_checked', true, WP_MAIL_INTERVAL ); From 07034aa7b718969f0e581904177e1ac8828e1d1f Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Sun, 9 Feb 2025 11:07:41 +0000 Subject: [PATCH 305/323] Administration: Replace missed references of "Add New" in `WP_Post_Type` class. Follow-up to [59784], [59786]. Fixes #61219. git-svn-id: https://develop.svn.wordpress.org/trunk@59791 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-post-type.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/class-wp-post-type.php b/src/wp-includes/class-wp-post-type.php index 049d7ac97676d..8812c21f1b415 100644 --- a/src/wp-includes/class-wp-post-type.php +++ b/src/wp-includes/class-wp-post-type.php @@ -989,8 +989,8 @@ public static function get_default_labels() { self::$default_labels = array( 'name' => array( _x( 'Posts', 'post type general name' ), _x( 'Pages', 'post type general name' ) ), 'singular_name' => array( _x( 'Post', 'post type singular name' ), _x( 'Page', 'post type singular name' ) ), - 'add_new' => array( __( 'Add' ), __( 'Add New' ) ), - 'add_new_item' => array( __( 'Add Post' ), __( 'Add New Page' ) ), + 'add_new' => array( __( 'Add' ), __( 'Add' ) ), + 'add_new_item' => array( __( 'Add Post' ), __( 'Add Page' ) ), 'edit_item' => array( __( 'Edit Post' ), __( 'Edit Page' ) ), 'new_item' => array( __( 'New Post' ), __( 'New Page' ) ), 'view_item' => array( __( 'View Post' ), __( 'View Page' ) ), From 32059347a34aa1ac2e883202dcfbabec2d1f37ed Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Sun, 9 Feb 2025 18:49:51 +0000 Subject: [PATCH 306/323] Coding Standards: Use strict comparison in `WP_Query::the_post()` and `::have_posts()`. Follow-up to [2716], [2741], [11464]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59792 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-query.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/class-wp-query.php b/src/wp-includes/class-wp-query.php index 06b1e582a7b2c..f8d3d67d3fbd5 100644 --- a/src/wp-includes/class-wp-query.php +++ b/src/wp-includes/class-wp-query.php @@ -3752,7 +3752,7 @@ public function the_post() { $this->in_the_loop = true; $this->before_loop = false; - if ( -1 == $this->current_post ) { // Loop has just started. + if ( -1 === $this->current_post ) { // Loop has just started. /** * Fires once the loop is started. * @@ -3779,7 +3779,7 @@ public function the_post() { public function have_posts() { if ( $this->current_post + 1 < $this->post_count ) { return true; - } elseif ( $this->current_post + 1 == $this->post_count && $this->post_count > 0 ) { + } elseif ( $this->current_post + 1 === $this->post_count && $this->post_count > 0 ) { /** * Fires once the loop has ended. * @@ -3788,6 +3788,7 @@ public function have_posts() { * @param WP_Query $query The WP_Query instance (passed by reference). */ do_action_ref_array( 'loop_end', array( &$this ) ); + // Do some cleaning up after the loop. $this->rewind_posts(); } elseif ( 0 === $this->post_count ) { From 67bc44b3118bbb7cd06273233bbbe18a74383a06 Mon Sep 17 00:00:00 2001 From: Peter Wilson <peterwilsoncc@git.wordpress.org> Date: Sun, 9 Feb 2025 22:32:50 +0000 Subject: [PATCH 307/323] Editor: Update enqueued styles in the editor. Updates the enqueued styles in various editors to remove target styles more precisely to where they are needed. Removes the following stylesheets as dependencies of `wp-edit-blocks`: * `wp-editor` * `wp-reusable-blocks` * `wp-patterns` The `wp-editor` stylesheet is targeted to the items requiring the CSS: * `edit-widgets` * `customize-widgets` * `edit-site` Props ellatrix, youknowriad. Fixes #62266, #62274. git-svn-id: https://develop.svn.wordpress.org/trunk@59793 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/script-loader.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/wp-includes/script-loader.php b/src/wp-includes/script-loader.php index aceeffcdc99af..5aa991972477c 100644 --- a/src/wp-includes/script-loader.php +++ b/src/wp-includes/script-loader.php @@ -1680,18 +1680,16 @@ function wp_default_styles( $styles ) { array( 'wp-components' ) ); + // Only add CONTENT styles here that should be enqueued in the iframe! $wp_edit_blocks_dependencies = array( 'wp-components', - 'wp-editor', /* * This needs to be added before the block library styles, * The block library styles override the "reset" styles. */ 'wp-reset-editor-styles', 'wp-block-library', - 'wp-reusable-blocks', 'wp-block-editor-content', - 'wp-patterns', ); // Only load the default layout and margin styles for themes without theme.json file. @@ -1750,24 +1748,25 @@ function wp_default_styles( $styles ) { 'edit-widgets' => array( 'wp-widgets', 'wp-block-editor', + 'wp-editor', 'wp-edit-blocks', 'wp-block-library', - 'wp-reusable-blocks', 'wp-patterns', 'wp-preferences', ), 'customize-widgets' => array( 'wp-widgets', 'wp-block-editor', + 'wp-editor', 'wp-edit-blocks', 'wp-block-library', - 'wp-reusable-blocks', 'wp-patterns', 'wp-preferences', ), 'edit-site' => array( 'wp-components', 'wp-block-editor', + 'wp-editor', 'wp-edit-blocks', 'wp-commands', 'wp-preferences', From 551e474bb3c727b27186d990098785b4cc99a95a Mon Sep 17 00:00:00 2001 From: Peter Wilson <peterwilsoncc@git.wordpress.org> Date: Mon, 10 Feb 2025 02:38:35 +0000 Subject: [PATCH 308/323] Site Editor: Redirect deprecated URLs to path based routing. The site editor now uses path based routing rather than query string arguments. This redirects the legacy query string URLs to the new routing. Props youknowriad, peterwilsoncc, joemcgill, mukesh27, poena. Fixes #62585. git-svn-id: https://develop.svn.wordpress.org/trunk@59794 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/site-editor.php | 107 +++++++++++++++++++++++++++++++---- 1 file changed, 95 insertions(+), 12 deletions(-) diff --git a/src/wp-admin/site-editor.php b/src/wp-admin/site-editor.php index 3207bccdf2632..a4a3cca276e2e 100644 --- a/src/wp-admin/site-editor.php +++ b/src/wp-admin/site-editor.php @@ -19,19 +19,102 @@ ); } -$is_template_part = isset( $_GET['postType'] ) && 'wp_template_part' === sanitize_key( $_GET['postType'] ); -$is_template_part_path = isset( $_GET['path'] ) && 'wp_template_partall' === sanitize_key( $_GET['path'] ); -$is_template_part_editor = $is_template_part || $is_template_part_path; -$is_patterns = isset( $_GET['postType'] ) && 'wp_block' === sanitize_key( $_GET['postType'] ); -$is_patterns_path = isset( $_GET['path'] ) && 'patterns' === sanitize_key( $_GET['path'] ); -$is_patterns_editor = $is_patterns || $is_patterns_path; - -if ( ! wp_is_block_theme() ) { - if ( ! current_theme_supports( 'block-template-parts' ) && $is_template_part_editor ) { - wp_die( __( 'The theme you are currently using is not compatible with the Site Editor.' ) ); - } elseif ( ! $is_patterns_editor && ! $is_template_part_editor ) { - wp_die( __( 'The theme you are currently using is not compatible with the Site Editor.' ) ); +/** + * Maps old site editor urls to the new updated ones. + * + * @since 6.8.0 + * @access private + * + * @global string $pagenow The filename of the current screen. + * + * @return string|false The new URL to redirect to, or false if no redirection is needed. + */ +function _wp_get_site_editor_redirection_url() { + global $pagenow; + if ( 'site-editor.php' !== $pagenow || isset( $_REQUEST['p'] ) || ! $_SERVER['QUERY_STRING'] ) { + return false; + } + + // The following redirects are for the new permalinks in the site editor. + if ( isset( $_REQUEST['postType'] ) && 'wp_navigation' === $_REQUEST['postType'] && ! empty( $_REQUEST['postId'] ) ) { + return add_query_arg( array( 'p' => '/wp_navigation/' . $_REQUEST['postId'] ), remove_query_arg( array( 'postType', 'postId' ) ) ); + } + + if ( isset( $_REQUEST['postType'] ) && 'wp_navigation' === $_REQUEST['postType'] && empty( $_REQUEST['postId'] ) ) { + return add_query_arg( array( 'p' => '/navigation' ), remove_query_arg( 'postType' ) ); + } + + if ( isset( $_REQUEST['path'] ) && '/wp_global_styles' === $_REQUEST['path'] ) { + return add_query_arg( array( 'p' => '/styles' ), remove_query_arg( 'path' ) ); } + + if ( isset( $_REQUEST['postType'] ) && 'page' === $_REQUEST['postType'] && ( empty( $_REQUEST['canvas'] ) || empty( $_REQUEST['postId'] ) ) ) { + return add_query_arg( array( 'p' => '/page' ), remove_query_arg( 'postType' ) ); + } + + if ( isset( $_REQUEST['postType'] ) && 'page' === $_REQUEST['postType'] && ! empty( $_REQUEST['postId'] ) ) { + return add_query_arg( array( 'p' => '/page/' . $_REQUEST['postId'] ), remove_query_arg( array( 'postType', 'postId' ) ) ); + } + + if ( isset( $_REQUEST['postType'] ) && 'wp_template' === $_REQUEST['postType'] && ( empty( $_REQUEST['canvas'] ) || empty( $_REQUEST['postId'] ) ) ) { + return add_query_arg( array( 'p' => '/template' ), remove_query_arg( 'postType' ) ); + } + + if ( isset( $_REQUEST['postType'] ) && 'wp_template' === $_REQUEST['postType'] && ! empty( $_REQUEST['postId'] ) ) { + return add_query_arg( array( 'p' => '/wp_template/' . $_REQUEST['postId'] ), remove_query_arg( array( 'postType', 'postId' ) ) ); + } + + if ( isset( $_REQUEST['postType'] ) && 'wp_block' === $_REQUEST['postType'] && ( empty( $_REQUEST['canvas'] ) || empty( $_REQUEST['postId'] ) ) ) { + return add_query_arg( array( 'p' => '/pattern' ), remove_query_arg( 'postType' ) ); + } + + if ( isset( $_REQUEST['postType'] ) && 'wp_block' === $_REQUEST['postType'] && ! empty( $_REQUEST['postId'] ) ) { + return add_query_arg( array( 'p' => '/wp_block/' . $_REQUEST['postId'] ), remove_query_arg( array( 'postType', 'postId' ) ) ); + } + + if ( isset( $_REQUEST['postType'] ) && 'wp_template_part' === $_REQUEST['postType'] && ( empty( $_REQUEST['canvas'] ) || empty( $_REQUEST['postId'] ) ) ) { + return add_query_arg( array( 'p' => '/pattern' ) ); + } + + if ( isset( $_REQUEST['postType'] ) && 'wp_template_part' === $_REQUEST['postType'] && ! empty( $_REQUEST['postId'] ) ) { + return add_query_arg( array( 'p' => '/wp_template_part/' . $_REQUEST['postId'] ), remove_query_arg( array( 'postType', 'postId' ) ) ); + } + + // The following redirects are for backward compatibility with the old site editor URLs. + if ( isset( $_REQUEST['path'] ) && '/wp_template_part/all' === $_REQUEST['path'] ) { + return add_query_arg( + array( + 'p' => '/pattern', + 'postType' => 'wp_template_part', + ), + remove_query_arg( 'path' ) + ); + } + + if ( isset( $_REQUEST['path'] ) && '/page' === $_REQUEST['path'] ) { + return add_query_arg( array( 'p' => '/page' ), remove_query_arg( 'path' ) ); + } + + if ( isset( $_REQUEST['path'] ) && '/wp_template' === $_REQUEST['path'] ) { + return add_query_arg( array( 'p' => '/template' ), remove_query_arg( 'path' ) ); + } + + if ( isset( $_REQUEST['path'] ) && '/patterns' === $_REQUEST['path'] ) { + return add_query_arg( array( 'p' => '/pattern' ), remove_query_arg( 'path' ) ); + } + + if ( isset( $_REQUEST['path'] ) && '/navigation' === $_REQUEST['path'] ) { + return add_query_arg( array( 'p' => '/navigation' ), remove_query_arg( 'path' ) ); + } + + return add_query_arg( array( 'p' => '/' ) ); +} + +// Redirect to the site editor to the new URLs if needed. +$redirection = _wp_get_site_editor_redirection_url(); +if ( false !== $redirection ) { + wp_safe_redirect( $redirection ); + exit; } // Used in the HTML title tag. From c27831121ac4bce4e3af40c27a793d3697b9b884 Mon Sep 17 00:00:00 2001 From: Peter Wilson <peterwilsoncc@git.wordpress.org> Date: Mon, 10 Feb 2025 03:54:35 +0000 Subject: [PATCH 309/323] Editor: Preload Global Styles REST requests based on user permissions. For the Post Editor, preload '/wp/v2/global-styles/' . $global_styles_id with a context corresponding to user caps, that is, 'edit' for users that can edit global styles, and 'view' for everyone else. Preloading the global styles endpoint according to role context means that admins and non admins, e.g., editors, avoid unnecessary client side requests. Props ramonopoly. Fixes #62322. git-svn-id: https://develop.svn.wordpress.org/trunk@59795 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/edit-form-blocks.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/wp-admin/edit-form-blocks.php b/src/wp-admin/edit-form-blocks.php index 5dbb9f33e4970..bd66ac60ba60b 100644 --- a/src/wp-admin/edit-form-blocks.php +++ b/src/wp-admin/edit-form-blocks.php @@ -51,8 +51,8 @@ static function ( $classes ) { $rest_path = rest_get_route_for_post( $post ); -$active_theme = get_stylesheet(); - +$active_theme = get_stylesheet(); +$global_styles_endpoint_context = current_user_can( 'edit_theme_options' ) ? 'edit' : 'view'; // Preload common data. $preload_paths = array( '/wp/v2/types?context=view', @@ -71,7 +71,14 @@ static function ( $classes ) { '/wp/v2/global-styles/themes/' . $active_theme . '/variations?context=view', '/wp/v2/themes?context=edit&status=active', array( '/wp/v2/global-styles/' . WP_Theme_JSON_Resolver::get_user_global_styles_post_id(), 'OPTIONS' ), - '/wp/v2/global-styles/' . WP_Theme_JSON_Resolver::get_user_global_styles_post_id() . '?context=edit', + /* + * Preload the global styles path with the correct context based on user caps. + * NOTE: There is an equivalent conditional check in the client-side code to fetch + * the global styles entity using the appropriate context value. + * See the call to `canUser()`, under `useGlobalStylesUserConfig()` in `packages/edit-site/src/components/use-global-styles-user-config/index.js`. + * Please ensure that the equivalent check is kept in sync with this preload path. + */ + '/wp/v2/global-styles/' . WP_Theme_JSON_Resolver::get_user_global_styles_post_id() . '?context=' . $global_styles_endpoint_context, ); block_editor_rest_api_preload( $preload_paths, $block_editor_context ); From 78bcb74bdfbb58cdd494058458e5bbc4b84df022 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Mon, 10 Feb 2025 10:49:18 +0000 Subject: [PATCH 310/323] Coding Standards: Use strict comparison in `WP_Query::the_comment()` and `::have_comments()`. Follow-up to [4934]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59796 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-query.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/class-wp-query.php b/src/wp-includes/class-wp-query.php index f8d3d67d3fbd5..e7ad0a0f7215b 100644 --- a/src/wp-includes/class-wp-query.php +++ b/src/wp-includes/class-wp-query.php @@ -3847,7 +3847,7 @@ public function the_comment() { $comment = $this->next_comment(); - if ( 0 == $this->current_comment ) { + if ( 0 === $this->current_comment ) { /** * Fires once the comment loop is started. * @@ -3869,7 +3869,7 @@ public function the_comment() { public function have_comments() { if ( $this->current_comment + 1 < $this->comment_count ) { return true; - } elseif ( $this->current_comment + 1 == $this->comment_count ) { + } elseif ( $this->current_comment + 1 === $this->comment_count ) { $this->rewind_comments(); } From b93ecb88dda78f639d8385b41321e7e8ca7234d3 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Mon, 10 Feb 2025 14:28:46 +0000 Subject: [PATCH 311/323] Build/Test Tools: Remove `matchdep` as a dependency. `matchdep` was introduced in [25243] to more easily manage `grunt-*` dependencies. The package has effectively been abandoned upstream, and the functionality can be replaced with a simple loop. Props desrosj, spacedmonkey, swissspidy. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59797 602fd350-edb4-49c9-b593-d223f7449a82 --- Gruntfile.js | 40 +++++++++++++-- package-lock.json | 123 ---------------------------------------------- package.json | 1 - 3 files changed, 37 insertions(+), 127 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 7d9a6e7d4c073..09ce2317e2b51 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -83,12 +83,46 @@ module.exports = function(grunt) { // First do `npm install` if package.json has changed. installChanged.watchPackage(); - // Load tasks. - require('matchdep').filterDev(['grunt-*', '!grunt-legacy-util']).forEach( grunt.loadNpmTasks ); - // Load legacy utils. grunt.util = require('grunt-legacy-util'); + var gruntDependencies = { + 'contrib': [ + 'clean', + 'concat', + 'copy', + 'cssmin', + 'jshint', + 'qunit', + 'uglify', + 'watch' + ], + 'standard': [ + 'banner', + 'file-append', + 'jsdoc', + 'patch-wordpress', + 'replace-lts', + 'rtlcss', + 'sass', + 'webpack' + ] + }; + + // Load grunt-* tasks. + function loadGruntTasks( dependency ) { + var contrib = key === 'contrib' ? 'contrib-' : ''; + grunt.loadNpmTasks( 'grunt-' + contrib + dependency ); + } + + for ( var key in gruntDependencies ) { + if ( ! gruntDependencies.hasOwnProperty( key ) ) { + continue; + } + + gruntDependencies[key].forEach( loadGruntTasks ); + } + // Load PostCSS tasks. grunt.loadNpmTasks('@lodder/grunt-postcss'); diff --git a/package-lock.json b/package-lock.json index d60ff5497138a..58e91930e895f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -140,7 +140,6 @@ "grunt-webpack": "7.0.0", "ink-docstrap": "1.3.2", "install-changed": "1.1.0", - "matchdep": "~2.0.0", "postcss": "8.4.49", "prettier": "npm:wp-prettier@2.6.2", "qunit": "~2.23.1", @@ -25440,119 +25439,6 @@ "outlayer": "^2.1.0" } }, - "node_modules/matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==", - "dev": true, - "dependencies": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/matchdep/node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==", - "dev": true, - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/matchdep/node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -32345,15 +32231,6 @@ "dev": true, "optional": true }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", diff --git a/package.json b/package.json index 3dfc9bd5e92e9..34017db0395b1 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,6 @@ "grunt-webpack": "7.0.0", "ink-docstrap": "1.3.2", "install-changed": "1.1.0", - "matchdep": "~2.0.0", "postcss": "8.4.49", "prettier": "npm:wp-prettier@2.6.2", "qunit": "~2.23.1", From 9b1724271d53a93af3ff7022edd5e710d9193fb5 Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Mon, 10 Feb 2025 14:59:02 +0000 Subject: [PATCH 312/323] Cron API: Clear the `recovery_mode_clean_expired_keys` cron event when converting a single site installation to Multisite. This cron event is not used when Multisite is in use. Props debarghyabanerjee, johnbillion, narenin Fixes #61450 git-svn-id: https://develop.svn.wordpress.org/trunk@59798 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/schema.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/wp-admin/includes/schema.php b/src/wp-admin/includes/schema.php index a7256c828aa0f..011895f06c466 100644 --- a/src/wp-admin/includes/schema.php +++ b/src/wp-admin/includes/schema.php @@ -1047,6 +1047,11 @@ function populate_network( $network_id = 1, $domain = '', $email = '', $site_nam ) ); + // Remove the cron event since Recovery Mode is not used in Multisite. + if ( wp_next_scheduled( 'recovery_mode_clean_expired_keys' ) ) { + wp_clear_scheduled_hook( 'recovery_mode_clean_expired_keys' ); + } + /* * When upgrading from single to multisite, assume the current site will * become the main site of the network. When using populate_network() From ddb904679f7739e9624bfd853eb6f2acd20e6af9 Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Mon, 10 Feb 2025 15:29:44 +0000 Subject: [PATCH 313/323] Administration: Remove a potentially incorrect addressee and improve the phrasing used in the confirmation email when a user attempts to change the administration email address. Props MadtownLems, ilovecats7, rehanali, iflairwebtechnologies, thehercules Fixes #48879 git-svn-id: https://develop.svn.wordpress.org/trunk@59799 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/misc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-admin/includes/misc.php b/src/wp-admin/includes/misc.php index afa36a2f2b51a..559f3ec9e763d 100644 --- a/src/wp-admin/includes/misc.php +++ b/src/wp-admin/includes/misc.php @@ -1460,9 +1460,9 @@ function update_option_new_admin_email( $old_value, $value ) { /* translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: those are placeholders. */ $email_text = __( - 'Howdy ###USERNAME###, + 'Howdy, -Someone with administrator capabilities recently requested to have the +A site Administrator (###USERNAME###) recently requested to have the administration email address changed on this site: ###SITEURL### From 9160fbd2f61eca84b775392aeda82822c9776f7f Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Mon, 10 Feb 2025 17:04:26 +0000 Subject: [PATCH 314/323] Administration: Correct the capitalisation of "site administrator" for consistency with other instances within WordPress. Follow-up to [59799]. Props ocean90 Fixes #48879 git-svn-id: https://develop.svn.wordpress.org/trunk@59800 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/misc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-admin/includes/misc.php b/src/wp-admin/includes/misc.php index 559f3ec9e763d..06599381829c0 100644 --- a/src/wp-admin/includes/misc.php +++ b/src/wp-admin/includes/misc.php @@ -1462,7 +1462,7 @@ function update_option_new_admin_email( $old_value, $value ) { $email_text = __( 'Howdy, -A site Administrator (###USERNAME###) recently requested to have the +A site administrator (###USERNAME###) recently requested to have the administration email address changed on this site: ###SITEURL### From f71d5f06b2e3327c40bfb6102fec5d37ee87faef Mon Sep 17 00:00:00 2001 From: Peter Wilson <peterwilsoncc@git.wordpress.org> Date: Mon, 10 Feb 2025 22:21:51 +0000 Subject: [PATCH 315/323] REST API: Add support for the `ignore_sticky_posts` argument. Introduce `ignore_sticky` as a boolean argument for the posts endpoint for requests without the sticky posts being stuck. The new argument defaults to `false` with the value of the argument passed to `WP_Query`'s `ignore_sticky_posts` parameter. Props audrasjb, danielbachhuber, joemcgill, johnbillion, jorbin, mamaduka, rmccue. Fixes #35907. git-svn-id: https://develop.svn.wordpress.org/trunk@59801 602fd350-edb4-49c9-b593-d223f7449a82 --- .../class-wp-rest-posts-controller.php | 15 +++++ .../tests/rest-api/rest-posts-controller.php | 66 +++++++++++++++++++ tests/qunit/fixtures/wp-api-generated.js | 6 ++ 3 files changed, 87 insertions(+) diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php index 6f872be3dfd78..cb25207fc5bdc 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php @@ -247,6 +247,7 @@ public function get_items( $request ) { 'author_exclude' => 'author__not_in', 'exclude' => 'post__not_in', 'include' => 'post__in', + 'ignore_sticky' => 'ignore_sticky_posts', 'menu_order' => 'menu_order', 'offset' => 'offset', 'order' => 'order', @@ -337,6 +338,14 @@ public function get_items( $request ) { } } + /* + * Honor the original REST API `post__in` behavior. Don't prepend sticky posts + * when `post__in` has been specified. + */ + if ( ! empty( $args['post__in'] ) ) { + unset( $args['ignore_sticky_posts'] ); + } + if ( isset( $registered['search_semantics'], $request['search_semantics'] ) && 'exact' === $request['search_semantics'] @@ -3045,6 +3054,12 @@ public function get_collection_params() { 'description' => __( 'Limit result set to items that are sticky.' ), 'type' => 'boolean', ); + + $query_params['ignore_sticky'] = array( + 'description' => __( 'Whether to ignore sticky posts or not.' ), + 'type' => 'boolean', + 'default' => false, + ); } if ( post_type_supports( $this->post_type, 'post-formats' ) ) { diff --git a/tests/phpunit/tests/rest-api/rest-posts-controller.php b/tests/phpunit/tests/rest-api/rest-posts-controller.php index c42fded13222a..a09d6d33bacac 100644 --- a/tests/phpunit/tests/rest-api/rest-posts-controller.php +++ b/tests/phpunit/tests/rest-api/rest-posts-controller.php @@ -197,6 +197,7 @@ public function test_registered_query_params() { 'context', 'exclude', 'format', + 'ignore_sticky', 'include', 'modified_after', 'modified_before', @@ -5715,6 +5716,71 @@ public function test_get_posts_with_pagination() { $this->assertErrorResponse( 'rest_post_invalid_page_number', $response, 400 ); } + /** + * Test the REST API support for `ignore_sticky_posts`. + * + * @ticket 35907 + * + * @covers WP_REST_Posts_Controller::get_items + */ + public function test_get_posts_ignore_sticky_default_prepends_sticky_posts() { + $id1 = self::$post_id; + // Create more recent post to avoid automatically placing other at the top. + $id2 = self::factory()->post->create( array( 'post_status' => 'publish' ) ); + + update_option( 'sticky_posts', array( $id1 ) ); + + $request = new WP_REST_Request( 'GET', '/wp/v2/posts' ); + $response = rest_get_server()->dispatch( $request ); + $data = $response->get_data(); + + $this->assertSame( $data[0]['id'], $id1, 'Response has sticky post at the top.' ); + $this->assertSame( $data[1]['id'], $id2, 'It is followed by most recent post.' ); + } + + /** + * Test the REST API support for `ignore_sticky_posts`. + * + * @ticket 35907 + * + * @covers WP_REST_Posts_Controller::get_items + */ + public function test_get_posts_ignore_sticky_ignores_post_stickiness() { + $id1 = self::$post_id; + $id2 = self::factory()->post->create( array( 'post_status' => 'publish' ) ); + + update_option( 'sticky_posts', array( $id1 ) ); + + $request = new WP_REST_Request( 'GET', '/wp/v2/posts' ); + $request->set_param( 'ignore_sticky', true ); + $response = rest_get_server()->dispatch( $request ); + $data = $response->get_data(); + + $this->assertSame( $data[0]['id'], $id2, 'Response has no sticky post at the top.' ); + } + + /** + * Test the REST API support for `ignore_sticky_posts`. + * + * @ticket 35907 + * + * @covers WP_REST_Posts_Controller::get_items + */ + public function test_get_posts_ignore_sticky_honors_include() { + $id1 = self::$post_id; + $id2 = self::factory()->post->create( array( 'post_status' => 'publish' ) ); + + update_option( 'sticky_posts', array( $id1 ) ); + + $request = new WP_REST_Request( 'GET', '/wp/v2/posts' ); + $request->set_param( 'include', array( $id2 ) ); + $response = rest_get_server()->dispatch( $request ); + $data = $response->get_data(); + + $this->assertCount( 1, $data, 'Only one post is expected to be returned.' ); + $this->assertSame( $data[0]['id'], $id2, 'Returns the included post.' ); + } + /** * Internal function used to disable an insert query which * will trigger a wpdb error for testing purposes. diff --git a/tests/qunit/fixtures/wp-api-generated.js b/tests/qunit/fixtures/wp-api-generated.js index 448548aab0c07..f3a1f21e48b0e 100644 --- a/tests/qunit/fixtures/wp-api-generated.js +++ b/tests/qunit/fixtures/wp-api-generated.js @@ -627,6 +627,12 @@ mockedApiResponse.Schema = { "type": "boolean", "required": false }, + "ignore_sticky": { + "description": "Whether to ignore sticky posts or not.", + "type": "boolean", + "default": false, + "required": false + }, "format": { "description": "Limit result set to items assigned one or more given formats.", "type": "array", From d71f29ff0899c6eb29bc037a7c521a966405cb35 Mon Sep 17 00:00:00 2001 From: Peter Wilson <peterwilsoncc@git.wordpress.org> Date: Mon, 10 Feb 2025 22:27:49 +0000 Subject: [PATCH 316/323] Global Styles: Improve sanitization of block variation styles. Fixes an issue where block style variations containing inner block type and element styles would have those inner styles stripped when the user attempting to save Global Styles does not have the `unfiltered_html` capability. Props aaronrobertshaw, mukesh27, andrewserong. Fixes #62372. git-svn-id: https://develop.svn.wordpress.org/trunk@59802 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-theme-json.php | 77 ++++++--- tests/phpunit/tests/theme/wpThemeJson.php | 184 ++++++++++++++++++++++ 2 files changed, 242 insertions(+), 19 deletions(-) diff --git a/src/wp-includes/class-wp-theme-json.php b/src/wp-includes/class-wp-theme-json.php index 7d1216a4515d3..7f45040221af4 100644 --- a/src/wp-includes/class-wp-theme-json.php +++ b/src/wp-includes/class-wp-theme-json.php @@ -3552,26 +3552,12 @@ public static function remove_insecure_properties( $theme_json, $origin = 'theme $variation_output = static::remove_insecure_styles( $variation_input ); - // Process a variation's elements and element pseudo selector styles. - if ( isset( $variation_input['elements'] ) ) { - foreach ( $valid_element_names as $element_name ) { - $element_input = $variation_input['elements'][ $element_name ] ?? null; - if ( $element_input ) { - $element_output = static::remove_insecure_styles( $element_input ); - - if ( isset( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $element_name ] ) ) { - foreach ( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $element_name ] as $pseudo_selector ) { - if ( isset( $element_input[ $pseudo_selector ] ) ) { - $element_output[ $pseudo_selector ] = static::remove_insecure_styles( $element_input[ $pseudo_selector ] ); - } - } - } + if ( isset( $variation_input['blocks'] ) ) { + $variation_output['blocks'] = static::remove_insecure_inner_block_styles( $variation_input['blocks'] ); + } - if ( ! empty( $element_output ) ) { - _wp_array_set( $variation_output, array( 'elements', $element_name ), $element_output ); - } - } - } + if ( isset( $variation_input['elements'] ) ) { + $variation_output['elements'] = static::remove_insecure_element_styles( $variation_input['elements'] ); } if ( ! empty( $variation_output ) ) { @@ -3609,6 +3595,59 @@ public static function remove_insecure_properties( $theme_json, $origin = 'theme return $theme_json; } + /** + * Remove insecure element styles within a variation or block. + * + * @since 6.8.0 + * + * @param array $elements The elements to process. + * @return array The sanitized elements styles. + */ + protected static function remove_insecure_element_styles( $elements ) { + $sanitized = array(); + $valid_element_names = array_keys( static::ELEMENTS ); + + foreach ( $valid_element_names as $element_name ) { + $element_input = $elements[ $element_name ] ?? null; + if ( $element_input ) { + $element_output = static::remove_insecure_styles( $element_input ); + + if ( isset( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $element_name ] ) ) { + foreach ( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $element_name ] as $pseudo_selector ) { + if ( isset( $element_input[ $pseudo_selector ] ) ) { + $element_output[ $pseudo_selector ] = static::remove_insecure_styles( $element_input[ $pseudo_selector ] ); + } + } + } + + $sanitized[ $element_name ] = $element_output; + } + } + return $sanitized; + } + + /** + * Remove insecure styles from inner blocks and their elements. + * + * @since 6.8.0 + * + * @param array $blocks The block styles to process. + * @return array Sanitized block type styles. + */ + protected static function remove_insecure_inner_block_styles( $blocks ) { + $sanitized = array(); + foreach ( $blocks as $block_type => $block_input ) { + $block_output = static::remove_insecure_styles( $block_input ); + + if ( isset( $block_input['elements'] ) ) { + $block_output['elements'] = static::remove_insecure_element_styles( $block_input['elements'] ); + } + + $sanitized[ $block_type ] = $block_output; + } + return $sanitized; + } + /** * Processes a setting node and returns the same node * without the insecure settings. diff --git a/tests/phpunit/tests/theme/wpThemeJson.php b/tests/phpunit/tests/theme/wpThemeJson.php index 8fe8c7d5d0d65..f40df84a38fb2 100644 --- a/tests/phpunit/tests/theme/wpThemeJson.php +++ b/tests/phpunit/tests/theme/wpThemeJson.php @@ -4706,6 +4706,190 @@ public function test_block_style_variations_with_invalid_properties() { $this->assertSameSetsWithIndex( $expected, $actual ); } + /** + * Test ensures that inner block type styles and their element styles are + * preserved for block style variations when removing insecure properties. + * + * @ticket 62372 + */ + public function test_block_style_variations_with_inner_blocks_and_elements() { + wp_set_current_user( static::$administrator_id ); + register_block_style( + array( 'core/group' ), + array( + 'name' => 'custom-group', + 'label' => 'Custom Group', + ) + ); + + $expected = array( + 'version' => WP_Theme_JSON::LATEST_SCHEMA, + 'styles' => array( + 'blocks' => array( + 'core/group' => array( + 'color' => array( + 'background' => 'blue', + ), + 'variations' => array( + 'custom-group' => array( + 'color' => array( + 'background' => 'purple', + ), + 'blocks' => array( + 'core/paragraph' => array( + 'color' => array( + 'text' => 'red', + ), + 'elements' => array( + 'link' => array( + 'color' => array( + 'text' => 'blue', + ), + ':hover' => array( + 'color' => array( + 'text' => 'green', + ), + ), + ), + ), + ), + 'core/heading' => array( + 'typography' => array( + 'fontSize' => '24px', + ), + ), + ), + 'elements' => array( + 'link' => array( + 'color' => array( + 'text' => 'yellow', + ), + ':hover' => array( + 'color' => array( + 'text' => 'orange', + ), + ), + ), + ), + ), + ), + ), + ), + ), + ); + + $actual = WP_Theme_JSON::remove_insecure_properties( $expected ); + + // The sanitization processes blocks in a specific order which might differ to the theme.json input. + $this->assertEqualsCanonicalizing( + $expected, + $actual, + 'Block style variations data does not match when inner blocks or element styles present' + ); + } + + /** + * Test ensures that inner block type styles and their element styles for block + * style variations have all unsafe values removed. + * + * @ticket 62372 + */ + public function test_block_style_variations_with_invalid_inner_block_or_element_styles() { + wp_set_current_user( static::$administrator_id ); + register_block_style( + array( 'core/group' ), + array( + 'name' => 'custom-group', + 'label' => 'Custom Group', + ) + ); + + $input = array( + 'version' => WP_Theme_JSON::LATEST_SCHEMA, + 'styles' => array( + 'blocks' => array( + 'core/group' => array( + 'variations' => array( + 'custom-group' => array( + 'blocks' => array( + 'core/paragraph' => array( + 'color' => array( + 'text' => 'red', + ), + 'typography' => array( + 'fontSize' => 'alert(1)', // Should be removed. + ), + 'elements' => array( + 'link' => array( + 'color' => array( + 'text' => 'blue', + ), + 'css' => 'unsafe-value', // Should be removed. + ), + ), + 'custom' => 'unsafe-value', // Should be removed. + ), + ), + 'elements' => array( + 'link' => array( + 'color' => array( + 'text' => 'yellow', + ), + 'javascript' => 'alert(1)', // Should be removed. + ), + ), + ), + ), + ), + ), + ), + ); + + $expected = array( + 'version' => WP_Theme_JSON::LATEST_SCHEMA, + 'styles' => array( + 'blocks' => array( + 'core/group' => array( + 'variations' => array( + 'custom-group' => array( + 'blocks' => array( + 'core/paragraph' => array( + 'color' => array( + 'text' => 'red', + ), + 'elements' => array( + 'link' => array( + 'color' => array( + 'text' => 'blue', + ), + ), + ), + ), + ), + 'elements' => array( + 'link' => array( + 'color' => array( + 'text' => 'yellow', + ), + ), + ), + ), + ), + ), + ), + ), + ); + + $actual = WP_Theme_JSON::remove_insecure_properties( $input ); + + // The sanitization processes blocks in a specific order which might differ to the theme.json input. + $this->assertEqualsCanonicalizing( + $expected, + $actual, + 'Insecure properties were not removed from block style variation inner block types or elements' + ); + } + /** * Tests generating the spacing presets array based on the spacing scale provided. * From 61a39debefce4f90b86b83758e3dbf597f966d9d Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Tue, 11 Feb 2025 11:12:03 +0000 Subject: [PATCH 317/323] Security: Explicitly require the `hash` PHP extension and add requirement checks during installation and upgrade. This extension provides the `hash()` function and support for the SHA-256 algorithm, both of which are required for upcoming security related changes. This extension is almost universally enabled, however it is technically possible to disable it on PHP 7.2 and 7.3, hence the introduction of this requirement and the corresponding requirement checks prior to installing or upgrading WordPress. Props peterwilsoncc, ayeshrajans, dd32, SergeyBiryukov, johnbillion. Fixes #60638, #62815, #56017 See #21022 git-svn-id: https://develop.svn.wordpress.org/trunk@59803 602fd350-edb4-49c9-b593-d223f7449a82 --- composer.json | 1 + .../includes/class-wp-site-health.php | 2 +- src/wp-admin/includes/update-core.php | 39 +++--- src/wp-admin/install.php | 34 +++++- src/wp-admin/upgrade.php | 33 ++++-- src/wp-includes/class-wp-session-tokens.php | 7 +- src/wp-includes/class-wpdb.php | 4 +- src/wp-includes/compat.php | 112 ------------------ src/wp-includes/load.php | 31 ++++- src/wp-includes/pluggable.php | 8 +- src/wp-includes/version.php | 10 ++ src/wp-settings.php | 15 +-- 12 files changed, 131 insertions(+), 165 deletions(-) diff --git a/composer.json b/composer.json index aea6ea7a42648..0a8a9c78094c7 100644 --- a/composer.json +++ b/composer.json @@ -10,6 +10,7 @@ "issues": "https://core.trac.wordpress.org/" }, "require": { + "ext-hash": "*", "ext-json": "*", "php": ">=7.2.24" }, diff --git a/src/wp-admin/includes/class-wp-site-health.php b/src/wp-admin/includes/class-wp-site-health.php index 3f89fc0a38ffc..19d109d447283 100644 --- a/src/wp-admin/includes/class-wp-site-health.php +++ b/src/wp-admin/includes/class-wp-site-health.php @@ -923,7 +923,7 @@ public function get_test_php_extensions() { ), 'hash' => array( 'function' => 'hash', - 'required' => false, + 'required' => true, ), 'imagick' => array( 'extension' => 'imagick', diff --git a/src/wp-admin/includes/update-core.php b/src/wp-admin/includes/update-core.php index a29f389860127..941e5e1b25b0d 100644 --- a/src/wp-admin/includes/update-core.php +++ b/src/wp-admin/includes/update-core.php @@ -1009,9 +1009,6 @@ * @global array $_old_requests_files * @global array $_new_bundled_files * @global wpdb $wpdb WordPress database abstraction object. - * @global string $wp_version - * @global string $required_php_version - * @global string $required_mysql_version * * @param string $from New release unzipped path. * @param string $to Path to old WordPress installation. @@ -1075,7 +1072,7 @@ function update_core( $from, $to ) { } /* - * Import $wp_version, $required_php_version, and $required_mysql_version from the new version. + * Import $wp_version, $required_php_version, $required_php_extensions, and $required_mysql_version from the new version. * DO NOT globalize any variables imported from `version-current.php` in this function. * * BC Note: $wp_filesystem->wp_content_dir() returned unslashed pre-2.8. @@ -1181,17 +1178,29 @@ function update_core( $from, $to ) { ); } - // Add a warning when the JSON PHP extension is missing. - if ( ! extension_loaded( 'json' ) ) { - return new WP_Error( - 'php_not_compatible_json', - sprintf( - /* translators: 1: WordPress version number, 2: The PHP extension name needed. */ - __( 'The update cannot be installed because WordPress %1$s requires the %2$s PHP extension.' ), - $wp_version, - 'JSON' - ) - ); + if ( isset( $required_php_extensions ) && is_array( $required_php_extensions ) ) { + $missing_extensions = new WP_Error(); + + foreach ( $required_php_extensions as $extension ) { + if ( extension_loaded( $extension ) ) { + continue; + } + + $missing_extensions->add( + "php_not_compatible_{$extension}", + sprintf( + /* translators: 1: WordPress version number, 2: The PHP extension name needed. */ + __( 'The update cannot be installed because WordPress %1$s requires the %2$s PHP extension.' ), + $wp_version, + $extension + ) + ); + } + + // Add a warning when required PHP extensions are missing. + if ( $missing_extensions->has_errors() ) { + return $missing_extensions; + } } /** This filter is documented in wp-admin/includes/update-core.php */ diff --git a/src/wp-admin/install.php b/src/wp-admin/install.php index e81331acfc82e..736c5138e96ec 100644 --- a/src/wp-admin/install.php +++ b/src/wp-admin/install.php @@ -232,12 +232,13 @@ function display_setup_form( $error = null ) { } /** - * @global string $wp_version The WordPress version string. - * @global string $required_php_version The required PHP version string. - * @global string $required_mysql_version The required MySQL version string. - * @global wpdb $wpdb WordPress database abstraction object. + * @global string $wp_version The WordPress version string. + * @global string $required_php_version The required PHP version string. + * @global string[] $required_php_extensions The names of required PHP extensions. + * @global string $required_mysql_version The required MySQL version string. + * @global wpdb $wpdb WordPress database abstraction object. */ -global $wp_version, $required_php_version, $required_mysql_version, $wpdb; +global $wp_version, $required_php_version, $required_php_extensions, $required_mysql_version, $wpdb; $php_version = PHP_VERSION; $mysql_version = $wpdb->db_version(); @@ -298,6 +299,29 @@ function display_setup_form( $error = null ) { die( '<h1>' . __( 'Requirements Not Met' ) . '</h1><p>' . $compat . '</p></body></html>' ); } +if ( isset( $required_php_extensions ) && is_array( $required_php_extensions ) ) { + $missing_extensions = array(); + + foreach ( $required_php_extensions as $extension ) { + if ( extension_loaded( $extension ) ) { + continue; + } + + $missing_extensions[] = sprintf( + /* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: The PHP extension name needed. */ + __( 'You cannot install because <a href="%1$s">WordPress %2$s</a> requires the %3$s PHP extension.' ), + $version_url, + $wp_version, + $extension + ); + } + + if ( count( $missing_extensions ) > 0 ) { + display_header(); + die( '<h1>' . __( 'Requirements Not Met' ) . '</h1><p>' . implode( '</p><p>', $missing_extensions ) . '</p></body></html>' ); + } +} + if ( ! is_string( $wpdb->base_prefix ) || '' === $wpdb->base_prefix ) { display_header(); die( diff --git a/src/wp-admin/upgrade.php b/src/wp-admin/upgrade.php index 9edadd9be2f1c..ea98082704070 100644 --- a/src/wp-admin/upgrade.php +++ b/src/wp-admin/upgrade.php @@ -36,12 +36,13 @@ } /** - * @global string $wp_version The WordPress version string. - * @global string $required_php_version The required PHP version string. - * @global string $required_mysql_version The required MySQL version string. - * @global wpdb $wpdb WordPress database abstraction object. + * @global string $wp_version The WordPress version string. + * @global string $required_php_version The required PHP version string. + * @global string[] $required_php_extensions The names of required PHP extensions. + * @global string $required_mysql_version The required MySQL version string. + * @global wpdb $wpdb WordPress database abstraction object. */ -global $wp_version, $required_php_version, $required_mysql_version, $wpdb; +global $wp_version, $required_php_version, $required_php_extensions, $required_mysql_version, $wpdb; $step = (int) $step; @@ -54,6 +55,24 @@ $mysql_compat = version_compare( $mysql_version, $required_mysql_version, '>=' ); } +$missing_extensions = array(); + +if ( isset( $required_php_extensions ) && is_array( $required_php_extensions ) ) { + foreach ( $required_php_extensions as $extension ) { + if ( extension_loaded( $extension ) ) { + continue; + } + + $missing_extensions[] = sprintf( + /* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: The PHP extension name needed. */ + __( 'You cannot upgrade because <a href="%1$s">WordPress %2$s</a> requires the %3$s PHP extension.' ), + $version_url, + $wp_version, + $extension + ); + } +} + header( 'Content-Type: ' . get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ) ); ?> <!DOCTYPE html> @@ -126,8 +145,8 @@ } echo '<p>' . $message . '</p>'; - ?> - <?php +elseif ( count( $missing_extensions ) > 0 ) : + echo '<p>' . implode( '</p><p>', $missing_extensions ) . '</p>'; else : switch ( $step ) : case 0: diff --git a/src/wp-includes/class-wp-session-tokens.php b/src/wp-includes/class-wp-session-tokens.php index feabf698b7467..9482e1b948777 100644 --- a/src/wp-includes/class-wp-session-tokens.php +++ b/src/wp-includes/class-wp-session-tokens.php @@ -68,12 +68,7 @@ final public static function get_instance( $user_id ) { * @return string A hash of the session token (a verifier). */ private function hash_token( $token ) { - // If ext/hash is not present, use sha1() instead. - if ( function_exists( 'hash' ) ) { - return hash( 'sha256', $token ); - } else { - return sha1( $token ); - } + return hash( 'sha256', $token ); } /** diff --git a/src/wp-includes/class-wpdb.php b/src/wp-includes/class-wpdb.php index 5ace90d490e17..c6e6099c260cd 100644 --- a/src/wp-includes/class-wpdb.php +++ b/src/wp-includes/class-wpdb.php @@ -2412,12 +2412,10 @@ public function placeholder_escape() { static $placeholder; if ( ! $placeholder ) { - // If ext/hash is not present, compat.php's hash_hmac() does not support sha256. - $algo = function_exists( 'hash' ) ? 'sha256' : 'sha1'; // Old WP installs may not have AUTH_SALT defined. $salt = defined( 'AUTH_SALT' ) && AUTH_SALT ? AUTH_SALT : (string) rand(); - $placeholder = '{' . hash_hmac( $algo, uniqid( $salt, true ), $salt ) . '}'; + $placeholder = '{' . hash_hmac( 'sha256', uniqid( $salt, true ), $salt ) . '}'; } /* diff --git a/src/wp-includes/compat.php b/src/wp-includes/compat.php index 01b9996c75dcb..fc6db436fecd8 100644 --- a/src/wp-includes/compat.php +++ b/src/wp-includes/compat.php @@ -263,118 +263,6 @@ function _mb_strlen( $str, $encoding = null ) { return --$count; } -if ( ! function_exists( 'hash_hmac' ) ) : - /** - * Compat function to mimic hash_hmac(). - * - * The Hash extension is bundled with PHP by default since PHP 5.1.2. - * However, the extension may be explicitly disabled on select servers. - * As of PHP 7.4.0, the Hash extension is a core PHP extension and can no - * longer be disabled. - * I.e. when PHP 7.4.0 becomes the minimum requirement, this polyfill - * and the associated `_hash_hmac()` function can be safely removed. - * - * @ignore - * @since 3.2.0 - * - * @see _hash_hmac() - * - * @param string $algo Hash algorithm. Accepts 'md5' or 'sha1'. - * @param string $data Data to be hashed. - * @param string $key Secret key to use for generating the hash. - * @param bool $binary Optional. Whether to output raw binary data (true), - * or lowercase hexits (false). Default false. - * @return string|false The hash in output determined by `$binary`. - * False if `$algo` is unknown or invalid. - */ - function hash_hmac( $algo, $data, $key, $binary = false ) { - return _hash_hmac( $algo, $data, $key, $binary ); - } -endif; - -/** - * Internal compat function to mimic hash_hmac(). - * - * @ignore - * @since 3.2.0 - * - * @param string $algo Hash algorithm. Accepts 'md5' or 'sha1'. - * @param string $data Data to be hashed. - * @param string $key Secret key to use for generating the hash. - * @param bool $binary Optional. Whether to output raw binary data (true), - * or lowercase hexits (false). Default false. - * @return string|false The hash in output determined by `$binary`. - * False if `$algo` is unknown or invalid. - */ -function _hash_hmac( $algo, $data, $key, $binary = false ) { - $packs = array( - 'md5' => 'H32', - 'sha1' => 'H40', - ); - - if ( ! isset( $packs[ $algo ] ) ) { - return false; - } - - $pack = $packs[ $algo ]; - - if ( strlen( $key ) > 64 ) { - $key = pack( $pack, $algo( $key ) ); - } - - $key = str_pad( $key, 64, chr( 0 ) ); - - $ipad = ( substr( $key, 0, 64 ) ^ str_repeat( chr( 0x36 ), 64 ) ); - $opad = ( substr( $key, 0, 64 ) ^ str_repeat( chr( 0x5C ), 64 ) ); - - $hmac = $algo( $opad . pack( $pack, $algo( $ipad . $data ) ) ); - - if ( $binary ) { - return pack( $pack, $hmac ); - } - - return $hmac; -} - -if ( ! function_exists( 'hash_equals' ) ) : - /** - * Timing attack safe string comparison. - * - * Compares two strings using the same time whether they're equal or not. - * - * Note: It can leak the length of a string when arguments of differing length are supplied. - * - * This function was added in PHP 5.6. - * However, the Hash extension may be explicitly disabled on select servers. - * As of PHP 7.4.0, the Hash extension is a core PHP extension and can no - * longer be disabled. - * I.e. when PHP 7.4.0 becomes the minimum requirement, this polyfill - * can be safely removed. - * - * @since 3.9.2 - * - * @param string $known_string Expected string. - * @param string $user_string Actual, user supplied, string. - * @return bool Whether strings are equal. - */ - function hash_equals( $known_string, $user_string ) { - $known_string_length = strlen( $known_string ); - - if ( strlen( $user_string ) !== $known_string_length ) { - return false; - } - - $result = 0; - - // Do not attempt to "optimize" this. - for ( $i = 0; $i < $known_string_length; $i++ ) { - $result |= ord( $known_string[ $i ] ) ^ ord( $user_string[ $i ] ); - } - - return 0 === $result; - } -endif; - // sodium_crypto_box() was introduced in PHP 7.2. if ( ! function_exists( 'sodium_crypto_box' ) ) { require ABSPATH . WPINC . '/sodium_compat/autoload.php'; diff --git a/src/wp-includes/load.php b/src/wp-includes/load.php index 5066cd16ee341..0526cb175dfb6 100644 --- a/src/wp-includes/load.php +++ b/src/wp-includes/load.php @@ -147,11 +147,12 @@ function wp_populate_basic_auth_from_authorization_header() { * @since 3.0.0 * @access private * - * @global string $required_php_version The required PHP version string. - * @global string $wp_version The WordPress version string. + * @global string $required_php_version The required PHP version string. + * @global string[] $required_php_extensions The names of required PHP extensions. + * @global string $wp_version The WordPress version string. */ function wp_check_php_mysql_versions() { - global $required_php_version, $wp_version; + global $required_php_version, $required_php_extensions, $wp_version; $php_version = PHP_VERSION; @@ -168,6 +169,30 @@ function wp_check_php_mysql_versions() { exit( 1 ); } + $missing_extensions = array(); + + if ( isset( $required_php_extensions ) && is_array( $required_php_extensions ) ) { + foreach ( $required_php_extensions as $extension ) { + if ( extension_loaded( $extension ) ) { + continue; + } + + $missing_extensions[] = sprintf( + 'WordPress %1$s requires the <code>%2$s</code> PHP extension.', + $wp_version, + $extension + ); + } + } + + if ( count( $missing_extensions ) > 0 ) { + $protocol = wp_get_server_protocol(); + header( sprintf( '%s 500 Internal Server Error', $protocol ), true, 500 ); + header( 'Content-Type: text/html; charset=utf-8' ); + echo implode( '<br>', $missing_extensions ); + exit( 1 ); + } + // This runs before default constants are defined, so we can't assume WP_CONTENT_DIR is set yet. $wp_content_dir = defined( 'WP_CONTENT_DIR' ) ? WP_CONTENT_DIR : ABSPATH . 'wp-content'; diff --git a/src/wp-includes/pluggable.php b/src/wp-includes/pluggable.php index 60ad0841ed8ce..bc61ba0bdfa3b 100644 --- a/src/wp-includes/pluggable.php +++ b/src/wp-includes/pluggable.php @@ -772,9 +772,7 @@ function wp_validate_auth_cookie( $cookie = '', $scheme = '' ) { $key = wp_hash( $username . '|' . $pass_frag . '|' . $expiration . '|' . $token, $scheme ); - // If ext/hash is not present, compat.php's hash_hmac() does not support sha256. - $algo = function_exists( 'hash' ) ? 'sha256' : 'sha1'; - $hash = hash_hmac( $algo, $username . '|' . $expiration . '|' . $token, $key ); + $hash = hash_hmac( 'sha256', $username . '|' . $expiration . '|' . $token, $key ); if ( ! hash_equals( $hash, $hmac ) ) { /** @@ -875,9 +873,7 @@ function wp_generate_auth_cookie( $user_id, $expiration, $scheme = 'auth', $toke $key = wp_hash( $user->user_login . '|' . $pass_frag . '|' . $expiration . '|' . $token, $scheme ); - // If ext/hash is not present, compat.php's hash_hmac() does not support sha256. - $algo = function_exists( 'hash' ) ? 'sha256' : 'sha1'; - $hash = hash_hmac( $algo, $user->user_login . '|' . $expiration . '|' . $token, $key ); + $hash = hash_hmac( 'sha256', $user->user_login . '|' . $expiration . '|' . $token, $key ); $cookie = $user->user_login . '|' . $expiration . '|' . $token . '|' . $hash; diff --git a/src/wp-includes/version.php b/src/wp-includes/version.php index ce3923701fd70..7bdeef2e7d4de 100644 --- a/src/wp-includes/version.php +++ b/src/wp-includes/version.php @@ -39,6 +39,16 @@ */ $required_php_version = '7.2.24'; +/** + * Holds the names of required PHP extensions. + * + * @global string[] $required_php_extensions + */ +$required_php_extensions = array( + 'json', + 'hash', +); + /** * Holds the required MySQL version. * diff --git a/src/wp-settings.php b/src/wp-settings.php index ec08ff11498f3..05a13f21a7166 100644 --- a/src/wp-settings.php +++ b/src/wp-settings.php @@ -22,14 +22,15 @@ * include version.php from another installation and don't override * these values if already set. * - * @global string $wp_version The WordPress version string. - * @global int $wp_db_version WordPress database version. - * @global string $tinymce_version TinyMCE version. - * @global string $required_php_version The required PHP version string. - * @global string $required_mysql_version The required MySQL version string. - * @global string $wp_local_package Locale code of the package. + * @global string $wp_version The WordPress version string. + * @global int $wp_db_version WordPress database version. + * @global string $tinymce_version TinyMCE version. + * @global string $required_php_version The required PHP version string. + * @global string[] $required_php_extensions The names of required PHP extensions. + * @global string $required_mysql_version The required MySQL version string. + * @global string $wp_local_package Locale code of the package. */ -global $wp_version, $wp_db_version, $tinymce_version, $required_php_version, $required_mysql_version, $wp_local_package; +global $wp_version, $wp_db_version, $tinymce_version, $required_php_version, $required_php_extensions, $required_mysql_version, $wp_local_package; require ABSPATH . WPINC . '/version.php'; require ABSPATH . WPINC . '/compat.php'; require ABSPATH . WPINC . '/load.php'; From d8425b280a1c8187862d4b857a533a0a747f300b Mon Sep 17 00:00:00 2001 From: John Blackbourn <johnbillion@git.wordpress.org> Date: Tue, 11 Feb 2025 12:16:39 +0000 Subject: [PATCH 318/323] Security: Delete a test file that was missed in [59803]. Props swissspidy. See #60638, #62815, #56017 git-svn-id: https://develop.svn.wordpress.org/trunk@59804 602fd350-edb4-49c9-b593-d223f7449a82 --- tests/phpunit/tests/compat/hashHmac.php | 65 ------------------------- 1 file changed, 65 deletions(-) delete mode 100644 tests/phpunit/tests/compat/hashHmac.php diff --git a/tests/phpunit/tests/compat/hashHmac.php b/tests/phpunit/tests/compat/hashHmac.php deleted file mode 100644 index f9a61d5faca63..0000000000000 --- a/tests/phpunit/tests/compat/hashHmac.php +++ /dev/null @@ -1,65 +0,0 @@ -<?php - -/** - * @group compat - * - * @covers ::hash_hmac - * @covers ::_hash_hmac - */ -class Tests_Compat_hashHmac extends WP_UnitTestCase { - - /** - * Test that hash_hmac() is always available (either from PHP or WP). - */ - public function test_hash_hmac_availability() { - $this->assertTrue( function_exists( 'hash_hmac' ) ); - } - - public function test_hash_hmac_simple() { - $data = 'simple'; - $key = 'key'; - - $this->assertSame( - '140d1cb79fa12e2a31f32d35ad0a2723', - _hash_hmac( 'md5', $data, $key ), - 'MD5 hash does not match' - ); - $this->assertSame( - '993003b95758e0ac2eba451a4c5877eb1bb7b92a', - _hash_hmac( 'sha1', $data, $key ), - 'sha1 hash does not match' - ); - } - - public function test_hash_hmac_padding() { - $data = 'simple'; - $key = '65 character key 65 character key 65 character key 65 character k'; - - $this->assertSame( - '3c1399103807cf12ec38228614416a8c', - _hash_hmac( 'md5', $data, $key ), - 'MD5 hash does not match' - ); - $this->assertSame( - '4428826d20003e309d6c2a6515891370daf184ea', - _hash_hmac( 'sha1', $data, $key ), - 'sha1 hash does not match' - ); - } - - public function test_hash_hmac_output() { - $data = 'simple'; - $key = 'key'; - - $this->assertSame( - array( 1 => '140d1cb79fa12e2a31f32d35ad0a2723' ), - unpack( 'H32', _hash_hmac( 'md5', $data, $key, true ) ), - 'unpacked MD5 hash does not match' - ); - $this->assertSame( - array( 1 => '993003b95758e0ac2eba451a4c5877eb1bb7b92a' ), - unpack( 'H40', _hash_hmac( 'sha1', $data, $key, true ) ), - 'unpacked sha1 hash does not match' - ); - } -} From a91a243e32b2bd02d8d77badd0f13d07be0fe31c Mon Sep 17 00:00:00 2001 From: Sergey Biryukov <sergeybiryukov@git.wordpress.org> Date: Tue, 11 Feb 2025 13:38:12 +0000 Subject: [PATCH 319/323] Coding Standards: Correct default values in `WP_Comment` to match the documented type. Follow-up to [33891], [48941]. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59805 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-comment.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/class-wp-comment.php b/src/wp-includes/class-wp-comment.php index c5a0bd9aafa12..b42523da375f7 100644 --- a/src/wp-includes/class-wp-comment.php +++ b/src/wp-includes/class-wp-comment.php @@ -33,7 +33,7 @@ final class WP_Comment { * @since 4.4.0 * @var string */ - public $comment_post_ID = 0; + public $comment_post_ID = '0'; /** * Comment author name. @@ -99,7 +99,7 @@ final class WP_Comment { * @since 4.4.0 * @var string */ - public $comment_karma = 0; + public $comment_karma = '0'; /** * Comment approval status. @@ -134,7 +134,7 @@ final class WP_Comment { * @since 4.4.0 * @var string */ - public $comment_parent = 0; + public $comment_parent = '0'; /** * Comment author ID. @@ -144,7 +144,7 @@ final class WP_Comment { * @since 4.4.0 * @var string */ - public $user_id = 0; + public $user_id = '0'; /** * Comment children. From e7959252d4f023252501df5a1599a6ac5912fec5 Mon Sep 17 00:00:00 2001 From: David Baumwald <davidbaumwald@git.wordpress.org> Date: Tue, 11 Feb 2025 15:55:55 +0000 Subject: [PATCH 320/323] General: Remove duplicate `type="button"` attribute from the "Change|Choose Site Icon" button. Introduced in [57602]. Props kkmuffme, audrasjb. Fixes #62942. git-svn-id: https://develop.svn.wordpress.org/trunk@59806 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/options-general.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/wp-admin/options-general.php b/src/wp-admin/options-general.php index 45d371cf6bf6e..f0becb113d767 100644 --- a/src/wp-admin/options-general.php +++ b/src/wp-admin/options-general.php @@ -184,7 +184,6 @@ <div class="site-icon-action-buttons"> <button type="button" id="choose-from-library-button" - type="button" class="<?php echo esc_attr( $classes_for_button ); ?>" data-alt-classes="<?php echo esc_attr( $classes_for_button_on_change ); ?>" data-size="512" From 64fd28839208e2c071a4fb84b5d4e878b55b3794 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <desrosj@git.wordpress.org> Date: Tue, 11 Feb 2025 16:55:00 +0000 Subject: [PATCH 321/323] Bundled Themes: Bump version of Twenty Twenty-Five to 1.1. Fixes #62943. git-svn-id: https://develop.svn.wordpress.org/trunk@59809 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-content/themes/twentytwentyfive/readme.txt | 11 ++++++++++- src/wp-content/themes/twentytwentyfive/style.css | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/wp-content/themes/twentytwentyfive/readme.txt b/src/wp-content/themes/twentytwentyfive/readme.txt index b4dc89e9c9fe6..91847f7f0f763 100644 --- a/src/wp-content/themes/twentytwentyfive/readme.txt +++ b/src/wp-content/themes/twentytwentyfive/readme.txt @@ -3,7 +3,7 @@ Contributors: wordpressdotorg Requires at least: 6.7 Tested up to: 6.7 Requires PHP: 7.2 -Stable tag: 1.0 +Stable tag: 1.1 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html @@ -14,6 +14,15 @@ Twenty Twenty-Five emphasizes simplicity and adaptability. It offers flexible de == Changelog == += 1.1 = +* Released: February 11, 2025 + +https://wordpress.org/documentation/article/twenty-twenty-five-changelog/#Version_1.1 + += 1.0 = +* Released: November 13, 2024 + +https://wordpress.org/documentation/article/twenty-twenty-five-changelog/#Version_1.0 == Copyright == diff --git a/src/wp-content/themes/twentytwentyfive/style.css b/src/wp-content/themes/twentytwentyfive/style.css index 2987eb14574a5..f51e5a5bb16bd 100644 --- a/src/wp-content/themes/twentytwentyfive/style.css +++ b/src/wp-content/themes/twentytwentyfive/style.css @@ -7,7 +7,7 @@ Description: Twenty Twenty-Five emphasizes simplicity and adaptability. It offer Requires at least: 6.7 Tested up to: 6.7 Requires PHP: 7.2 -Version: 1.0 +Version: 1.1 License: GNU General Public License v2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html Text Domain: twentytwentyfive From 8cc8eb5401867fd42868bd8677358800712bfc91 Mon Sep 17 00:00:00 2001 From: Weston Ruter <westonruter@git.wordpress.org> Date: Tue, 11 Feb 2025 20:02:29 +0000 Subject: [PATCH 322/323] HTML API: Stop counting no-op seek operations against the max seek count. This allows `seek()` to be freely called when the current cursor at the provided bookmark. Props dmsnell, jonsurrell, westonruter. Fixes #62085. git-svn-id: https://develop.svn.wordpress.org/trunk@59812 602fd350-edb4-49c9-b593-d223f7449a82 --- .../html-api/class-wp-html-tag-processor.php | 9 ++++ .../html-api/wpHtmlTagProcessor-bookmark.php | 41 +++++++++++++++++-- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/html-api/class-wp-html-tag-processor.php b/src/wp-includes/html-api/class-wp-html-tag-processor.php index 39390621e86a6..032ca2af32e57 100644 --- a/src/wp-includes/html-api/class-wp-html-tag-processor.php +++ b/src/wp-includes/html-api/class-wp-html-tag-processor.php @@ -2551,6 +2551,15 @@ public function seek( $bookmark_name ): bool { return false; } + $existing_bookmark = $this->bookmarks[ $bookmark_name ]; + + if ( + $this->token_starts_at === $existing_bookmark->start && + $this->token_length === $existing_bookmark->length + ) { + return true; + } + if ( ++$this->seek_count > static::MAX_SEEK_OPS ) { _doing_it_wrong( __METHOD__, diff --git a/tests/phpunit/tests/html-api/wpHtmlTagProcessor-bookmark.php b/tests/phpunit/tests/html-api/wpHtmlTagProcessor-bookmark.php index ad0cf68906245..0e72f9d726835 100644 --- a/tests/phpunit/tests/html-api/wpHtmlTagProcessor-bookmark.php +++ b/tests/phpunit/tests/html-api/wpHtmlTagProcessor-bookmark.php @@ -435,16 +435,49 @@ public function test_limits_the_number_of_bookmarks() { public function test_limits_the_number_of_seek_calls() { $processor = new WP_HTML_Tag_Processor( '<ul><li>One</li><li>Two</li><li>Three</li></ul>' ); $processor->next_tag( 'li' ); - $processor->set_bookmark( 'bookmark' ); - - for ( $i = 0; $i < WP_HTML_Tag_Processor::MAX_SEEK_OPS; $i++ ) { - $this->assertTrue( $processor->seek( 'bookmark' ), 'Could not seek to the "bookmark"' ); + $processor->set_bookmark( 'ping' ); + $processor->next_tag( 'li' ); + $processor->set_bookmark( 'pong' ); + + for ( $i = 0; $i < WP_HTML_Tag_Processor::MAX_SEEK_OPS; $i += 2 ) { + $this->assertTrue( + $processor->seek( 'ping' ), + 'Could not seek to the "ping": check test setup.' + ); + + $this->assertTrue( + $processor->seek( 'pong' ), + 'Could not seek to the "pong": check test setup.' + ); } $this->setExpectedIncorrectUsage( 'WP_HTML_Tag_Processor::seek' ); $this->assertFalse( $processor->seek( 'bookmark' ), "$i-th seek() to the bookmark succeeded, even though it should exceed the allowed limit" ); } + /** + * @ticket 62085 + * + * @covers WP_HTML_Tag_Processor::seek + */ + public function test_skips_counting_noop_seek_calls() { + $processor = new WP_HTML_Tag_Processor( '<ul><li>One</li><li>Two</li><li>Three</li></ul>' ); + $processor->next_tag( 'li' ); + $processor->set_bookmark( 'here' ); + + for ( $i = 0; $i < WP_HTML_Tag_Processor::MAX_SEEK_OPS; $i++ ) { + $this->assertTrue( + $processor->seek( 'here' ), + 'Could not seek to the "here": check test setup.' + ); + } + + $this->assertTrue( + $processor->seek( 'here' ), + 'Should never fail to seek if the seek is pointing at the current location.' + ); + } + /** * Ensures that it's possible to seek to an earlier location in a document even * after reaching the end of a document, when most functionality shuts down. From 108af60dafd3cd15d7533a59fa485eca6de63fad Mon Sep 17 00:00:00 2001 From: Jb Audras <audrasjb@git.wordpress.org> Date: Tue, 11 Feb 2025 21:05:00 +0000 Subject: [PATCH 323/323] Themes: Avoid double hashed value for `background-color` in custom backgrounds. This changeset replaces the hardcoded hash symbol with running `maybe_hash_hex_color()` on the full `background-color` value provided via the custom background feature, so the hash is only added if it is needed. By doing so, if a theme developer sets a background color value that uses a hash (#), WordPress won't add an additional hash anymore when outputting the relevant CSS. Duplicate hash symbols (##) can break CSS background color declarations. Props hovhanneshovakimyan, joyously, poena, Fixes #40057. git-svn-id: https://develop.svn.wordpress.org/trunk@59813 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/class-custom-background.php | 2 +- src/wp-includes/theme.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-admin/includes/class-custom-background.php b/src/wp-admin/includes/class-custom-background.php index d8500d8570405..8027c6a2ce95e 100644 --- a/src/wp-admin/includes/class-custom-background.php +++ b/src/wp-admin/includes/class-custom-background.php @@ -288,7 +288,7 @@ public function admin_page() { $background_styles = ''; $bgcolor = get_background_color(); if ( $bgcolor ) { - $background_styles .= 'background-color: #' . $bgcolor . ';'; + $background_styles .= 'background-color: ' . maybe_hash_hex_color( $bgcolor ) . ';'; } $background_image_thumb = get_background_image(); diff --git a/src/wp-includes/theme.php b/src/wp-includes/theme.php index 1a9b2479ad7e2..5b6824b4a1073 100644 --- a/src/wp-includes/theme.php +++ b/src/wp-includes/theme.php @@ -1893,7 +1893,7 @@ function _custom_background_cb() { return; } - $style = $color ? "background-color: #$color;" : ''; + $style = $color ? 'background-color: ' . maybe_hash_hex_color( $color ) . ';' : ''; if ( $background ) { $image = ' background-image: url("' . sanitize_url( $background ) . '");';