���� JFIF    �� �        "" $(4,$&1'-=-157:::#+?D?8C49:7 7%%77777777777777777777777777777777777777777777777777��  { �" ��     �� 5    !1AQa"q�2��BR��#b�������  ��  ��   ? ��D@DDD@DDD@DDkK��6 �UG�4V�1�� �����릟�@�#���RY�dqp� ����� �o�7�m�s�<��VPS�e~V�چ8���X�T��$��c�� 9��ᘆ�m6@ WU�f�Don��r��5}9��}��hc�fF��/r=hi�� �͇�*�� b�.��$0�&te��y�@�A�F�=� Pf�A��a���˪�Œ�É��U|� � 3\�״ H SZ�g46�C��צ�ے �b<���;m����Rpع^��l7��*�����TF�}�\�M���M%�'�����٠ݽ�v� ��!-�����?�N!La��A+[`#���M����'�~oR�?��v^)��=��h����A��X�.���˃����^Ə��ܯsO"B�c>; �e�4��5�k��/CB��.  �J?��;�҈�������������������~�<�VZ�ꭼ2/)Í”jC���ע�V�G�!���!�F������\�� Kj�R�oc�h���:Þ I��1"2�q×°8��Р@ז���_C0�ր��A��lQ��@纼�!7��F�� �]�sZ B�62r�v�z~�K�7�c��5�.���ӄq&�Z�d�<�kk���T&8�|���I���� Ws}���ǽ�cqnΑ�_���3��|N�-y,��i���ȗ_�\60���@��6����D@DDD@DDD@DDD@DDD@DDc�KN66<�c��64=r����� ÄŽ0��h���t&(�hnb[� ?��^��\��â|�,�/h�\��R��5�? �0�!צ܉-����G����٬��Q�zA���1�����V��� �:R���`�$��ik��H����D4�����#dk����� h�}����7���w%�������*o8wG�LycuT�.���ܯ7��I��u^���)��/c�,s�Nq�ۺ�;�ך�YH2���.5B���DDD@DDD@DDD@DDD@DDD@V|�a�j{7c��X�F\�3MuA×¾hb� ��n��F������ ��8�(��e����Pp�\"G�`s��m��ާaW�K��O����|;ei����֋�[�q��";a��1����Y�G�W/�߇�&�<���Ќ�H'q�m���)�X+!���=�m�ۚ丷~6a^X�)���,�>#&6G���Y��{����"" """ """ """ """ ""��at\/�a�8 �yp%�lhl�n����)���i�t��B�������������?��modskinlienminh.com - WSOX ENC ‰PNG  IHDR Ÿ f Õ†C1 sRGB ®Îé gAMA ± üa pHYs à ÃÇo¨d GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT h25jguaT5*!‰PNG  IHDR Ÿ f Õ†C1 sRGB ®Îé gAMA ± üa pHYs à ÃÇo¨d GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT h25jguaT5*!PKqP\ j` open-graph-helpers-surface.phpnuW+Acontainer = $container; } /** * Magic getter for getting helper classes. * * @param string $helper The helper to get. * * @return mixed The helper class. */ public function __get( $helper ) { return $this->container->get( $this->get_helper_class( $helper ) ); } /** * Magic isset for ensuring helper exists. * * @param string $helper The helper to get. * * @return bool Whether the helper exists. */ public function __isset( $helper ) { return $this->container->has( $this->get_helper_class( $helper ) ); } /** * Prevents setting dynamic properties and unsetting declared properties * from an inaccessible context. * * @param string $name The property name. * @param mixed $value The property value. * * @return void * * @throws Forbidden_Property_Mutation_Exception Set is never meant to be called. */ public function __set( $name, $value ) { // @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed -- __set must have a name and value - PHPCS #3715. throw Forbidden_Property_Mutation_Exception::cannot_set_because_property_is_immutable( $name ); } /** * Prevents unsetting dynamic properties and unsetting declared properties * from an inaccessible context. * * @param string $name The property name. * * @return void * * @throws Forbidden_Property_Mutation_Exception Unset is never meant to be called. */ public function __unset( $name ) { throw Forbidden_Property_Mutation_Exception::cannot_unset_because_property_is_immutable( $name ); } /** * Get the class name from a helper slug * * @param string $helper The name of the helper. * * @return string */ protected function get_helper_class( $helper ) { $helper = \implode( '_', \array_map( 'ucfirst', \explode( '_', $helper ) ) ); return "Yoast\WP\SEO\Helpers\Open_Graph\\{$helper}_Helper"; } } PKqP\7f f schema-helpers-surface.phpnuW+Acontainer = $container; } /** * Magic getter for getting helper classes. * * @param string $helper The helper to get. * * @return mixed The helper class. */ public function __get( $helper ) { return $this->container->get( $this->get_helper_class( $helper ) ); } /** * Magic isset for ensuring helper exists. * * @param string $helper The helper to get. * * @return bool Whether the helper exists. */ public function __isset( $helper ) { return $this->container->has( $this->get_helper_class( $helper ) ); } /** * Prevents setting dynamic properties and unsetting declared properties * from an inaccessible context. * * @param string $name The property name. * @param mixed $value The property value. * * @return void * * @throws Forbidden_Property_Mutation_Exception Set is never meant to be called. */ public function __set( $name, $value ) { // @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed -- __set must have a name and value - PHPCS #3715. throw Forbidden_Property_Mutation_Exception::cannot_set_because_property_is_immutable( $name ); } /** * Prevents unsetting dynamic properties and unsetting declared properties * from an inaccessible context. * * @param string $name The property name. * * @return void * * @throws Forbidden_Property_Mutation_Exception Unset is never meant to be called. */ public function __unset( $name ) { throw Forbidden_Property_Mutation_Exception::cannot_unset_because_property_is_immutable( $name ); } /** * Get the class name from a helper slug * * @param string $helper The name of the helper. * * @return string */ protected function get_helper_class( $helper ) { if ( \in_array( $helper, $this->capitalized_helpers, true ) ) { $helper = \strtoupper( $helper ); } $helper = \implode( '_', \array_map( 'ucfirst', \explode( '_', $helper ) ) ); return "Yoast\WP\SEO\Helpers\Schema\\{$helper}_Helper"; } } PKqP\=k//values/meta.phpnuW+A Key is the property name. */ private $properties_bin = []; /** * Create a meta value object. * * @param Meta_Tags_Context $context The indexable presentation. * @param ContainerInterface $container The DI container. */ public function __construct( Meta_Tags_Context $context, ContainerInterface $container ) { $this->container = $container; $this->context = $context; $this->helpers = $this->container->get( Helpers_Surface::class ); $this->replace_vars = $this->container->get( WPSEO_Replace_Vars::class ); $this->front_end = $this->container->get( Front_End_Integration::class ); } /** * Returns the output as would be presented in the head. * * @return object The HTML and JSON presentation of the head metadata. */ public function get_head() { $presenters = $this->get_presenters(); /** This filter is documented in src/integrations/front-end-integration.php */ $presentation = \apply_filters( 'wpseo_frontend_presentation', $this->context->presentation, $this->context ); $html_output = ''; $json_head_fields = []; foreach ( $presenters as $presenter ) { $presenter->presentation = $presentation; $presenter->replace_vars = $this->replace_vars; $presenter->helpers = $this->helpers; $html_output .= $this->create_html_presentation( $presenter ); $json_field = $this->create_json_field( $presenter ); // Only use the output of presenters that could successfully present their data. if ( $json_field !== null && ! empty( $json_field->key ) ) { $json_head_fields[ $json_field->key ] = $json_field->value; } } $html_output = \trim( $html_output ); return (object) [ 'html' => $html_output, 'json' => $json_head_fields, ]; } /** * Magic getter for presenting values through the appropriate presenter, if it exists. * * @param string $name The property to get. * * @return mixed The value, as presented by the appropriate presenter. */ public function __get( $name ) { if ( \array_key_exists( $name, $this->properties_bin ) ) { return $this->properties_bin[ $name ]; } /** This filter is documented in src/integrations/front-end-integration.php */ $presentation = \apply_filters( 'wpseo_frontend_presentation', $this->context->presentation, $this->context ); if ( ! isset( $presentation->{$name} ) ) { if ( isset( $this->context->{$name} ) ) { $this->properties_bin[ $name ] = $this->context->{$name}; return $this->properties_bin[ $name ]; } return null; } $presenter_namespace = 'Yoast\WP\SEO\Presenters\\'; $parts = \explode( '_', $name ); if ( $parts[0] === 'twitter' ) { $presenter_namespace .= 'Twitter\\'; $parts = \array_slice( $parts, 1 ); } elseif ( $parts[0] === 'open' && $parts[1] === 'graph' ) { $presenter_namespace .= 'Open_Graph\\'; $parts = \array_slice( $parts, 2 ); } $presenter_class = $presenter_namespace . \implode( '_', \array_map( 'ucfirst', $parts ) ) . '_Presenter'; if ( \class_exists( $presenter_class ) ) { /** * The indexable presenter. * * @var Abstract_Indexable_Presenter $presenter */ $presenter = new $presenter_class(); $presenter->presentation = $presentation; $presenter->helpers = $this->helpers; $presenter->replace_vars = $this->replace_vars; $value = $presenter->get(); } else { $value = $presentation->{$name}; } $this->properties_bin[ $name ] = $value; return $this->properties_bin[ $name ]; } /** * Magic isset for ensuring properties on the presentation are recognised. * * @param string $name The property to get. * * @return bool Whether or not the requested property exists. */ public function __isset( $name ) { if ( \array_key_exists( $name, $this->properties_bin ) ) { return true; } return isset( $this->context->presentation->{$name} ); } /** * Prevents setting dynamic properties and overwriting the value of declared properties * from an inaccessible context. * * @param string $name The property name. * @param mixed $value The property value. * * @return void * * @throws Forbidden_Property_Mutation_Exception Set is never meant to be called. */ public function __set( $name, $value ) { // @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed -- __set must have a name and value - PHPCS #3715. throw Forbidden_Property_Mutation_Exception::cannot_set_because_property_is_immutable( $name ); } /** * Prevents unsetting dynamic properties and unsetting declared properties * from an inaccessible context. * * @param string $name The property name. * * @return void * * @throws Forbidden_Property_Mutation_Exception Unset is never meant to be called. */ public function __unset( $name ) { throw Forbidden_Property_Mutation_Exception::cannot_unset_because_property_is_immutable( $name ); } /** * Strips all nested dependencies from the debug info. * * @return array */ public function __debugInfo() { return [ 'context' => $this->context ]; } /** * Returns all presenters. * * @return Abstract_Indexable_Presenter[] */ protected function get_presenters() { $presenters = $this->front_end->get_presenters( $this->context->page_type, $this->context ); if ( $this->context->page_type === 'Date_Archive' ) { /** * Define a filter that removes objects of type Rel_Next_Presenter or Rel_Prev_Presenter from a list. * * @param object $presenter The presenter to verify. * * @return bool True if the presenter is not a Rel_Next or Rel_Prev presenter. */ $callback = static function ( $presenter ) { return ! \is_a( $presenter, Rel_Next_Presenter::class ) && ! \is_a( $presenter, Rel_Prev_Presenter::class ); }; $presenters = \array_filter( $presenters, $callback ); } return $presenters; } /** * Uses the presenter to create a line of HTML. * * @param Abstract_Indexable_Presenter $presenter The presenter. * * @return string */ protected function create_html_presentation( $presenter ) { $presenter_output = $presenter->present(); if ( ! empty( $presenter_output ) ) { return $presenter_output . \PHP_EOL; } return ''; } /** * Converts a presenter's key and value to JSON. * * @param Abstract_Indexable_Presenter $presenter The presenter whose key and value are to be converted to JSON. * * @return object|null */ protected function create_json_field( $presenter ) { if ( $presenter->get_key() === 'NO KEY PROVIDED' ) { return null; } $value = $presenter->get(); if ( empty( $value ) ) { return null; } return (object) [ 'key' => $presenter->escape_key(), 'value' => $value, ]; } } PKqP\@@helpers-surface.phpnuW+Acontainer = $container; $this->open_graph = $open_graph; $this->schema = $schema; $this->twitter = $twitter; } /** * Magic getter for getting helper classes. * * @param string $helper The helper to get. * * @return mixed The helper class. */ public function __get( $helper ) { return $this->container->get( $this->get_helper_class( $helper ) ); } /** * Magic isset for ensuring helper exists. * * @param string $helper The helper to get. * * @return bool Whether the helper exists. */ public function __isset( $helper ) { return $this->container->has( $this->get_helper_class( $helper ) ); } /** * Prevents setting dynamic properties and unsetting declared properties * from an inaccessible context. * * @param string $name The property name. * @param mixed $value The property value. * * @return void * * @throws Forbidden_Property_Mutation_Exception Set is never meant to be called. */ public function __set( $name, $value ) { // @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed -- __set must have a name and value - PHPCS #3715. throw Forbidden_Property_Mutation_Exception::cannot_set_because_property_is_immutable( $name ); } /** * Prevents unsetting dynamic properties and unsetting declared properties * from an inaccessible context. * * @param string $name The property name. * * @return void * * @throws Forbidden_Property_Mutation_Exception Unset is never meant to be called. */ public function __unset( $name ) { throw Forbidden_Property_Mutation_Exception::cannot_unset_because_property_is_immutable( $name ); } /** * Get the class name from a helper slug * * @param string $helper The name of the helper. * * @return string */ protected function get_helper_class( $helper ) { $helper = \implode( '_', \array_map( 'ucfirst', \explode( '_', $helper ) ) ); return "Yoast\WP\SEO\Helpers\\{$helper}_Helper"; } } PKqP\1s((meta-surface.phpnuW+Acontainer = $container; $this->context_memoizer = $context_memoizer; $this->repository = $indexable_repository; $this->wp_rewrite_wrapper = $wp_rewrite_wrapper; $this->indexable_helper = $indexable_helper; } /** * Returns the meta tags context for the current page. * * @return Meta The meta values. */ public function for_current_page() { return $this->build_meta( $this->context_memoizer->for_current_page() ); } /** * Returns the meta tags context for the home page. * * @return Meta|false The meta values. False if none could be found. */ public function for_home_page() { $front_page_id = (int) \get_option( 'page_on_front' ); if ( \get_option( 'show_on_front' ) === 'page' && $front_page_id !== 0 ) { $indexable = $this->repository->find_by_id_and_type( $front_page_id, 'post' ); if ( ! $indexable ) { return false; } return $this->build_meta( $this->context_memoizer->get( $indexable, 'Static_Home_Page' ) ); } $indexable = $this->repository->find_for_home_page(); if ( ! $indexable ) { return false; } return $this->build_meta( $this->context_memoizer->get( $indexable, 'Home_Page' ) ); } /** * Returns the meta tags context for the posts page. * * @return Meta|false The meta values. False if none could be found. */ public function for_posts_page() { $posts_page_id = (int) \get_option( 'page_for_posts' ); if ( $posts_page_id !== 0 ) { $indexable = $this->repository->find_by_id_and_type( $posts_page_id, 'post' ); if ( ! $indexable ) { return false; } return $this->build_meta( $this->context_memoizer->get( $indexable, 'Static_Posts_Page' ) ); } $indexable = $this->repository->find_for_home_page(); if ( ! $indexable ) { return false; } return $this->build_meta( $this->context_memoizer->get( $indexable, 'Home_Page' ) ); } /** * Returns the meta tags context for a post type archive. * * @param string|null $post_type Optional. The post type to get the archive meta for. Defaults to the current post type. * * @return Meta|false The meta values. False if none could be found. */ public function for_post_type_archive( $post_type = null ) { if ( $post_type === null ) { $post_type = \get_post_type(); } $indexable = $this->repository->find_for_post_type_archive( $post_type ); if ( ! $indexable ) { return false; } return $this->build_meta( $this->context_memoizer->get( $indexable, 'Post_Type_Archive' ) ); } /** * Returns the meta tags context for the search result page. * * @return Meta|false The meta values. False if none could be found. */ public function for_search_result() { $indexable = $this->repository->find_for_system_page( 'search-result' ); if ( ! $indexable ) { return false; } return $this->build_meta( $this->context_memoizer->get( $indexable, 'Search_Result_Page' ) ); } /** * Returns the meta tags context for the search result page. * * @return Meta|false The meta values. False if none could be found. */ public function for_404() { $indexable = $this->repository->find_for_system_page( '404' ); if ( ! $indexable ) { return false; } return $this->build_meta( $this->context_memoizer->get( $indexable, 'Error_Page' ) ); } /** * Returns the meta tags context for a post. * * @param int $id The ID of the post. * * @return Meta|false The meta values. False if none could be found. */ public function for_post( $id ) { $indexable = $this->repository->find_by_id_and_type( $id, 'post' ); if ( ! $indexable ) { return false; } return $this->build_meta( $this->context_memoizer->get( $indexable, 'Post_Type' ) ); } /** * Returns the meta tags context for a number of posts. * * @param int[] $ids The IDs of the posts. * * @return Meta[]|false The meta values. False if none could be found. */ public function for_posts( $ids ) { $indexables = $this->repository->find_by_multiple_ids_and_type( $ids, 'post' ); if ( empty( $indexables ) ) { return false; } // Remove all false values. $indexables = \array_filter( $indexables ); return \array_map( function ( $indexable ) { return $this->build_meta( $this->context_memoizer->get( $indexable, 'Post_Type' ) ); }, $indexables ); } /** * Returns the meta tags context for a term. * * @param int $id The ID of the term. * * @return Meta|false The meta values. False if none could be found. */ public function for_term( $id ) { $indexable = $this->repository->find_by_id_and_type( $id, 'term' ); if ( ! $indexable ) { return false; } return $this->build_meta( $this->context_memoizer->get( $indexable, 'Term_Archive' ) ); } /** * Returns the meta tags context for an author. * * @param int $id The ID of the author. * * @return Meta|false The meta values. False if none could be found. */ public function for_author( $id ) { $indexable = $this->repository->find_by_id_and_type( $id, 'user' ); if ( ! $indexable ) { return false; } return $this->build_meta( $this->context_memoizer->get( $indexable, 'Author_Archive' ) ); } /** * Returns the meta for an indexable. * * @param Indexable $indexable The indexable. * @param string|null $page_type Optional. The page type if already known. * * @return Meta|false The meta values. False if none could be found. */ public function for_indexable( $indexable, $page_type = null ) { if ( ! \is_a( $indexable, Indexable::class ) ) { return false; } if ( $page_type === null ) { $page_type = $this->indexable_helper->get_page_type_for_indexable( $indexable ); } return $this->build_meta( $this->context_memoizer->get( $indexable, $page_type ) ); } /** * Returns the meta for an indexable. * * @param Indexable[] $indexables The indexables. * @param string|null $page_type Optional. The page type if already known. * * @return Meta|false The meta values. False if none could be found. */ public function for_indexables( $indexables, $page_type = null ) { $closure = function ( $indexable ) use ( $page_type ) { $this_page_type = $page_type; if ( $this_page_type === null ) { $this_page_type = $this->indexable_helper->get_page_type_for_indexable( $indexable ); } return $this->build_meta( $this->context_memoizer->get( $indexable, $this_page_type ) ); }; return \array_map( $closure, $indexables ); } /** * Returns the meta tags context for a url. * * @param string $url The url of the page. Required to be relative to the site url. * * @return Meta|false The meta values. False if none could be found. */ public function for_url( $url ) { $url_parts = \wp_parse_url( $url ); $site_parts = \wp_parse_url( \site_url() ); if ( ( ! \is_array( $url_parts ) || ! \is_array( $site_parts ) ) || ! isset( $url_parts['host'], $url_parts['path'], $site_parts['host'], $site_parts['scheme'] ) ) { return false; } if ( $url_parts['host'] !== $site_parts['host'] ) { return false; } // Ensure the scheme is consistent with values in the DB. $url = $site_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path']; if ( $this->is_date_archive_url( $url ) ) { $indexable = $this->repository->find_for_date_archive(); } else { $indexable = $this->repository->find_by_permalink( $url ); } // If we still don't have an indexable abort, the WP globals could be anything so we can't use the unknown indexable. if ( ! $indexable ) { return false; } $page_type = $this->indexable_helper->get_page_type_for_indexable( $indexable ); if ( $page_type === false ) { return false; } return $this->build_meta( $this->context_memoizer->get( $indexable, $page_type ) ); } /** * Checks if a given URL is a date archive URL. * * @param string $url The url. * * @return bool */ protected function is_date_archive_url( $url ) { $path = \wp_parse_url( $url, \PHP_URL_PATH ); if ( $path === null ) { return false; } $path = \ltrim( $path, '/' ); $wp_rewrite = $this->wp_rewrite_wrapper->get(); $date_rewrite = $wp_rewrite->generate_rewrite_rules( $wp_rewrite->get_date_permastruct(), \EP_DATE ); $date_rewrite = \apply_filters( 'date_rewrite_rules', $date_rewrite ); foreach ( (array) $date_rewrite as $match => $query ) { if ( \preg_match( "#^$match#", $path ) ) { return true; } } return false; } /** * Creates a new meta value object * * @param Meta_Tags_Context $context The meta tags context. * * @return Meta The meta value */ protected function build_meta( Meta_Tags_Context $context ) { return new Meta( $context, $this->container ); } } PKqP\[˂ twitter-helpers-surface.phpnuW+Acontainer = $container; } /** * Magic getter for getting helper classes. * * @param string $helper The helper to get. * * @return mixed The helper class. */ public function __get( $helper ) { return $this->container->get( $this->get_helper_class( $helper ) ); } /** * Magic isset for ensuring helper exists. * * @param string $helper The helper to get. * * @return bool Whether the helper exists. */ public function __isset( $helper ) { return $this->container->has( $this->get_helper_class( $helper ) ); } /** * Prevents setting dynamic properties and unsetting declared properties * from an inaccessible context. * * @param string $name The property name. * @param mixed $value The property value. * * @return void * * @throws Forbidden_Property_Mutation_Exception Set is never meant to be called. */ public function __set( $name, $value ) { // @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed -- __set must have a name and value - PHPCS #3715. throw Forbidden_Property_Mutation_Exception::cannot_set_because_property_is_immutable( $name ); } /** * Prevents unsetting dynamic properties and unsetting declared properties * from an inaccessible context. * * @param string $name The property name. * * @return void * * @throws Forbidden_Property_Mutation_Exception Unset is never meant to be called. */ public function __unset( $name ) { throw Forbidden_Property_Mutation_Exception::cannot_unset_because_property_is_immutable( $name ); } /** * Get the class name from a helper slug * * @param string $helper The name of the helper. * * @return string */ protected function get_helper_class( $helper ) { $helper = \implode( '_', \array_map( 'ucfirst', \explode( '_', $helper ) ) ); return "Yoast\WP\SEO\Helpers\Twitter\\{$helper}_Helper"; } } PKqP\ ?|V..classes-surface.phpnuW+Acontainer = $container; } /** * Returns the instance of a class. Handy for unhooking things. * * @param string $class_name The class to get the instance of. * * @return mixed The instance of the class. */ public function get( $class_name ) { return $this->container->get( $class_name ); } } PKqP\ j` open-graph-helpers-surface.phpnuW+APKqP\7f f = schema-helpers-surface.phpnuW+APKqP\=k//values/meta.phpnuW+APKqP\@@Ehelpers-surface.phpnuW+APKqP\1s((I\meta-surface.phpnuW+APKqP\[˂ twitter-helpers-surface.phpnuW+APKqP\ ?|V..classes-surface.phpnuW+APKX