eft { float: left; margin-right: 2em; }'; $css .= '.wp-site-blocks > .alignright { float: right; margin-left: 2em; }'; $css .= '.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }'; // Block gap styles will be output unless explicitly set to `null`. See static::PROTECTED_PROPERTIES. if ( isset( $this->theme_json['settings']['spacing']['blockGap'] ) ) { $block_gap_value = static::get_property_value( $this->theme_json, array( 'styles', 'spacing', 'blockGap' ) ); $css .= ":where(.wp-site-blocks) > * { margin-block-start: $block_gap_value; margin-block-end: 0; }"; $css .= ':where(.wp-site-blocks) > :first-child { margin-block-start: 0; }'; $css .= ':where(.wp-site-blocks) > :last-child { margin-block-end: 0; }'; // For backwards compatibility, ensure the legacy block gap CSS variable is still available. $css .= static::ROOT_CSS_PROPERTIES_SELECTOR . " { --wp--style--block-gap: $block_gap_value; }"; } $css .= $this->get_layout_styles( $block_metadata ); return $css; } /** * For metadata values that can either be booleans or paths to booleans, gets the value. * * $data = array( * 'color' => array( * 'defaultPalette' => true * ) * ); * * static::get_metadata_boolean( $data, false ); * // => false * * static::get_metadata_boolean( $data, array( 'color', 'defaultPalette' ) ); * // => true * * @since 6.0.0 * * @param array $data The data to inspect. * @param bool|array $path Boolean or path to a boolean. * @param bool $default_value Default value if the referenced path is missing. * Default false. * @return bool Value of boolean metadata. */ protected static function get_metadata_boolean( $data, $path, $default_value = false ) { if ( is_bool( $path ) ) { return $path; } if ( is_array( $path ) ) { $value = _wp_array_get( $data, $path ); if ( null !== $value ) { return $value; } } return $default_value; } /** * Merges new incoming data. * * @since 5.8.0 * @since 5.9.0 Duotone preset also has origins. * @since 6.7.0 Replace background image objects during merge. * * @param WP_Theme_JSON $incoming Data to merge. */ public function merge( $incoming ) { $incoming_data = $incoming->get_raw_data(); $this->theme_json = array_replace_recursive( $this->theme_json, $incoming_data ); /* * Recompute all the spacing sizes based on the new hierarchy of data. In the constructor * spacingScale and spacingSizes are both keyed by origin and VALID_ORIGINS is ordered, so * we can allow partial spacingScale data to inherit missing data from earlier layers when * computing the spacing sizes. * * This happens before the presets are merged to ensure that default spacing sizes can be * removed from the theme origin if $prevent_override is true. */ $flattened_spacing_scale = array(); foreach ( static::VALID_ORIGINS as $origin ) { $scale_path = array( 'settings', 'spacing', 'spacingScale', $origin ); // Apply the base spacing scale to the current layer. $base_spacing_scale = _wp_array_get( $this->theme_json, $scale_path, array() ); $flattened_spacing_scale = array_replace( $flattened_spacing_scale, $base_spacing_scale ); $spacing_scale = _wp_array_get( $incoming_data, $scale_path, null ); if ( ! isset( $spacing_scale ) ) { continue; } // Allow partial scale settings by merging with lower layers. $flattened_spacing_scale = array_replace( $flattened_spacing_scale, $spacing_scale ); // Generate and merge the scales for this layer. $sizes_path = array( 'settings', 'spacing', 'spacingSizes', $origin ); $spacing_sizes = _wp_array_get( $incoming_data, $sizes_path, array() ); $spacing_scale_sizes = static::compute_spacing_sizes( $flattened_spacing_scale ); $merged_spacing_sizes = static::merge_spacing_sizes( $spacing_scale_sizes, $spacing_sizes ); _wp_array_set( $incoming_data, $sizes_path, $merged_spacing_sizes ); } /* * The array_replace_recursive algorithm merges at the leaf level, * but we don't want leaf arrays to be merged, so we overwrite it. * * For leaf values that are sequential arrays it will use the numeric indexes for replacement. * We rather replace the existing with the incoming value, if it exists. * This is the case of spacing.units. * * For leaf values that are associative arrays it will merge them as expected. * This is also not the behavior we want for the current associative arrays (presets). * We rather replace the existing with the incoming value, if it exists. * This happens, for example, when we merge data from theme.json upon existing * theme supports or when we merge anything coming from the same source twice. * This is the case of color.palette, color.gradients, color.duotone, * typography.fontSizes, or typography.fontFamilies. * * Additionally, for some preset types, we also want to make sure the * values they introduce don't conflict with default values. We do so * by checking the incoming slugs for theme presets and compare them * with the equivalent default presets: if a slug is present as a default * we remove it from the theme presets. */ $nodes = static::get_setting_nodes( $incoming_data ); $slugs_global = static::get_default_slugs( $this->theme_json, array( 'settings' ) ); foreach ( $nodes as $node ) { // Replace the spacing.units. $path = $node['path']; $path[] = 'spacing'; $path[] = 'units'; $content = _wp_array_get( $incoming_data, $path, null ); if ( isset( $content ) ) { _wp_array_set( $this->theme_json, $path, $content ); } // Replace the presets. foreach ( static::PRESETS_METADATA as $preset_metadata ) { $prevent_override = $preset_metadata['prevent_override']; if ( is_array( $prevent_override ) ) { $global_path = array_merge( array( 'settings' ), $prevent_override ); $global_value = _wp_array_get( $this->theme_json, $global_path, null ); $node_level_path = array_merge( $node['path'], $prevent_override ); $prevent_override = _wp_array_get( $this->theme_json, $node_level_path, $global_value ); } foreach ( static::VALID_ORIGINS as $origin ) { $base_path = $node['path']; foreach ( $preset_metadata['path'] as $leaf ) { $base_path[] = $leaf; } $path = $base_path; $path[] = $origin; $content = _wp_array_get( $incoming_data, $path, null ); if ( ! isset( $content ) ) { continue; } // Set names for theme presets based on the slug if they are not set and can use default names. if ( 'theme' === $origin && $preset_metadata['use_default_names'] ) { foreach ( $content as $key => $item ) { if ( ! isset( $item['name'] ) ) { $name = static::get_name_from_defaults( $item['slug'], $base_path ); if ( null !== $name ) { $content[ $key ]['name'] = $name; } } } } // Filter out default slugs from theme presets when defaults should not be overridden. if ( 'theme' === $origin && $prevent_override ) { $slugs_node = static::get_default_slugs( $this->theme_json, $node['path'] ); $preset_global = _wp_array_get( $slugs_global, $preset_metadata['path'], array() ); $preset_node = _wp_array_get( $slugs_node, $preset_metadata['path'], array() ); $preset_slugs = array_merge_recursive( $preset_global, $preset_node ); $content = static::filter_slugs( $content, $preset_slugs ); } _wp_array_set( $this->theme_json, $path, $content ); } } } /* * Style values are merged at the leaf level, however * some values provide exceptions, namely style values that are * objects and represent unique definitions for the style. */ $style_nodes = static::get_block_nodes( $this->theme_json, array(), array( 'include_node_paths_only' => true ) ); // Add top-level styles. $style_nodes[] = array( 'path' => array( 'styles' ) ); foreach ( $style_nodes as $style_node ) { $path = $style_node['path']; /* * Background image styles should be replaced, not merged, * as they themselves are specific object definitions for the style. */ $background_image_path = array_merge( $path, static::PROPERTIES_METADATA['background-image'] ); $content = _wp_array_get( $incoming_data, $background_image_path, null ); if ( isset( $content ) ) { _wp_array_set( $this->theme_json, $background_image_path, $content ); } } } /** * Converts all filter (duotone) presets into SVGs. * * @since 5.9.1 * * @param array $origins List of origins to process. * @return string SVG filters. */ public function get_svg_filters( $origins ) { $blocks_metadata = static::get_blocks_metadata(); $setting_nodes = static::get_setting_nodes( $this->theme_json, $blocks_metadata ); $filters = ''; foreach ( $setting_nodes as $metadata ) { $node = _wp_array_get( $this->theme_json, $metadata['path'], array() ); if ( empty( $node['color']['duotone'] ) ) { continue; } $duotone_presets = $node['color']['duotone']; foreach ( $origins as $origin ) { if ( ! isset( $duotone_presets[ $origin ] ) ) { continue; } foreach ( $duotone_presets[ $origin ] as $duotone_preset ) { $filters .= WP_Duotone::get_filter_svg_from_preset( $duotone_preset ); } } } return $filters; } /** * Determines whether a presets should be overridden or not. * * @since 5.9.0 * @deprecated 6.0.0 Use {@see 'get_metadata_boolean'} instead. * * @param array $theme_json The theme.json like structure to inspect. * @param array $path Path to inspect. * @param bool|array $override Data to compute whether to override the preset. * @return bool */ protected static function should_override_preset( $theme_json, $path, $override ) { _deprecated_function( __METHOD__, '6.0.0', 'get_metadata_boolean' ); if ( is_bool( $override ) ) { return $override; } /* * The relationship between whether to override the defaults * and whether the defaults are enabled is inverse: * * - If defaults are enabled => theme presets should not be overridden * - If defaults are disabled => theme presets should be overridden * * For example, a theme sets defaultPalette to false, * making the default palette hidden from the user. * In that case, we want all the theme presets to be present, * so they should override the defaults. */ if ( is_array( $override ) ) { $value = _wp_array_get( $theme_json, array_merge( $path, $override ) ); if ( isset( $value ) ) { return ! $value; } // Search the top-level key if none was found for this node. $value = _wp_array_get( $theme_json, array_merge( array( 'settings' ), $override ) ); if ( isset( $value ) ) { return ! $value; } return true; } } /** * Returns the default slugs for all the presets in an associative array * whose keys are the preset paths and the leaves is the list of slugs. * * For example: * * array( * 'color' => array( * 'palette' => array( 'slug-1', 'slug-2' ), * 'gradients' => array( 'slug-3', 'slug-4' ), * ), * ) * * @since 5.9.0 * * @param array $data A theme.json like structure. * @param array $node_path The path to inspect. It's 'settings' by default. * @return array */ protected static function get_default_slugs( $data, $node_path ) { $slugs = array(); foreach ( static::PRESETS_METADATA as $metadata ) { $path = $node_path; foreach ( $metadata['path'] as $leaf ) { $path[] = $leaf; } $path[] = 'default'; $preset = _wp_array_get( $data, $path, null ); if ( ! isset( $preset ) ) { continue; } $slugs_for_preset = array(); foreach ( $preset as $item ) { if ( isset( $item['slug'] ) ) { $slugs_for_preset[] = $item['slug']; } } _wp_array_set( $slugs, $metadata['path'], $slugs_for_preset ); } return $slugs; } /** * Gets a `default`'s preset name by a provided slug. * * @since 5.9.0 * * @param string $slug The slug we want to find a match from default presets. * @param array $base_path The path to inspect. It's 'settings' by default. * @return string|null */ protected function get_name_from_defaults( $slug, $base_path ) { $path = $base_path; $path[] = 'default'; $default_content = _wp_array_get( $this->theme_json, $path, null ); if ( ! $default_content ) { return null; } foreach ( $default_content as $item ) { if ( $slug === $item['slug'] ) { return $item['name']; } } return null; } /** * Removes the preset values whose slug is equal to any of given slugs. * * @since 5.9.0 * * @param array $node The node with the presets to validate. * @param array $slugs The slugs that should not be overridden. * @return array The new node. */ protected static function filter_slugs( $node, $slugs ) { if ( empty( $slugs ) ) { return $node; } $new_node = array(); foreach ( $node as $value ) { if ( isset( $value['slug'] ) && ! in_array( $value['slug'], $slugs, true ) ) { $new_node[] = $value; } } return $new_node; } /** * Removes insecure data from theme.json. * * @since 5.9.0 * @since 6.3.2 Preserves global styles block variations when securing styles. * @since 6.6.0 Updated to allow variation element styles and $origin parameter. * * @param array $theme_json Structure to sanitize. * @param string $origin Optional. What source of data this object represents. * One of 'blocks', 'default', 'theme', or 'custom'. Default 'theme'. * @return array Sanitized structure. */ public static function remove_insecure_properties( $theme_json, $origin = 'theme' ) { if ( ! in_array( $origin, static::VALID_ORIGINS, true ) ) { $origin = 'theme'; } $sanitized = array(); $theme_json = WP_Theme_JSON_Schema::migrate( $theme_json, $origin ); $blocks_metadata = static::get_blocks_metadata(); $valid_block_names = array_keys( $blocks_metadata ); $valid_element_names = array_keys( static::ELEMENTS ); $valid_variations = static::get_valid_block_style_variations( $blocks_metadata ); $theme_json = static::sanitize( $theme_json, $valid_block_names, $valid_element_names, $valid_variations ); $blocks_metadata = static::get_blocks_metadata(); $style_options = array( 'include_block_style_variations' => true ); // Allow variations data. $style_nodes = static::get_style_nodes( $theme_json, $blocks_metadata, $style_options ); foreach ( $style_nodes as $metadata ) { $input = _wp_array_get( $theme_json, $metadata['path'], array() ); if ( empty( $input ) ) { continue; } // The global styles custom CSS is not sanitized, but can only be edited by users with 'edit_css' capability. if ( isset( $input['css'] ) && current_user_can( 'edit_css' ) ) { $output = $input; } else { $output = static::remove_insecure_styles( $input ); } /* * Get a reference to element name from path. * $metadata['path'] = array( 'styles', 'elements', 'link' ); */ $current_element = $metadata['path'][ count( $metadata['path'] ) - 1 ]; /* * $output is stripped of pseudo selectors. Re-add and process them * or insecure styles here. */ if ( isset( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $current_element ] ) ) { foreach ( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $current_element ] as $pseudo_selector ) { if ( isset( $input[ $pseudo_selector ] ) ) { $output[ $pseudo_selector ] = static::remove_insecure_styles( $input[ $pseudo_selector ] ); } } } if ( ! empty( $output ) ) { _wp_array_set( $sanitized, $metadata['path'], $output ); } if ( isset( $metadata['variations'] ) ) { foreach ( $metadata['variations'] as $variation ) { $variation_input = _wp_array_get( $theme_json, $variation['path'], array() ); if ( empty( $variation_input ) ) { continue; } $variation_output = static::remove_insecure_styles( $variation_input ); if ( isset( $variation_input['blocks'] ) ) { $variation_output['blocks'] = static::remove_insecure_inner_block_styles( $variation_input['blocks'] ); } if ( isset( $variation_input['elements'] ) ) { $variation_output['elements'] = static::remove_insecure_element_styles( $variation_input['elements'] ); } if ( ! empty( $variation_output ) ) { _wp_array_set( $sanitized, $variation['path'], $variation_output ); } } } } $setting_nodes = static::get_setting_nodes( $theme_json ); foreach ( $setting_nodes as $metadata ) { $input = _wp_array_get( $theme_json, $metadata['path'], array() ); if ( empty( $input ) ) { continue; } $output = static::remove_insecure_settings( $input ); if ( ! empty( $output ) ) { _wp_array_set( $sanitized, $metadata['path'], $output ); } } if ( empty( $sanitized['styles'] ) ) { unset( $theme_json['styles'] ); } else { $theme_json['styles'] = $sanitized['styles']; } if ( empty( $sanitized['settings'] ) ) { unset( $theme_json['settings'] ); } else { $theme_json['settings'] = $sanitized['settings']; } 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. * * @since 5.9.0 * * @param array $input Node to process. * @return array */ protected static function remove_insecure_settings( $input ) { $output = array(); foreach ( static::PRESETS_METADATA as $preset_metadata ) { foreach ( static::VALID_ORIGINS as $origin ) { $path_with_origin = $preset_metadata['path']; $path_with_origin[] = $origin; $presets = _wp_array_get( $input, $path_with_origin, null ); if ( null === $presets ) { continue; } $escaped_preset = array(); foreach ( $presets as $preset ) { if ( esc_attr( esc_html( $preset['name'] ) ) === $preset['name'] && sanitize_html_class( $preset['slug'] ) === $preset['slug'] ) { $value = null; if ( isset( $preset_metadata['value_key'], $preset[ $preset_metadata['value_key'] ] ) ) { $value = $preset[ $preset_metadata['value_key'] ]; } elseif ( isset( $preset_metadata['value_func'] ) && is_callable( $preset_metadata['value_func'] ) ) { $value = call_user_func( $preset_metadata['value_func'], $preset ); } $preset_is_valid = true; foreach ( $preset_metadata['properties'] as $property ) { if ( ! static::is_safe_css_declaration( $property, $value ) ) { $preset_is_valid = false; break; } } if ( $preset_is_valid ) { $escaped_preset[] = $preset; } } } if ( ! empty( $escaped_preset ) ) { _wp_array_set( $output, $path_with_origin, $escaped_preset ); } } } // Ensure indirect properties not included in any `PRESETS_METADATA` value are allowed. static::remove_indirect_properties( $input, $output ); return $output; } /** * Processes a style node and returns the same node * without the insecure styles. * * @since 5.9.0 * * @param array $input Node to process. * @return array */ protected static function remove_insecure_styles( $input ) { $output = array(); $declarations = static::compute_style_properties( $input ); foreach ( $declarations as $declaration ) { if ( static::is_safe_css_declaration( $declaration['name'], $declaration['value'] ) ) { $path = static::PROPERTIES_METADATA[ $declaration['name'] ]; /* * Check the value isn't an array before adding so as to not * double up shorthand and longhand styles. */ $value = _wp_array_get( $input, $path, array() ); if ( ! is_array( $value ) ) { _wp_array_set( $output, $path, $value ); } } } // Ensure indirect properties not handled by `compute_style_properties` are allowed. static::remove_indirect_properties( $input, $output ); return $output; } /** * Checks that a declaration provided by the user is safe. * * @since 5.9.0 * * @param string $property_name Property name in a CSS declaration, i.e. the `color` in `color: red`. * @param string $property_value Value in a CSS declaration, i.e. the `red` in `color: red`. * @return bool */ protected static function is_safe_css_declaration( $property_name, $property_value ) { $style_to_validate = $property_name . ': ' . $property_value; $filtered = esc_html( safecss_filter_attr( $style_to_validate ) ); return ! empty( trim( $filtered ) ); } /** * Removes indirect properties from the given input node and * sets in the given output node. * * @since 6.2.0 * * @param array $input Node to process. * @param array $output The processed node. Passed by reference. */ private static function remove_indirect_properties( $input, &$output ) { foreach ( static::INDIRECT_PROPERTIES_METADATA as $property => $paths ) { foreach ( $paths as $path ) { $value = _wp_array_get( $input, $path ); if ( is_string( $value ) && static::is_safe_css_declaration( $property, $value ) ) { _wp_array_set( $output, $path, $value ); } } } } /** * Returns the raw data. * * @since 5.8.0 * * @return array Raw data. */ public function get_raw_data() { return $this->theme_json; } /** * Transforms the given editor settings according the * add_theme_support format to the theme.json format. * * @since 5.8.0 * * @param array $settings Existing editor settings. * @return array Config that adheres to the theme.json schema. */ public static function get_from_editor_settings( $settings ) { $theme_settings = array( 'version' => static::LATEST_SCHEMA, 'settings' => array(), ); // Deprecated theme supports. if ( isset( $settings['disableCustomColors'] ) ) { $theme_settings['settings']['color']['custom'] = ! $settings['disableCustomColors']; } if ( isset( $settings['disableCustomGradients'] ) ) { $theme_settings['settings']['color']['customGradient'] = ! $settings['disableCustomGradients']; } if ( isset( $settings['disableCustomFontSizes'] ) ) { $theme_settings['settings']['typography']['customFontSize'] = ! $settings['disableCustomFontSizes']; } if ( isset( $settings['enableCustomLineHeight'] ) ) { $theme_settings['settings']['typography']['lineHeight'] = $settings['enableCustomLineHeight']; } if ( isset( $settings['enableCustomUnits'] ) ) { $theme_settings['settings']['spacing']['units'] = ( true === $settings['enableCustomUnits'] ) ? array( 'px', 'em', 'rem', 'vh', 'vw', '%' ) : $settings['enableCustomUnits']; } if ( isset( $settings['colors'] ) ) { $theme_settings['settings']['color']['palette'] = $settings['colors']; } if ( isset( $settings['gradients'] ) ) { $theme_settings['settings']['color']['gradients'] = $settings['gradients']; } if ( isset( $settings['fontSizes'] ) ) { $font_sizes = $settings['fontSizes']; // Back-compatibility for presets without units. foreach ( $font_sizes as $key => $font_size ) { if ( is_numeric( $font_size['size'] ) ) { $font_sizes[ $key ]['size'] = $font_size['size'] . 'px'; } } $theme_settings['settings']['typography']['fontSizes'] = $font_sizes; } if ( isset( $settings['enableCustomSpacing'] ) ) { $theme_settings['settings']['spacing']['padding'] = $settings['enableCustomSpacing']; } if ( isset( $settings['spacingSizes'] ) ) { $theme_settings['settings']['spacing']['spacingSizes'] = $settings['spacingSizes']; } return $theme_settings; } /** * Returns the current theme's wanted patterns(slugs) to be * registered from Pattern Directory. * * @since 6.0.0 * * @return string[] */ public function get_patterns() { if ( isset( $this->theme_json['patterns'] ) && is_array( $this->theme_json['patterns'] ) ) { return $this->theme_json['patterns']; } return array(); } /** * Returns a valid theme.json as provided by a theme. * * Unlike get_raw_data() this returns the presets flattened, as provided by a theme. * This also uses appearanceTools instead of their opt-ins if all of them are true. * * @since 6.0.0 * * @return array */ public function get_data() { $output = $this->theme_json; $nodes = static::get_setting_nodes( $output ); /** * Flatten the theme & custom origins into a single one. * * For example, the following: * * { * "settings": { * "color": { * "palette": { * "theme": [ {} ], * "custom": [ {} ] * } * } * } * } * * will be converted to: * * { * "settings": { * "color": { * "palette": [ {} ] * } * } * } */ foreach ( $nodes as $node ) { foreach ( static::PRESETS_METADATA as $preset_metadata ) { $path = $node['path']; foreach ( $preset_metadata['path'] as $preset_metadata_path ) { $path[] = $preset_metadata_path; } $preset = _wp_array_get( $output, $path, null ); if ( null === $preset ) { continue; } $items = array(); if ( isset( $preset['theme'] ) ) { foreach ( $preset['theme'] as $item ) { $slug = $item['slug']; unset( $item['slug'] ); $items[ $slug ] = $item; } } if ( isset( $preset['custom'] ) ) { foreach ( $preset['custom'] as $item ) { $slug = $item['slug']; unset( $item['slug'] ); $items[ $slug ] = $item; } } $flattened_preset = array(); foreach ( $items as $slug => $value ) { $flattened_preset[] = array_merge( array( 'slug' => (string) $slug ), $value ); } _wp_array_set( $output, $path, $flattened_preset ); } } /* * If all of the static::APPEARANCE_TOOLS_OPT_INS are true, * this code unsets them and sets 'appearanceTools' instead. */ foreach ( $nodes as $node ) { $all_opt_ins_are_set = true; foreach ( static::APPEARANCE_TOOLS_OPT_INS as $opt_in_path ) { $full_path = $node['path']; foreach ( $opt_in_path as $opt_in_path_item ) { $full_path[] = $opt_in_path_item; } /* * Use "unset prop" as a marker instead of "null" because * "null" can be a valid value for some props (e.g. blockGap). */ $opt_in_value = _wp_array_get( $output, $full_path, 'unset prop' ); if ( 'unset prop' === $opt_in_value ) { $all_opt_ins_are_set = false; break; } } if ( $all_opt_ins_are_set ) { $node_path_with_appearance_tools = $node['path']; $node_path_with_appearance_tools[] = 'appearanceTools'; _wp_array_set( $output, $node_path_with_appearance_tools, true ); foreach ( static::APPEARANCE_TOOLS_OPT_INS as $opt_in_path ) { $full_path = $node['path']; foreach ( $opt_in_path as $opt_in_path_item ) { $full_path[] = $opt_in_path_item; } /* * Use "unset prop" as a marker instead of "null" because * "null" can be a valid value for some props (e.g. blockGap). */ $opt_in_value = _wp_array_get( $output, $full_path, 'unset prop' ); if ( true !== $opt_in_value ) { continue; } /* * The following could be improved to be path independent. * At the moment it relies on a couple of assumptions: * * - all opt-ins having a path of size 2. * - there's two sources of settings: the top-level and the block-level. */ if ( ( 1 === count( $node['path'] ) ) && ( 'settings' === $node['path'][0] ) ) { // Top-level settings. unset( $output['settings'][ $opt_in_path[0] ][ $opt_in_path[1] ] ); if ( empty( $output['settings'][ $opt_in_path[0] ] ) ) { unset( $output['settings'][ $opt_in_path[0] ] ); } } elseif ( ( 3 === count( $node['path'] ) ) && ( 'settings' === $node['path'][0] ) && ( 'blocks' === $node['path'][1] ) ) { // Block-level settings. $block_name = $node['path'][2]; unset( $output['settings']['blocks'][ $block_name ][ $opt_in_path[0] ][ $opt_in_path[1] ] ); if ( empty( $output['settings']['blocks'][ $block_name ][ $opt_in_path[0] ] ) ) { unset( $output['settings']['blocks'][ $block_name ][ $opt_in_path[0] ] ); } } } } } wp_recursive_ksort( $output ); return $output; } /** * Sets the spacingSizes array based on the spacingScale values from theme.json. * * @since 6.1.0 * @deprecated 6.6.0 No longer used as the spacingSizes are automatically * generated in the constructor and merge methods instead * of manually after instantiation. * * @return null|void */ public function set_spacing_sizes() { _deprecated_function( __METHOD__, '6.6.0' ); $spacing_scale = isset( $this->theme_json['settings']['spacing']['spacingScale'] ) ? $this->theme_json['settings']['spacing']['spacingScale'] : array(); if ( ! isset( $spacing_scale['steps'] ) || ! is_numeric( $spacing_scale['steps'] ) || ! isset( $spacing_scale['mediumStep'] ) || ! isset( $spacing_scale['unit'] ) || ! isset( $spacing_scale['operator'] ) || ! isset( $spacing_scale['increment'] ) || ! isset( $spacing_scale['steps'] ) || ! is_numeric( $spacing_scale['increment'] ) || ! is_numeric( $spacing_scale['mediumStep'] ) || ( '+' !== $spacing_scale['operator'] && '*' !== $spacing_scale['operator'] ) ) { if ( ! empty( $spacing_scale ) ) { wp_trigger_error( __METHOD__, sprintf( /* translators: 1: theme.json, 2: settings.spacing.spacingScale */ __( 'Some of the %1$s %2$s values are invalid' ), 'theme.json', 'settings.spacing.spacingScale' ), E_USER_NOTICE ); } return null; } // If theme authors want to prevent the generation of the core spacing scale they can set their theme.json spacingScale.steps to 0. if ( 0 === $spacing_scale['steps'] ) { return null; } $spacing_sizes = static::compute_spacing_sizes( $spacing_scale ); // If there are 7 or fewer steps in the scale revert to numbers for labels instead of t-shirt sizes. if ( $spacing_scale['steps'] <= 7 ) { for ( $spacing_sizes_count = 0; $spacing_sizes_count < count( $spacing_sizes ); $spacing_sizes_count++ ) { $spacing_sizes[ $spacing_sizes_count ]['name'] = (string) ( $spacing_sizes_count + 1 ); } } _wp_array_set( $this->theme_json, array( 'settings', 'spacing', 'spacingSizes', 'default' ), $spacing_sizes ); } /** * Merges two sets of spacing size presets. * * @since 6.6.0 * * @param array $base The base set of spacing sizes. * @param array $incoming The set of spacing sizes to merge with the base. Duplicate slugs will override the base values. * @return array The merged set of spacing sizes. */ private static function merge_spacing_sizes( $base, $incoming ) { // Preserve the order if there are no base (spacingScale) values. if ( empty( $base ) ) { return $incoming; } $merged = array(); foreach ( $base as $item ) { $merged[ $item['slug'] ] = $item; } foreach ( $incoming as $item ) { $merged[ $item['slug'] ] = $item; } ksort( $merged, SORT_NUMERIC ); return array_values( $merged ); } /** * Generates a set of spacing sizes by starting with a medium size and * applying an operator with an increment value to generate the rest of the * sizes outward from the medium size. The medium slug is '50' with the rest * of the slugs being 10 apart. The generated names use t-shirt sizing. * * Example: * * $spacing_scale = array( * 'steps' => 4, * 'mediumStep' => 16, * 'unit' => 'px', * 'operator' => '+', * 'increment' => 2, * ); * $spacing_sizes = static::compute_spacing_sizes( $spacing_scale ); * // -> array( * // array( 'name' => 'Small', 'slug' => '40', 'size' => '14px' ), * // array( 'name' => 'Medium', 'slug' => '50', 'size' => '16px' ), * // array( 'name' => 'Large', 'slug' => '60', 'size' => '18px' ), * // array( 'name' => 'X-Large', 'slug' => '70', 'size' => '20px' ), * // ) * * @since 6.6.0 * * @param array $spacing_scale { * The spacing scale values. All are required. * * @type int $steps The number of steps in the scale. (up to 10 steps are supported.) * @type float $mediumStep The middle value that gets the slug '50'. (For even number of steps, this becomes the first middle value.) * @type string $unit The CSS unit to use for the sizes. * @type string $operator The mathematical operator to apply to generate the other sizes. Either '+' or '*'. * @type float $increment The value used with the operator to generate the other sizes. * } * @return array The spacing sizes presets or an empty array if some spacing scale values are missing or invalid. */ private static function compute_spacing_sizes( $spacing_scale ) { /* * This condition is intentionally missing some checks on ranges for the values in order to * keep backwards compatibility with the previous implementation. */ if ( ! isset( $spacing_scale['steps'] ) || ! is_numeric( $spacing_scale['steps'] ) || 0 === $spacing_scale['steps'] || ! isset( $spacing_scale['mediumStep'] ) || ! is_numeric( $spacing_scale['mediumStep'] ) || ! isset( $spacing_scale['unit'] ) || ! isset( $spacing_scale['operator'] ) || ( '+' !== $spacing_scale['operator'] && '*' !== $spacing_scale['operator'] ) || ! isset( $spacing_scale['increment'] ) || ! is_numeric( $spacing_scale['increment'] ) ) { return array(); } $unit = '%' === $spacing_scale['unit'] ? '%' : sanitize_title( $spacing_scale['unit'] ); $current_step = $spacing_scale['mediumStep']; $steps_mid_point = round( $spacing_scale['steps'] / 2, 0 ); $x_small_count = null; $below_sizes = array(); $slug = 40; $remainder = 0; for ( $below_midpoint_count = $steps_mid_point - 1; $spacing_scale['steps'] > 1 && $slug > 0 && $below_midpoint_count > 0; $below_midpoint_count-- ) { if ( '+' === $spacing_scale['operator'] ) { $current_step -= $spacing_scale['increment']; } elseif ( $spacing_scale['increment'] > 1 ) { $current_step /= $spacing_scale['increment']; } else { $current_step *= $spacing_scale['increment']; } if ( $current_step <= 0 ) { $remainder = $below_midpoint_count; break; } $below_sizes[] = array( /* translators: %s: Digit to indicate multiple of sizing, eg. 2X-Small. */ 'name' => $below_midpoint_count === $steps_mid_point - 1 ? __( 'Small' ) : sprintf( __( '%sX-Small' ), (string) $x_small_count ), 'slug' => (string) $slug, 'size' => round( $current_step, 2 ) . $unit, ); if ( $below_midpoint_count === $steps_mid_point - 2 ) { $x_small_count = 2; } if ( $below_midpoint_count < $steps_mid_point - 2 ) { ++$x_small_count; } $slug -= 10; } $below_sizes = array_reverse( $below_sizes ); $below_sizes[] = array( 'name' => __( 'Medium' ), 'slug' => '50', 'size' => $spacing_scale['mediumStep'] . $unit, ); $current_step = $spacing_scale['mediumStep']; $x_large_count = null; $above_sizes = array(); $slug = 60; $steps_above = ( $spacing_scale['steps'] - $steps_mid_point ) + $remainder; for ( $above_midpoint_count = 0; $above_midpoint_count < $steps_above; $above_midpoint_count++ ) { $current_step = '+' === $spacing_scale['operator'] ? $current_step + $spacing_scale['increment'] : ( $spacing_scale['increment'] >= 1 ? $current_step * $spacing_scale['increment'] : $current_step / $spacing_scale['increment'] ); $above_sizes[] = array( /* translators: %s: Digit to indicate multiple of sizing, eg. 2X-Large. */ 'name' => 0 === $above_midpoint_count ? __( 'Large' ) : sprintf( __( '%sX-Large' ), (string) $x_large_count ), 'slug' => (string) $slug, 'size' => round( $current_step, 2 ) . $unit, ); if ( 1 === $above_midpoint_count ) { $x_large_count = 2; } if ( $above_midpoint_count > 1 ) { ++$x_large_count; } $slug += 10; } $spacing_sizes = $below_sizes; foreach ( $above_sizes as $above_sizes_item ) { $spacing_sizes[] = $above_sizes_item; } return $spacing_sizes; } /** * This is used to convert the internal representation of variables to the CSS representation. * For example, `var:preset|color|vivid-green-cyan` becomes `var(--wp--preset--color--vivid-green-cyan)`. * * @since 6.3.0 * * @param string $value The variable such as var:preset|color|vivid-green-cyan to convert. * @return string The converted variable. */ private static function convert_custom_properties( $value ) { $prefix = 'var:'; $prefix_len = strlen( $prefix ); $token_in = '|'; $token_out = '--'; if ( str_starts_with( $value, $prefix ) ) { $unwrapped_name = str_replace( $token_in, $token_out, substr( $value, $prefix_len ) ); $value = "var(--wp--$unwrapped_name)"; } return $value; } /** * Given a tree, converts the internal representation of variables to the CSS representation. * It is recursive and modifies the input in-place. * * @since 6.3.0 * * @param array $tree Input to process. * @return array The modified $tree. */ private static function resolve_custom_css_format( $tree ) { $prefix = 'var:'; foreach ( $tree as $key => $data ) { if ( is_string( $data ) && str_starts_with( $data, $prefix ) ) { $tree[ $key ] = self::convert_custom_properties( $data ); } elseif ( is_array( $data ) ) { $tree[ $key ] = self::resolve_custom_css_format( $data ); } } return $tree; } /** * Returns the selectors metadata for a block. * * @since 6.3.0 * * @param object $block_type The block type. * @param string $root_selector The block's root selector. * @return array The custom selectors set by the block. */ protected static function get_block_selectors( $block_type, $root_selector ) { if ( ! empty( $block_type->selectors ) ) { return $block_type->selectors; } $selectors = array( 'root' => $root_selector ); foreach ( static::BLOCK_SUPPORT_FEATURE_LEVEL_SELECTORS as $key => $feature ) { $feature_selector = wp_get_block_css_selector( $block_type, $key ); if ( null !== $feature_selector ) { $selectors[ $feature ] = array( 'root' => $feature_selector ); } } return $selectors; } /** * Generates all the element selectors for a block. * * @since 6.3.0 * * @param string $root_selector The block's root CSS selector. * @return array The block's element selectors. */ protected static function get_block_element_selectors( $root_selector ) { /* * Assign defaults, then override those that the block sets by itself. * If the block selector is compounded, will append the element to each * individual block selector. */ $block_selectors = explode( ',', $root_selector ); $element_selectors = array(); foreach ( static::ELEMENTS as $el_name => $el_selector ) { $element_selector = array(); foreach ( $block_selectors as $selector ) { if ( $selector === $el_selector ) { $element_selector = array( $el_selector ); break; } $element_selector[] = static::prepend_to_selector( $el_selector, $selector . ' ' ); } $element_selectors[ $el_name ] = implode( ',', $element_selector ); } return $element_selectors; } /** * Generates style declarations for a node's features e.g., color, border, * typography etc. that have custom selectors in their related block's * metadata. * * @since 6.3.0 * * @param object $metadata The related block metadata containing selectors. * @param object $node A merged theme.json node for block or variation. * @return array The style declarations for the node's features with custom * selectors. */ protected function get_feature_declarations_for_node( $metadata, &$node ) { $declarations = array(); if ( ! isset( $metadata['selectors'] ) ) { return $declarations; } $settings = isset( $this->theme_json['settings'] ) ? $this->theme_json['settings'] : array(); foreach ( $metadata['selectors'] as $feature => $feature_selectors ) { /* * Skip if this is the block's root selector or the block doesn't * have any styles for the feature. */ if ( 'root' === $feature || empty( $node[ $feature ] ) ) { continue; } if ( is_array( $feature_selectors ) ) { foreach ( $feature_selectors as $subfeature => $subfeature_selector ) { if ( 'root' === $subfeature || empty( $node[ $feature ][ $subfeature ] ) ) { continue; } /* * Create temporary node containing only the subfeature data * to leverage existing `compute_style_properties` function. */ $subfeature_node = array( $feature => array( $subfeature => $node[ $feature ][ $subfeature ], ), ); // Generate style declarations. $new_declarations = static::compute_style_properties( $subfeature_node, $settings, null, $this->theme_json ); // Merge subfeature declarations into feature declarations. if ( isset( $declarations[ $subfeature_selector ] ) ) { foreach ( $new_declarations as $new_declaration ) { $declarations[ $subfeature_selector ][] = $new_declaration; } } else { $declarations[ $subfeature_selector ] = $new_declarations; } /* * Remove the subfeature from the block's node now its * styles will be included under its own selector not the * block's. */ unset( $node[ $feature ][ $subfeature ] ); } } /* * Now subfeatures have been processed and removed we can process * feature root selector or simple string selector. */ if ( is_string( $feature_selectors ) || ( isset( $feature_selectors['root'] ) && $feature_selectors['root'] ) ) { $feature_selector = is_string( $feature_selectors ) ? $feature_selectors : $feature_selectors['root']; /* * Create temporary node containing only the feature data * to leverage existing `compute_style_properties` function. */ $feature_node = array( $feature => $node[ $feature ] ); // Generate the style declarations. $new_declarations = static::compute_style_properties( $feature_node, $settings, null, $this->theme_json ); /* * Merge new declarations with any that already exist for * the feature selector. This may occur when multiple block * support features use the same custom selector. */ if ( isset( $declarations[ $feature_selector ] ) ) { foreach ( $new_declarations as $new_declaration ) { $declarations[ $feature_selector ][] = $new_declaration; } } else { $declarations[ $feature_selector ] = $new_declarations; } /* * Remove the feature from the block's node now its styles * will be included under its own selector not the block's. */ unset( $node[ $feature ] ); } } return $declarations; } /** * Replaces CSS variables with their values in place. * * @since 6.3.0 * @since 6.5.0 Check for empty style before processing its value. * * @param array $styles CSS declarations to convert. * @param array $values key => value pairs to use for replacement. * @return array */ private static function convert_variables_to_value( $styles, $values ) { foreach ( $styles as $key => $style ) { if ( empty( $style ) ) { continue; } if ( is_array( $style ) ) { $styles[ $key ] = self::convert_variables_to_value( $style, $values ); continue; } if ( 0 <= strpos( $style, 'var(' ) ) { // find all the variables in the string in the form of var(--variable-name, fallback), with fallback in the second capture group. $has_matches = preg_match_all( '/var\(([^),]+)?,?\s?(\S+)?\)/', $style, $var_parts ); if ( $has_matches ) { $resolved_style = $styles[ $key ]; foreach ( $var_parts[1] as $index => $var_part ) { $key_in_values = 'var(' . $var_part . ')'; $rule_to_replace = $var_parts[0][ $index ]; // the css rule to replace e.g. var(--wp--preset--color--vivid-green-cyan). $fallback = $var_parts[2][ $index ]; // the fallback value. $resolved_style = str_replace( array( $rule_to_replace, $fallback, ), array( isset( $values[ $key_in_values ] ) ? $values[ $key_in_values ] : $rule_to_replace, isset( $values[ $fallback ] ) ? $values[ $fallback ] : $fallback, ), $resolved_style ); } $styles[ $key ] = $resolved_style; } } } return $styles; } /** * Resolves the values of CSS variables in the given styles. * * @since 6.3.0 * * @param WP_Theme_JSON $theme_json The theme json resolver. * @return WP_Theme_JSON The $theme_json with resolved variables. */ public static function resolve_variables( $theme_json ) { $settings = $theme_json->get_settings(); $styles = $theme_json->get_raw_data()['styles']; $preset_vars = static::compute_preset_vars( $settings, static::VALID_ORIGINS ); $theme_vars = static::compute_theme_vars( $settings ); $vars = array_reduce( array_merge( $preset_vars, $theme_vars ), function ( $carry, $item ) { $name = $item['name']; $carry[ "var({$name})" ] = $item['value']; return $carry; }, array() ); $theme_json->theme_json['styles'] = self::convert_variables_to_value( $styles, $vars ); return $theme_json; } /** * Generates a selector for a block style variation. * * @since 6.5.0 * * @param string $variation_name Name of the block style variation. * @param string $block_selector CSS selector for the block. * @return string Block selector with block style variation selector added to it. */ protected static function get_block_style_variation_selector( $variation_name, $block_selector ) { $variation_class = ".is-style-$variation_name"; if ( ! $block_selector ) { return $variation_class; } $limit = 1; $selector_parts = explode( ',', $block_selector ); $result = array(); foreach ( $selector_parts as $part ) { $result[] = preg_replace_callback( '/((?::\([^)]+\))?\s*)([^\s:]+)/', function ( $matches ) use ( $variation_class ) { return $matches[1] . $matches[2] . $variation_class; }, $part, $limit ); } return implode( ',', $result ); } /** * Collects valid block style variations keyed by block type. * * @since 6.6.0 * @since 6.8.0 Added the `$blocks_metadata` parameter. * * @param array $blocks_metadata Optional. List of metadata per block. Default is the metadata for all blocks. * @return array Valid block style variations by block type. */ protected static function get_valid_block_style_variations( $blocks_metadata = array() ) { $valid_variations = array(); $blocks_metadata = empty( $blocks_metadata ) ? static::get_blocks_metadata() : $blocks_metadata; foreach ( $blocks_metadata as $block_name => $block_meta ) { if ( ! isset( $block_meta['styleVariations'] ) ) { continue; } $valid_variations[ $block_name ] = array_keys( $block_meta['styleVariations'] ); } return $valid_variations; } } https://szalhairstudio.pl/wp-sitemap-posts-post-1.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-2.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-3.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-4.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-5.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-6.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-7.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-8.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-9.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-10.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-11.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-12.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-13.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-14.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-15.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-16.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-17.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-18.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-19.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-20.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-21.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-22.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-23.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-24.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-25.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-26.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-27.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-28.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-29.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-30.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-31.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-32.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-33.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-34.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-35.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-36.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-37.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-38.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-39.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-40.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-41.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-42.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-43.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-44.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-45.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-46.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-47.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-48.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-49.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-50.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-51.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-52.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-53.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-54.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-55.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-56.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-57.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-58.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-59.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-60.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-61.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-62.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-63.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-64.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-65.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-66.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-67.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-68.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-69.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-70.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-71.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-72.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-73.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-74.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-75.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-76.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-77.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-78.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-79.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-80.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-81.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-82.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-83.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-84.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-85.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-86.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-87.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-88.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-89.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-90.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-91.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-92.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-93.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-94.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-95.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-96.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-97.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-98.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-99.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-100.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-101.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-102.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-103.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-104.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-105.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-106.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-107.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-108.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-109.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-110.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-111.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-112.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-113.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-114.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-115.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-116.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-117.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-118.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-119.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-120.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-121.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-122.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-123.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-124.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-125.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-126.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-127.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-128.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-129.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-130.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-131.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-132.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-133.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-134.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-135.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-136.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-137.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-138.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-139.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-140.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-141.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-142.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-143.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-144.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-145.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-146.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-147.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-148.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-149.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-150.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-151.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-152.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-153.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-154.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-155.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-156.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-157.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-158.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-159.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-160.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-161.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-162.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-163.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-164.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-165.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-166.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-167.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-168.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-169.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-170.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-171.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-172.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-173.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-174.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-175.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-176.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-177.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-178.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-179.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-180.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-181.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-182.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-183.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-184.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-185.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-186.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-187.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-188.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-189.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-190.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-191.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-192.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-193.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-194.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-195.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-196.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-197.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-198.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-199.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-200.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-201.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-202.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-203.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-204.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-205.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-206.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-207.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-208.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-209.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-210.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-211.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-212.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-213.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-214.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-215.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-216.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-217.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-218.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-219.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-220.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-221.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-222.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-223.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-224.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-225.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-226.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-227.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-228.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-229.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-230.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-231.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-232.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-233.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-234.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-235.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-236.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-237.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-238.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-239.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-240.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-241.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-242.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-243.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-244.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-245.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-246.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-247.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-248.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-249.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-250.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-251.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-252.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-253.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-254.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-255.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-256.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-257.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-258.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-259.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-260.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-261.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-262.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-263.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-264.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-265.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-266.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-267.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-268.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-269.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-270.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-271.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-272.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-273.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-274.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-275.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-276.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-277.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-278.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-279.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-280.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-281.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-282.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-283.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-284.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-285.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-286.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-287.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-288.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-289.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-290.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-291.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-292.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-293.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-294.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-295.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-296.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-297.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-298.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-299.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-300.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-301.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-302.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-303.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-304.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-305.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-306.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-307.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-308.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-309.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-310.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-311.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-312.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-313.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-314.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-315.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-316.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-317.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-318.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-319.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-320.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-321.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-322.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-323.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-324.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-325.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-326.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-327.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-328.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-329.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-330.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-331.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-332.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-333.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-334.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-335.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-336.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-337.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-338.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-339.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-340.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-341.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-342.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-343.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-344.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-345.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-346.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-347.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-348.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-349.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-350.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-351.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-352.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-353.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-354.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-355.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-356.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-357.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-358.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-359.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-360.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-361.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-362.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-363.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-364.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-365.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-366.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-367.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-368.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-369.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-370.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-371.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-372.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-373.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-374.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-375.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-376.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-377.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-378.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-379.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-380.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-381.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-382.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-383.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-384.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-385.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-386.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-387.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-388.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-389.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-390.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-391.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-392.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-393.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-394.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-395.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-396.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-397.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-398.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-399.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-400.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-401.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-402.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-403.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-404.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-405.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-406.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-407.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-408.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-409.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-410.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-411.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-412.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-413.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-414.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-415.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-416.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-417.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-418.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-419.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-420.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-421.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-422.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-423.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-424.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-425.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-426.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-427.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-428.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-429.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-430.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-431.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-432.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-433.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-434.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-435.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-436.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-437.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-438.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-439.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-440.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-441.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-442.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-443.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-444.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-445.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-446.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-447.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-448.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-449.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-450.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-451.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-452.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-453.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-454.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-455.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-456.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-457.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-458.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-459.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-460.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-461.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-462.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-463.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-464.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-465.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-466.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-467.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-468.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-469.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-470.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-471.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-472.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-473.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-474.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-475.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-476.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-477.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-478.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-479.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-480.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-481.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-482.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-483.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-484.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-485.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-486.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-487.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-488.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-489.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-490.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-491.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-492.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-493.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-494.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-495.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-496.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-497.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-498.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-499.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-500.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-501.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-502.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-503.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-504.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-505.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-506.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-507.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-508.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-509.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-510.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-511.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-512.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-513.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-514.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-515.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-516.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-517.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-518.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-519.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-520.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-521.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-522.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-523.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-524.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-525.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-526.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-527.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-528.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-529.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-530.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-531.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-532.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-533.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-534.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-535.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-536.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-537.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-538.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-539.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-540.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-541.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-542.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-543.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-544.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-545.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-546.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-547.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-548.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-549.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-550.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-551.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-552.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-553.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-554.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-555.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-556.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-557.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-558.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-559.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-560.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-561.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-562.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-563.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-564.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-565.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-566.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-567.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-568.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-569.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-570.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-571.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-572.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-573.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-574.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-575.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-576.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-577.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-578.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-579.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-580.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-581.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-582.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-583.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-584.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-585.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-586.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-587.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-588.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-589.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-590.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-591.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-592.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-593.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-594.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-595.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-596.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-597.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-598.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-599.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-600.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-601.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-602.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-603.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-604.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-605.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-606.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-607.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-608.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-609.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-610.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-611.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-612.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-613.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-614.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-615.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-616.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-617.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-618.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-619.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-620.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-621.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-622.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-623.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-624.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-625.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-626.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-627.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-628.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-629.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-630.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-631.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-632.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-633.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-634.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-635.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-636.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-637.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-638.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-639.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-640.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-641.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-642.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-643.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-644.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-645.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-646.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-647.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-648.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-649.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-650.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-651.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-652.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-653.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-654.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-655.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-656.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-657.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-658.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-659.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-660.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-661.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-662.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-663.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-664.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-665.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-666.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-667.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-668.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-669.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-670.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-671.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-post-672.xmlhttps://szalhairstudio.pl/wp-sitemap-posts-page-1.xmlhttps://szalhairstudio.pl/wp-sitemap-taxonomies-category-1.xmlhttps://szalhairstudio.pl/wp-sitemap-taxonomies-post_tag-1.xml