<?php
/**
 * Needed functionality for the performance wizard.
 *
 * @author     ThemeFusion
 * @copyright  (c) Copyright by ThemeFusion
 * @link       https://avada.com
 * @package    Avada
 * @subpackage Core
 * @since      7.4
 *
 * @phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
 */

/**
 * Performance wizard handling.
 *
 * @since 7.4
 */
class AWB_Performance_Wizard {

	/**
	 * The one, true instance of this object.
	 *
	 * @static
	 * @access private
	 * @since 7.4
	 * @var object
	 */
	private static $instance;

	/**
	 * The array of parsed posts.
	 *
	 * @access protected
	 * @var array
	 */
	protected $posts = [];

	/**
	 * Map between what is matched in content and other icon data.
	 *
	 * @access protected
	 * @var array
	 */
	protected $icon_map = [];

	/**
	 * Icon subsets.
	 *
	 * @access protected
	 * @var array
	 */
	protected $icon_subsets = [
		'fab' => 'brands',
		'far' => 'regular',
		'fas' => 'solid',
		'fal' => 'light',
	];

	/**
	 * Creates or returns an instance of this class.
	 *
	 * @static
	 * @access public
	 * @since 7.4
	 */
	public static function get_instance() {

		// If an instance hasn't been created and set to $instance create an instance and set it to $instance.
		if ( null === self::$instance ) {
			self::$instance = new AWB_Performance_Wizard();
		}
		return self::$instance;
	}

	/**
	 * The class constructor
	 *
	 * @access public
	 */
	public function __construct() {
		// Scan ajax.
		add_action( 'wp_ajax_awb_performance_scan', [ $this, 'ajax_scan' ] );

		// Save ajax.
		add_action( 'wp_ajax_awb_performance_save', [ $this, 'ajax_save' ] );

		// Save ajax.
		add_action( 'wp_ajax_awb_performance_cache', [ $this, 'ajax_cache' ] );

		// Trigger icon download.
		add_action( 'init', [ $this, 'download_icon' ] );

		if ( ! fusion_doing_ajax() ) {
			add_action( 'admin_enqueue_scripts', [ $this, 'add_scripts' ] );
		}

		if ( ( isset( $_GET['page'] ) && 'avada-performance' === sanitize_text_field( wp_unslash( $_GET['page'] ) ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			add_filter( 'awb_po_get_value', [ $this, 'global_value' ], 10, 2 );
			add_filter( 'awb_po_get_option_name', [ $this, 'global_name' ], 10, 2 );
		}
	}

	/**
	 * Return global value instead of usual page option.
	 *
	 * @access public
	 * @param string $value The value.
	 * @param int    $id    The ID.
	 * @return string
	 */
	public function global_value( $value, $id ) {
		$settings = awb_get_fusion_settings();
		return $settings->get( $id );
	}

	/**
	 * Override root so IDs are correct.
	 *
	 * @access public
	 * @param string $name The name.
	 * @param int    $id   The ID.
	 * @return string
	 */
	public function global_name( $name, $id ) {
		return str_replace( '[]', '', ltrim( $id, '_' ) );
	}

	/**
	 * Enequeue required scripts.
	 *
	 * @access public
	 * @return void
	 */
	public function add_scripts() {
		$version = Avada::get_theme_version();
		wp_enqueue_style( 'awb_performance_css', trailingslashit( Avada::$template_dir_url ) . 'assets/admin/css/awb-wizard.css', [], $version );

		AWB_Global_Typography()->enqueue();

		wp_enqueue_script( 'awb_performance_js', trailingslashit( Avada::$template_dir_url ) . 'assets/admin/js/awb-wizard.js', [ 'jquery' ], $version, true );

		wp_localize_script( 'awb_performance_js', 'fusionBuilderText', fusion_app_textdomain_strings() );

		$api_key = apply_filters( 'awb_lighthouse_api_key', false );

		wp_localize_script(
			'awb_performance_js',
			'awbPerformance',
			[
				'homeURL'            => get_home_url(),
				'lighthouse'         => ! empty( $_GET['lighthouse'] ) || false !== $api_key, // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				'apiKey'             => $api_key,
				'saveChange'         => __( 'Do you want to proceed without saving changes?', 'Avada' ),
				'loadingHome'        => __( 'Loading the homepage to generate assets.', 'Avada' ),
				'performLighthouse'  => __( 'Running a lighthouse test to find new performance scores.', 'Avada' ),
				'errorLoadingPage'   => __( 'Automated asset generation failed. Visit your homepage in the browser.', 'Avada' ),
				'errorClearingCache' => __( 'There was a problem when clearing the cache. Please clear it from the Global Options.', 'Avada' ),
				'wizardComplete'     => __( 'Cache and assets have been cleared successfully!', 'Avada' ),
				'scanError'          => __( 'Something went wrong while scanning the content, please check PHP error log and try again.', 'Avada' ),
			]
		);

		// Select field assets.
		wp_dequeue_script( 'tribe-events-select2' );

		wp_enqueue_style(
			'select2-css',
			Avada::$template_dir_url . '/assets/admin/css/select2.css',
			[],
			$version,
			'all'
		);
		wp_enqueue_script(
			'selectwoo-js',
			Avada::$template_dir_url . '/assets/admin/js/selectWoo.full.min.js',
			[ 'jquery' ],
			$version,
			false
		);

		// Range field assets.
		wp_enqueue_style(
			'avadaredux-nouislider-css',
			FUSION_LIBRARY_URL . '/inc/redux/framework/FusionReduxCore/inc/fields/slider/vendor/nouislider/fusionredux.jquery.nouislider.css',
			[],
			$version,
			'all'
		);

		wp_enqueue_script(
			'avadaredux-nouislider-js',
			Avada::$template_dir_url . '/assets/admin/js/jquery.nouislider.min.js',
			[ 'jquery' ],
			$version,
			true
		);
		wp_enqueue_script(
			'wnumb-js',
			Avada::$template_dir_url . '/assets/admin/js/wNumb.js',
			[ 'jquery' ],
			$version,
			true
		);

		// Color fields.
		if ( function_exists( 'AWB_Global_Colors' ) ) {
			AWB_Global_Colors()->enqueue();
		}

		// Option type JS.
		wp_enqueue_script(
			'avada-fusion-options',
			Avada::$template_dir_url . '/assets/admin/js/avada-fusion-options.js',
			[ 'jquery', 'jquery-ui-sortable' ],
			$version,
			false
		);
	}

	/**
	 * Check if nonce is valid.
	 *
	 * @access public
	 */
	public function check_nonce() {
		check_admin_referer( 'awb_performance_nonce', 'awb_performance_nonce' );
	}

	/**
	 * Handles resetting caches.
	 *
	 * @access public
	 * @since 7.4
	 * @return void
	 */
	public function ajax_cache() {

		$this->check_nonce();

		if ( is_multisite() && is_main_site() ) {
			$sites = get_sites();
			foreach ( $sites as $site ) {
				switch_to_blog( $site->blog_id );
				fusion_reset_all_caches();
				restore_current_blog();
			}
			return;
		}
		fusion_reset_all_caches();
	}

	/**
	 * Save global option changes.
	 *
	 * @access public
	 */
	public function ajax_save() {
		$this->check_nonce();

		$save_data = isset( $_POST['save_data'] ) ? wp_unslash( $_POST['save_data'] ) : false; // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized

		if ( ! $save_data || ! is_array( $save_data ) ) {
			wp_send_json_error( __( 'No data to save.', 'Avada' ) );
		}

		// Handle element saving, separate location.
		if ( isset( $_POST['step'] ) && 'elements' === $_POST['step'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
			$builder_options = get_option( 'fusion_builder_settings', [] );

			if ( ! $builder_options ) {
				$builder_options = [];
			}

			$builder_options['fusion_elements'] = $save_data;
			update_option( 'fusion_builder_settings', $builder_options );
			wp_send_json_success();
		}

		// Handle global option saving.
		$options = get_option( Avada::get_option_name(), [] );
		foreach ( $save_data as $save_id => $save_value ) {

			// Check for typography options.
			if ( is_array( $save_value ) && ( isset( $save_value['font-variant'] ) || isset( $save_value['font-family'] ) ) ) {
				if ( isset( $save_value['font-variant'] ) ) {
					if ( false !== strpos( $save_value['font-variant'], 'italic' ) ) {
						$options[ $save_id ]['font-weight'] = wp_unslash( str_replace( 'italic', '', $save_value['font-variant'] ) );
						$options[ $save_id ]['font-style']  = 'italic';
					} else {
						$options[ $save_id ]['font-weight'] = wp_unslash( $save_value['font-variant'] );
						$options[ $save_id ]['font-style']  = '';
					}
				}
				if ( isset( $save_value['font-family'] ) ) {
					$options[ $save_id ]['font-family'] = wp_unslash( $save_value['font-family'] );
				}
				continue;
			}

			// Not a font variant, save as normal.
			$options[ $save_id ] = wp_unslash( $save_value );
		}

		$updated = update_option( Avada::get_option_name(), $options );

		if ( ! $updated ) {
			wp_send_json_success( __( 'No changes to update.', 'Avada' ) );
		}

		wp_send_json_success();
	}

	/**
	 * Perform scan and return results.
	 *
	 * @access public
	 */
	public function ajax_scan() {

		$this->check_nonce();

		$scan_type = isset( $_GET['scan_type'] ) ? wp_unslash( $_GET['scan_type'] ) : false; // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized

		if ( ! $scan_type ) {
			wp_send_json_error( new WP_Error( 404, __( 'No valid action found.', 'Avada' ) ) );
		}

		switch ( $scan_type ) {
			case 'features':
				$this->feature_scan();
				break;
			case 'icons':
				$this->icon_scan();
				break;
			case 'elements':
				$this->element_scan();
				break;
		}
	}

	/**
	 * Download Font Awesome icon.
	 *
	 * @access public
	 */
	public function download_icon() {
		if ( ! isset( $_GET['action'] ) || 'awb_trigger_icon_download' !== $_GET['action'] ) { // phpcs:ignore WordPress.Security
			return;
		}

		$this->check_nonce();

		$icon_subset = isset( $_GET['icon_subset'] ) ? sanitize_text_field( wp_unslash( $_GET['icon_subset'] ) ) : false; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
		$icon_name   = isset( $_GET['icon_name'] ) ? sanitize_text_field( wp_unslash( $_GET['icon_name'] ) ) : false; // phpcs:ignore WordPress.Security.NonceVerification.Recommended

		$download_url = isset( $_GET['download_url'] ) ? strtok( sanitize_text_field( wp_unslash( $_GET['download_url'] ) ), '?' ) : false; // phpcs:ignore WordPress.Security.NonceVerification.Recommended

		$download_url = 'https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/svgs/' . $icon_subset . '/' . $icon_name . '.svg';

		$response = wp_remote_get( $download_url );

		if ( 200 !== wp_remote_retrieve_response_code( $response ) ) {
			// TODO: add error message.
			wp_die();
		}

		header( 'Content-Description: File Transfer' );
		header( 'Content-type: image/svg+xml' );
		header( 'Content-Disposition: attachment; filename="' . $icon_name . '-' . $icon_subset . '.svg"' );
		header( 'Content-Transfer-Encoding: binary' );
		header( 'Expires: 0' );
		header( 'Cache-Control: must-revalidate' );
		header( 'Pragma: public' );

		echo wp_remote_retrieve_body( $response ); // phpcs:ignore WordPress.Security.EscapeOutput
		wp_die();
	}

	/**
	 * Scan for unused features which can be disabled.
	 *
	 * @access public
	 */
	public function feature_scan() {
		$recommendations = [];
		$maps            = $this->scan_for_google_map();
		$youtube         = $this->scan_for_videos( 'youtube' );
		$vimeo           = $this->scan_for_videos( 'vimeo' );
		$mega_menu       = $this->scan_for_megamenu();

		// TODO: make somewhat dynamic. status_widget_areas.
		$recommendations['status_widget_areas'] = [
			'value'   => 'off',
			'message' => __( 'Recommend setting to off unless you use legacy widget areas or widgets.', 'Avada' ),
			'dynamic' => false,
		];

		if ( ! $mega_menu ) {
			$recommendations['disable_megamenu'] = [
				'value'   => '0',
				'message' => __( 'You are not using the legacy mega menu. This option can be disabled.', 'Avada' ),
				'dynamic' => true,
			];
		} else {
			$recommendations['disable_megamenu'] = [
				'value'   => '1',
				'message' => __( 'You are using the legacy mega menu. Should be enabled, but consider switching to built mega menu.', 'Avada' ),
				'dynamic' => true,
			];
		}

		if ( ! $youtube ) {
			$recommendations['status_yt'] = [
				'value'   => '0',
				'message' => __( 'You are not using any Youtube element. This option can be disabled.', 'Avada' ),
				'dynamic' => true,
			];
		} else {
			$recommendations['status_yt'] = [
				'value'   => '1',
				'message' => __( 'You are using Youtube element. Should be enabled.', 'Avada' ),
				'dynamic' => true,
			];
		}

		if ( ! $vimeo ) {
			$recommendations['status_vimeo'] = [
				'value'   => '0',
				'message' => __( 'You are not using any Vimeo element. This option can be disabled.', 'Avada' ),
				'dynamic' => true,
			];
		} else {
			$recommendations['status_vimeo'] = [
				'value'   => '1',
				'message' => __( 'You are using Vimeo element. Should be enabled.', 'Avada' ),
				'dynamic' => true,
			];
		}

		if ( ! $maps ) {
			$recommendations['status_gmap'] = [
				'value'   => '0',
				'message' => __( 'You are not using any Google Map element or template. This option can be disabled.', 'Avada' ),
				'dynamic' => true,
			];
		} else {
			$recommendations['status_gmap'] = [
				'value'   => '1',
				'message' => __( 'You are using Google Map element or template. Should be enabled.', 'Avada' ),
				'dynamic' => true,
			];
		}

		// TODO: make somewhat dynamic. button_presets.
		$recommendations['button_presets'] = [
			'value'   => '0',
			'message' => __( 'Recommend disabling unless you are using the button color presets in many areas.', 'Avada' ),
			'dynamic' => true,
		];

		// TODO: make somewhat dynamic. load_block_styles.
		$recommendations['load_block_styles'] = [
			'value'   => 'off',
			'message' => __( 'Recommend setting to off unless you use the Gutenberg editor.', 'Avada' ),
			'dynamic' => false,
		];

		// TODO: make somewhat dynamic. emojis_disabled.
		$recommendations['emojis_disabled'] = [
			'value'   => 'disabled',
			'message' => __( 'Recommend setting to disabled unless you specifically want them for comments.', 'Avada' ),
			'dynamic' => false,
		];

		// avada_rev_styles.
		if ( ! class_exists( 'RevSliderFront' ) ) {
			$recommendations['avada_rev_styles'] = [
				'value'   => '0',
				'message' => __( 'The Slider Revolution plugin is not active, styles can be disabled.', 'Avada' ),
				'dynamic' => true,
			];
		} else {
			$recommendations['avada_rev_styles'] = [
				'value'   => '1',
				'message' => __( 'The Slider Revolution plugin is currently active, only disable if you don\'t want the extra Avada styling.', 'Avada' ),
				'dynamic' => true,
			];
		}

		// status_eslider.
		$elastic_sliders = new WP_Query( [ 'post_type' => 'themefusion_elastic' ] );
		if ( ! $elastic_sliders->have_posts() ) {
			$recommendations['status_eslider'] = [
				'value'   => '0',
				'message' => __( 'No elastic sliders found, should be disabled.', 'Avada' ),
				'dynamic' => true,
			];
		} else {
			$recommendations['status_eslider'] = [
				'value'   => '1',
				'message' => __( 'Elastic sliders found, only disable if you are not using them.', 'Avada' ),
				'dynamic' => true,
			];
		}

		// status_fusion_slider.
		$avada_sliders = new WP_Query( [ 'post_type' => 'slide' ] );
		if ( ! $avada_sliders->have_posts() ) {
			$recommendations['status_fusion_slider'] = [
				'value'   => '0',
				'message' => __( 'No Avada sliders found, should be disabled.', 'Avada' ),
				'dynamic' => true,
			];
		} else {
			$recommendations['status_fusion_slider'] = [
				'value'   => '1',
				'message' => __( 'Avada sliders found, only disable if you are not using them.', 'Avada' ),
				'dynamic' => true,
			];
		}

		// status_fusion_forms.
		$avada_forms = new WP_Query( [ 'post_type' => 'fusion_form' ] );
		if ( ! $avada_forms->have_posts() ) {
			$recommendations['status_fusion_forms'] = [
				'value'   => '0',
				'message' => __( 'No Avada forms found, can be disabled. Alternatively if you haven\'t tried them yet, give them a go.', 'Avada' ),
				'dynamic' => true,
			];
		} else {
			$recommendations['status_fusion_forms'] = [
				'value'   => '1',
				'message' => __( 'Avada forms found, only disable if you are not using them.', 'Avada' ),
				'dynamic' => true,
			];
		}

		// status_awb_Off_Canvas.
		$avada_off_canvas = new WP_Query( [ 'post_type' => 'awb_off_canvas' ] );
		if ( ! $avada_off_canvas->have_posts() ) {
			$recommendations['status_awb_Off_Canvas'] = [
				'value'   => '0',
				'message' => __( 'No Avada off canvas found, can be disabled. Alternatively if you haven\'t tried them yet, give them a go.', 'Avada' ),
				'dynamic' => true,
			];
		} else {
			$recommendations['status_awb_Off_Canvas'] = [
				'value'   => '1',
				'message' => __( 'Avada off canvas found, only disable if you are not using them.', 'Avada' ),
				'dynamic' => true,
			];
		}

		// status_fusion_portfolio.
		$avada_portfolios = new WP_Query( [ 'post_type' => 'avada_portfolio' ] );
		if ( ! $avada_portfolios->have_posts() ) {
			$recommendations['status_fusion_portfolio'] = [
				'value'   => '0',
				'message' => __( 'No portfolio posts found, can be disabled.', 'Avada' ),
				'dynamic' => true,
			];
		} else {
			$recommendations['status_fusion_portfolio'] = [
				'value'   => '1',
				'message' => __( 'Portfolio posts found, only disable if you are not using them.', 'Avada' ),
				'dynamic' => true,
			];
		}

		// status_fusion_faqs.
		$avada_faqs = new WP_Query( [ 'post_type' => 'avada_faq' ] );
		if ( ! $avada_faqs->have_posts() ) {
			$recommendations['status_fusion_faqs'] = [
				'value'   => '0',
				'message' => __( 'No FAQ posts found, can be disabled.', 'Avada' ),
				'dynamic' => true,
			];
		} else {
			$recommendations['status_fusion_faqs'] = [
				'value'   => '1',
				'message' => __( 'FAQ posts found, only disable if you are not using them.', 'Avada' ),
				'dynamic' => true,
			];
		}

		wp_send_json_success( $recommendations );
	}

	/**
	 * AJAX callback method, used to get used icons table.
	 *
	 * @access public
	 */
	public function icon_scan() {

		$found_icons = $this->scan_for_icons();
		$full_icons  = [];

		$fa_4_class = ' class="awb-fa-legacy-icon"';

		ob_start();
		foreach ( $found_icons as $found_icon ) : ?>
			<tr>
				<td>
					<?php
					$edit_link  = '';
					$edit_title = '';

					if ( isset( $found_icon['data']['post_type'] ) ) {

						$edit_title = $found_icon['data']['post_title'];

						if ( 'nav_menu_item' !== $found_icon['data']['post_type'] ) {
							$edit_link = admin_url( 'post.php?post=' . $found_icon['data']['post_id'] . '&action=edit' );
						} elseif ( 'nav_menu_item' === $found_icon['data']['post_type'] ) {
							$nav_terms = wp_get_object_terms( $found_icon['data']['post_id'], 'nav_menu' );

							if ( ! is_wp_error( $nav_terms ) && isset( $nav_terms[0] ) ) {
								$edit_link = admin_url( 'nav-menus.php?action=edit&menu=' . $nav_terms[0]->term_id );
							}

							// Check if menu item points to a page and didnt have post title saved.
							if ( '' === $edit_title && '' !== get_post_meta( $found_icon['data']['post_id'], '_menu_item_object_id', true ) ) {

								if ( 'post_type' === get_post_meta( $found_icon['data']['post_id'], '_menu_item_type', true ) ) {
									$edit_title = get_the_title( get_post_meta( $found_icon['data']['post_id'], '_menu_item_object_id', true ) );
								}

								if ( 'taxonomy' === get_post_meta( $found_icon['data']['post_id'], '_menu_item_type', true ) ) {
									$term = get_term( get_post_meta( $found_icon['data']['post_id'], '_menu_item_object_id', true ), get_post_meta( $found_icon['data']['post_id'], '_menu_item_object', true ) );

									if ( ! is_wp_error( $term ) ) {
										$edit_title = $term->name;
									}
								}
							}
						}
					} elseif ( isset( $found_icon['widget'] ) ) {
						$edit_title = $found_icon['widget']['widget_type'] . ' - ' . $found_icon['widget']['widget_area'];
						$edit_link  = admin_url( 'widgets.php' );
					}
					?>

					<a href="<?php echo esc_url_raw( $edit_link ); ?>" target="_blank">
					<?php echo esc_html( $edit_title ); ?>
					</a>
				</td>
				<td>
					<?php
					if ( isset( $found_icon['post_content']['icons']['matches'] ) ) {
						$full_icons = array_merge( $full_icons, $found_icon['post_content']['icons']['matches'] );
						foreach ( array_unique( $found_icon['post_content']['icons']['matches'] ) as $key => $icon ) {
							$css_class = '';
							if ( isset( $this->icon_map[ $icon ] ) && true === $this->icon_map[ $icon ]['is_fa4_icon'] ) {
								$css_class = $fa_4_class;
							}

							echo '<span' . $css_class . '>' . esc_html( $icon ) . '</span>'; // phpcs:ignore WordPress.Security.EscapeOutput
						}
					} elseif ( isset( $found_icon['widget']['icons']['matches'] ) ) {
						$full_icons = array_merge( $full_icons, $found_icon['widget']['icons']['matches'] );
						foreach ( array_unique( $found_icon['widget']['icons']['matches'] ) as $key => $icon ) {
							$css_class = '';
							if ( isset( $this->icon_map[ $icon ] ) && true === $this->icon_map[ $icon ]['is_fa4_icon'] ) {
								$css_class = $fa_4_class;
							}
							echo '<span' . $css_class . '>' . esc_html( $icon ) . '</span>'; // phpcs:ignore WordPress.Security.EscapeOutput
						}
					}
					?>
				</td>
				<td>
					<?php
					if ( isset( $found_icon['post_meta']['icons']['matches'] ) ) {
						$full_icons = array_merge( $full_icons, $found_icon['post_meta']['icons']['matches'] );
						foreach ( array_unique( $found_icon['post_meta']['icons']['matches'] ) as $key => $icon ) {
							$css_class = '';
							if ( isset( $this->icon_map[ $icon ] ) && true === $this->icon_map[ $icon ]['is_fa4_icon'] ) {
								$css_class = $fa_4_class;
							}
							echo '<span' . $css_class . '>' . esc_html( $icon ) . '</span>'; // phpcs:ignore WordPress.Security.EscapeOutput
						}
					}
					?>
				</td>
				<td></td>
			</tr>
			<?php
		endforeach;

		$full_icon_markup = '';
		foreach ( array_unique( $full_icons ) as $icon ) {
			$data_download = '';
			if ( isset( $this->icon_map[ $icon ] ) ) {
				$icon_link_subset   = isset( $this->icon_subsets[ $this->icon_map[ $icon ]['fa5_subset'] ] ) ? $this->icon_subsets[ $this->icon_map[ $icon ]['fa5_subset'] ] : 'solid';
				$icon_name          = $this->icon_map[ $icon ]['fa5_name'];
				$icon_download_link = esc_url_raw( admin_url( 'admin-ajax.php?action=awb_trigger_icon_download&icon_subset=' . $icon_link_subset . '&icon_name=' . $icon_name . '&awb_performance_nonce=' . wp_create_nonce( 'awb_performance_nonce' ) ) );

				$data_download = ' href="' . $icon_download_link . '" target="_blank"';
			}

			$full_icon_markup .= '<a' . $data_download . ' class="awb-download-icon-link">' . esc_html( $icon ) . '</a>';
		}
		if ( '' !== $full_icon_markup ) {
			echo '<tr class="full-list"><td><strong>' . __( 'Full List', 'Avada' ) . '<strong></td><td colspan="3">' . $full_icon_markup . '</td></tr>'; // phpcs:ignore WordPress.Security.EscapeOutput
		}

		$return_data = [
			'markup'          => ob_get_clean(),
			'recommendations' => [],
		];

		$used_subsets = [];
		foreach ( [ 'fab', 'far', 'fas', 'fal' ] as $subset ) {
			if ( false !== strpos( $full_icon_markup, ' ' . $subset ) || false !== strpos( $full_icon_markup, $subset . ' ' ) ) {
				$used_subsets[] = $subset;
			}
		}

		$labels = [
			'fab' => esc_html__( 'Brands', 'Avada' ),
			'far' => esc_html__( 'Regular', 'Avada' ),
			'fas' => esc_html__( 'Solid', 'Avada' ),
			'fal' => esc_html__( 'Light', 'Avada' ),
		];

		$icon_message = __( 'No Font Awesome icons found being used. Recommend disabling all.', 'Avada' );
		if ( ! empty( $used_subsets ) ) {
			foreach ( $used_subsets as $used_subset ) {
				$used_subset_labels[] = $labels[ $used_subset ];
			}
			/* translators: Used subset labels. */
			$icon_message = sprintf( __( 'Content has been scanned for icons, recommend selecting %s.', 'Avada' ), implode( ', ', $used_subset_labels ) );
		}

		$return_data['recommendations']['status_fontawesome'] = [
			'value'   => $used_subsets,
			'message' => $icon_message,
			'dynamic' => true,
		];

		// TODO: scan for old icons.
		$return_data['recommendations']['fontawesome_v4_compatibility'] = [
			'value'   => '0',
			'message' => __( 'Recommended to disable this and update any old icon references by editing the pages/menus.', 'Avada' ),
			'dynamic' => true,
		];

		wp_send_json_success( $return_data ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
	}

	/**
	 * Check all elements on content.
	 *
	 * @access public
	 * @since 7.4
	 * @return void
	 */
	public function element_scan() {
		global $all_fusion_builder_elements;

		$elements = [];

		// No elements found, return empty.
		if ( empty( $all_fusion_builder_elements ) ) {
			wp_send_json_success( $elements );
			die();
		}

		$content = $this->get_content();

		foreach ( $all_fusion_builder_elements as $module ) {
			if ( empty( $module['hide_from_builder'] ) ) {
				if ( false === strpos( $content, $module['shortcode'] ) ) {
					$elements[ $module['shortcode'] ] = true;
				}
			}
		}

		// Add some more checks here at some point.
		unset( $elements['fusion_alert'] );
		unset( $elements['fusion_tooltip'] );
		unset( $elements['fusion_separator'] );
		
		$dependencies = [
			'fusion_post_cards'       => [
				'fusion_tb_post_card_archives',
			],
			'fusion_woo_product_grid' => [
				'fusion_tb_woo_archives',
			],
			'fusion_blog'             => [
				'fusion_tb_archives',
			],
			'fusion_button'           => [
				'fusion_tagline',
				'fusion_form_submit',
			],
			'fusion_accordion'        => [
				'fusion_faq',
			],
			'fusion_popover'          => [
				'fusion_image_hotspots',
			],
			'fusion_images'           => [
				'fusion_tb_woo_related',
				'fusion_tb_related',
			],
		];

		foreach ( $dependencies as $needed => $needs ) {

			// If a needed element is being set to be disabled, check if that is safe.
			if ( isset( $elements[ $needed ] ) ) {
				foreach ( $needs as $need ) {

					// If the element is not disabled, then dont disable the needed one.
					if ( ! isset( $elements[ $need ] ) ) {
						unset( $elements[ $needed ] );
					}
				}
			}
		}
	
		wp_send_json_success( $elements );
	}

	/**
	 * Scans content for Google Map usage.
	 *
	 * @access public
	 * @since 7.4
	 * @return boolean
	 */
	public function scan_for_google_map() {
		$maps_count = 0;

		// Scan XML content (posts).
		$this->parse_xml();

		foreach ( $this->posts as $post ) {

			if ( 'publish' !== $post['data']['post_status'] && 'draft' !== $post['data']['post_status'] ) {
				continue;
			}

			// Get only stuff we actually use.
			$post_data = [
				'post_id'   => isset( $post['data']['post_id'] ) ? $post['data']['post_id'] : '',
				'post_type' => isset( $post['data']['post_type'] ) ? $post['data']['post_type'] : '',
			];

			if ( isset( $post['data']['post_content'] ) && '' !== $post['data']['post_content'] && false !== strpos( $post['data']['post_content'], 'fusion_map' ) ) {

				$maps_count++;

				// No need to check further.
				break;
			}

			if ( isset( $post['data']['post_type'] ) && isset( $post['data']['post_id'] ) && 'page' === $post['data']['post_type'] && 0 === $maps_count ) {

				$meta = get_post_meta( $post['data']['post_id'], '_wp_page_template', true );

				if ( 'contact.php' === $meta ) {
					$maps_count++;

					// No need to check further.
					break;
				}
			}
		}

		// Scan widgets if not found so far.
		if ( 0 === $maps_count ) {

			$all_widgets = wp_get_sidebars_widgets();
			$widgets     = [];

			foreach ( $all_widgets as $widget_area => $widget_array ) {
				foreach ( $widget_array as $widget_key ) {
					$widget               = [];
					$widget['type']       = trim( substr( $widget_key, 0, strrpos( $widget_key, '-' ) ) );
					$widget['type-index'] = trim( substr( $widget_key, strrpos( $widget_key, '-' ) + 1 ) );
					$widget['value']      = get_option( 'widget_' . $widget['type'] );
					$widget['value']      = $widget['value'][ $widget['type-index'] ];
					$widgets[]            = $widget;

					if ( false !== strpos( maybe_serialize( $widget['value'] ), 'fusion_map' ) ) {
						$maps_count++;

						// No need to check further.
						break;
					}
				}
			}
		}

		return 0 < $maps_count ? true : false;
	}

	/**
	 * Scan content for Youtube usage.
	 *
	 * @access public
	 * @since 7.4
	 * @param string $type The video type.
	 * @return boolean
	 */
	public function scan_for_videos( $type ) {
		$regex_pattern_container = get_shortcode_regex( [ 'fusion_builder_container' ] );
		$count                   = 0;

		// Scan XML content (posts).
		$this->parse_xml();

		foreach ( $this->posts as $post ) {

			if ( 'publish' !== $post['data']['post_status'] && 'draft' !== $post['data']['post_status'] ) {
				continue;
			}

			// Get only stuff we actually use.
			$post_data = [
				'post_id'   => isset( $post['data']['post_id'] ) ? $post['data']['post_id'] : '',
				'post_type' => isset( $post['data']['post_type'] ) ? $post['data']['post_type'] : '',
			];

			if ( ( isset( $post['data']['post_content'] ) && '' !== $post['data']['post_content'] ) || 'slide' === $post['data']['post_type'] ) {

				preg_match_all( "/$regex_pattern_container/s", $post['data']['post_content'], $matches );

				if ( isset( $matches[3] ) && ! empty( $matches[3] ) ) {
					foreach ( $matches[3] as $match ) {
						$atts = shortcode_parse_atts( $match );
						if ( ! empty( $atts['video_url'] ) ) {
							$video = fusion_builder_get_video_provider( $atts['video_url'] );
							if ( $type === $video['type'] ) {
								$count++;

								// No need to check further.
								break 2;
							}
						}
					}
				}

				if ( 0 === $count ) {
					if ( false !== strpos( $post['data']['post_content'], 'fusion_' . $type ) ) {
						$count++;
						// No need to check further.
						break;
					}
				}

				// Scan Fusion Slides.
				if ( 0 === $count && 'slide' === $post_data['post_type'] ) {
					$metadata = wp_parse_args( fusion_data()->post_meta( $post_data['post_id'] )->get_all_meta() );
					if ( $type === $metadata['type'] && '' !== $metadata[ $type . '_id' ] ) {
						$count++;
						// No need to check further.
						break;
					}
				}
			}
		}

		// Scan widgets if not found so far.
		if ( 0 === $count ) {
			$all_widgets = wp_get_sidebars_widgets();
			$widgets     = [];

			foreach ( $all_widgets as $widget_area => $widget_array ) {
				foreach ( $widget_array as $widget_key ) {
					$widget               = [];
					$widget['type']       = trim( substr( $widget_key, 0, strrpos( $widget_key, '-' ) ) );
					$widget['type-index'] = trim( substr( $widget_key, strrpos( $widget_key, '-' ) + 1 ) );
					$widget['value']      = get_option( 'widget_' . $widget['type'] );
					$widget['value']      = $widget['value'][ $widget['type-index'] ];
					$widgets[]            = $widget;

					preg_match_all( "/$regex_pattern_container/s", maybe_serialize( $widget['value'] ), $matches );

					if ( isset( $matches[3] ) && ! empty( $matches[3] ) ) {
						foreach ( $matches[3] as $match ) {
							$atts = shortcode_parse_atts( $match );
							if ( ! empty( $atts['video_url'] ) ) {
								$video = fusion_builder_get_video_provider( $atts['video_url'] );
								if ( $type === $video['type'] ) {
									$count++;

									// No need to check further.
									break 2;
								}
							}
						}
					}

					if ( 0 === $count ) {

						if ( false !== strpos( maybe_serialize( $widget['value'] ), 'fusion_' . $type ) ) {
							$count++;
							// No need to check further.
							break;
						}
					}
				}
			}
		}
		return 0 < $count ? true : false;
	}

	/**
	 * Scan content for mega menu usage.
	 *
	 * @access public
	 * @since 7.4
	 * @return boolean
	 */
	public function scan_for_megamenu() {
		$mega_menu_count = 0;

		// Scan XML content (posts).
		$this->parse_xml();

		foreach ( $this->posts as $post ) {

			if ( 'publish' !== $post['data']['post_status'] && 'draft' !== $post['data']['post_status'] ) {
				continue;
			}

			// Menu items have empty post_content.
			if ( 'nav_menu_item' === $post['data']['post_type'] && isset( $post['meta'] ) && is_array( $post['meta'] ) ) {

				foreach ( $post['meta'] as $meta ) {

					if ( '_menu_item_fusion_megamenu' === $meta['key'] ) {
						$values = maybe_unserialize( $meta['value'] );

						if ( 'enabled' === $values['status'] ) {
							$mega_menu_count++;
							break 2;
						}
					}
				}
			}
		}
		return 0 < $mega_menu_count ? true : false;

	}

	/**
	 * Method used to scan site content (posts for now) for used FA icons.
	 */
	public function scan_for_icons() {

		// Search for icons in following formats: "fa-gem fas", "far fa-gem".
		// Or (missing icon subset): "fa-gem".
		$regex_pattern = '/(fa[srbl]?)?\s?(fa-.[^\s"\']*)\s?(fa[srbl]?)?/';
		$found_icons   = [];

		// Scan XML content (posts).
		$this->parse_xml();

		foreach ( $this->posts as $post ) {

			if ( 'publish' !== $post['data']['post_status'] && 'draft' !== $post['data']['post_status'] ) {
				continue;
			}

			// Get only stuff we actually use.
			$post_data = [
				'post_id'    => isset( $post['data']['post_id'] ) ? $post['data']['post_id'] : '',
				'post_title' => isset( $post['data']['post_title'] ) ? $post['data']['post_title'] : '',
				'post_type'  => isset( $post['data']['post_type'] ) ? $post['data']['post_type'] : '',
			];

			if ( isset( $post['data']['post_content'] ) && '' !== $post['data']['post_content'] ) {

				preg_match_all( $regex_pattern, $post['data']['post_content'], $matches );

				/**
				 * $matches[0] - full match
				 * $matches[1] - subset, if it was before the icon code
				 * $matches[2] - icon code
				 * $matches[3] - subset, if it was after the icon code
				 */

				if ( isset( $matches[0] ) && ! empty( $matches[0] ) ) {

					$this->update_icon_map_array( $matches );

					$found_icons[] = [
						'post_content' => [
							'icons' => [
								'matches'   => $matches[0],
								'icon_code' => $matches[2],
							],
						],
						'data'         => $post_data,
					];
				}
			}

			// Menu items have empty post_content.
			if ( 'nav_menu_item' === $post['data']['post_type'] && isset( $post['meta'] ) && is_array( $post['meta'] ) ) {

				foreach ( $post['meta'] as $meta ) {

					if ( '_menu_item_fusion_megamenu' === $meta['key'] ) {

						preg_match_all( $regex_pattern, $meta['value'], $matches );

						if ( isset( $matches[0] ) && ! empty( $matches[0] ) ) {

							$this->update_icon_map_array( $matches );

							$found_icons[] = [
								'post_meta' => [
									'meta_key' => $meta['key'], // phpcs:ignore WordPress.DB.SlowDBQuery
									'icons'    => [
										'matches'   => $matches[0],
										'icon_code' => $matches[1],
									],
								],
								'data'      => $post_data,
							];
						}
					}
				}
			}
		}

		// Scan widgets.
		$all_widgets = wp_get_sidebars_widgets();
		$widgets     = [];

		foreach ( $all_widgets as $widget_area => $widget_array ) {
			foreach ( $widget_array as $widget_key ) {
				$widget               = [];
				$widget['type']       = trim( substr( $widget_key, 0, strrpos( $widget_key, '-' ) ) );
				$widget['type-index'] = trim( substr( $widget_key, strrpos( $widget_key, '-' ) + 1 ) );
				$widget['value']      = get_option( 'widget_' . $widget['type'] );
				$widget['value']      = $widget['value'][ $widget['type-index'] ];
				$widgets[]            = $widget;

				preg_match_all( $regex_pattern, maybe_serialize( $widget['value'] ), $matches );

				if ( isset( $matches[0] ) && ! empty( $matches[0] ) ) {

					$this->update_icon_map_array( $matches );

					$found_icons[] = [
						'widget' => [
							'widget_type' => $widget['type'],
							'widget_area' => $widget_area,
							'icons'       => [
								'matches'   => $matches[0],
								'icon_code' => $matches[1],
							],
						],
						'data'   => $widget,
					];
				}
			}
		}

		return $found_icons;
	}

	/**
	 * Update icon map array.
	 *
	 * @access public
	 * @param array $matches The matches array.
	 * @return void
	 */
	protected function update_icon_map_array( $matches ) {

		$shims = $this->get_icon_shims();

		if ( isset( $matches[0] ) && is_array( $matches[0] ) ) {
			$count = count( $matches[1] );
			for ( $i = 0; $i < $count; $i++ ) {

				// Skip if we have already processed this icon (match).
				if ( isset( $this->icon_map[ $matches[0][ $i ] ] ) ) {
					continue;
				}

				$icon_code   = $matches[2][ $i ];
				$icon_subset = '';
				$is_fa4_icon = false;

				// Set icon subsets.
				if ( isset( $matches[1][ $i ] ) && ! empty( $matches[1][ $i ] ) ) {
					$icon_subset = $matches[1][ $i ];
				} elseif ( isset( $matches[3][ $i ] ) && ! empty( $matches[3][ $i ] ) ) {
					$icon_subset = $matches[3][ $i ];
				}

				// It might be, we need to check if icon name or subset was changed.
				if ( isset( $shims[ $icon_code ] ) && ( '' === $icon_subset || 'fa' === $icon_subset ) ) {

					// Icon name changed.
					if ( null !== $shims[ $icon_code ][2] && 'fa-' . $shims[ $icon_code ][2] !== $icon_code ) {
						$is_fa4_icon = true;
					}

					// Icon subset changed.
					if ( null !== $shims[ $icon_code ][1] && $icon_subset !== $shims[ $icon_code ][1] ) {
						$is_fa4_icon = true;
					}
				}

				// Set defaulf subset if it is still empty.
				if ( '' === $icon_subset ) {
					$icon_subset = 'fas';
				}

				// Finally update map array.
				if ( true === $is_fa4_icon ) {
					$this->icon_map[ $matches[0][ $i ] ] = [
						'is_fa4_icon' => $is_fa4_icon,
						'fa5_name'    => isset( $shims[ $icon_code ][2] ) ? $shims[ $icon_code ][2] : null,
						'fa5_subset'  => isset( $shims[ $icon_code ][1] ) ? $shims[ $icon_code ][1] : 'fas',
					];
				} else {
					$this->icon_map[ $matches[0][ $i ] ] = [
						'is_fa4_icon' => $is_fa4_icon,
						'fa5_name'    => substr( $icon_code, 3 ),
						'fa5_subset'  => $icon_subset,
					];
				}
			}
		}
	}

	/**
	 * Get site XML contents.
	 */
	public function get_content() {
		if ( ! function_exists( 'export_wp' ) ) {
			include ABSPATH . '/wp-admin/includes/export.php';
		}

		// Mark non builder post types as not exportable.
		global $wp_post_types;
		if ( ! empty( $wp_post_types ) && class_exists( 'FusionBuilder' ) ) {
			foreach ( $wp_post_types as $key => $post_type ) {
				if ( ! in_array( $key, FusionBuilder::allowed_post_types(), true ) ) {
					$wp_post_types[ $key ]->can_export = false;
				}
			}
		}

		// Skip things we don't need.
		add_filter( 'wxr_export_skip_commentmeta', '__return_true' );
		add_filter( 'wxr_export_skip_termmeta', '__return_true' );

		ob_start();
		export_wp();

		// Prevent starting file download.
		header_remove( 'Content-Description' );
		header_remove( 'Content-Disposition' );
		header_remove( 'Content-Type' );

		return ob_get_clean();
	}

	/**
	 * Parsing site's XML content.
	 */
	public function parse_xml() {

		// Early exit if already parsed.
		if ( is_array( $this->posts ) && 0 < count( $this->posts ) ) {
			return;
		}

		$xml_string = $this->get_content();

		$reader = new XMLReader();
		$reader->xml( $xml_string );

		while ( $reader->read() ) {

			if ( XMLReader::ELEMENT !== $reader->nodeType ) {
				continue;
			}

			switch ( $reader->name ) {
				case 'item':
					$node = $reader->expand();

					$parsed = $this->parse_post_node( $node );
					if ( is_wp_error( $parsed ) ) {
						// Skip the rest of this post.
						$reader->next();
						break;
					}

					$this->posts[] = $parsed;

					// Handled everything in this node, move on to the next.
					$reader->next();
					break;
			}
		}

	}

	/**
	 * Parse a post node into post data.
	 *
	 * @param DOMElement $node Parent node of post data (typically `item`).
	 * @return array|WP_Error Post data array on success, error otherwise.
	 */
	protected function parse_post_node( $node ) {
		$data     = [];
		$meta     = [];
		$comments = [];
		$terms    = [];

		foreach ( $node->childNodes as $child ) {
			// We only care about child elements.
			if ( XML_ELEMENT_NODE !== $child->nodeType ) {
				continue;
			}

			switch ( $child->tagName ) {
				case 'wp:post_type':
					$data['post_type'] = $child->textContent;
					break;

				case 'title':
					$data['post_title'] = $child->textContent;
					break;

				case 'guid':
					$data['guid'] = $child->textContent;
					break;

				case 'dc:creator':
					$data['post_author'] = $child->textContent;
					break;

				case 'content:encoded':
					$data['post_content'] = $child->textContent;
					break;

				case 'excerpt:encoded':
					$data['post_excerpt'] = $child->textContent;
					break;

				case 'wp:post_id':
					$data['post_id'] = $child->textContent;
					break;

				case 'wp:post_date':
					$data['post_date'] = $child->textContent;
					break;

				case 'wp:post_date_gmt':
					$data['post_date_gmt'] = $child->textContent;
					break;

				case 'wp:comment_status':
					$data['comment_status'] = $child->textContent;
					break;

				case 'wp:ping_status':
					$data['ping_status'] = $child->textContent;
					break;

				case 'wp:post_name':
					$data['post_name'] = $child->textContent;
					break;

				case 'wp:status':
					$data['post_status'] = $child->textContent;

					if ( 'auto-draft' === $data['post_status'] ) {
						// Bail now.
						return new WP_Error(
							'wxr_importer.post.cannot_import_draft',
							__( 'Cannot import auto-draft posts', 'Avada' ),
							$data
						);
					}
					break;

				case 'wp:post_parent':
					$data['post_parent'] = $child->textContent;
					break;

				case 'wp:menu_order':
					$data['menu_order'] = $child->textContent;
					break;

				case 'wp:post_password':
					$data['post_password'] = $child->textContent;
					break;

				case 'wp:is_sticky':
					$data['is_sticky'] = $child->textContent;
					break;

				case 'wp:attachment_url':
					$data['attachment_url'] = $child->textContent;
					break;

				case 'wp:postmeta':
					$meta_item = $this->parse_meta_node( $child );
					if ( ! empty( $meta_item ) ) {
						$meta[] = $meta_item;
					}
					break;
			}
		}

		return compact( 'data', 'meta' );
	}

	/**
	 * Parse a meta node into meta data.
	 *
	 * @param DOMElement $node Parent node of meta data (typically `wp:postmeta` or `wp:commentmeta`).
	 * @return array|null Meta data array on success, or null on error.
	 */
	protected function parse_meta_node( $node ) {

		foreach ( $node->childNodes as $child ) {
			// We only care about child elements.
			if ( XML_ELEMENT_NODE !== $child->nodeType ) {
				continue;
			}

			switch ( $child->tagName ) {
				case 'wp:meta_key':
					$key = $child->textContent;
					break;

				case 'wp:meta_value':
					$value = $child->textContent;
					break;
			}
		}

		if ( empty( $key ) || empty( $value ) ) {
			return null;
		}

		return compact( 'key', 'value' );
	}

	/**
	 * Render header specifically for wizard.
	 *
	 * @param string $screen_classes Classes for page.
	 * @return void
	 */
	public function render_header( $screen_classes ) {
		?>
		<div class="<?php echo esc_html( $screen_classes ); ?>">
			<header class="avada-db-header-main">
				<div class="avada-db-header-main-container">
					<a class="avada-db-logo" href="<?php echo esc_url( admin_url( 'admin.php?page=avada' ) ); ?>" aria-label="<?php esc_attr_e( 'Link to Avada dashboard', 'Avada' ); ?>">
						<i class="avada-db-logo-icon fusiona-avada-logo"></i>
						<div class="heading"><?php esc_html_e( 'Performance Wizard', 'Avada' ); ?></div>
					</a>
					<div class="wizard-hero-header">
						<a class="button button-primary" target="_blank" href="https://developers.google.com/speed/pagespeed/insights/?url=<?php echo rawurlencode( trailingslashit( get_home_url() ) ); ?>"><?php esc_html_e( 'Run PageSpeed Insights', 'Avada' ); ?></a>
					</div>
				</div>
			</header>
			<header class="avada-db-header-sticky avada-db-card awb-wizard-steps">
				<ol>
					<li class="awb-wizard-link active" data-id="1"><span class="awb-wizard-link-text"><?php esc_html_e( 'Start', 'Avada' ); ?></span></li>
					<li class="awb-wizard-link" data-id="2"><span class="awb-wizard-link-text"><?php esc_html_e( 'Features', 'Avada' ); ?></span></li>
					<li class="awb-wizard-link" data-id="3"><span class="awb-wizard-link-text"><?php esc_html_e( 'Icons', 'Avada' ); ?></span></li>
					<li class="awb-wizard-link" data-id="4"><span class="awb-wizard-link-text"><?php esc_html_e( 'Fonts', 'Avada' ); ?></span></li>
					<li class="awb-wizard-link" data-id="5"><span class="awb-wizard-link-text"><?php esc_html_e( 'Elements', 'Avada' ); ?></span></li>
					<li class="awb-wizard-link" data-id="6"><span class="awb-wizard-link-text"><?php esc_html_e( 'Optimization', 'Avada' ); ?></span></li>
					<li class="awb-wizard-link" data-id="7"><span class="awb-wizard-link-text"><?php esc_html_e( 'Finish', 'Avada' ); ?></span></li>
				</ol>
			</header>

			<div class="avada-db-demos-notices"><h1></h1> <?php do_action( 'avada_dashboard_notices' ); ?></div>
		<?php
	}

	/**
	 * Get FA 4 icon shims.
	 *
	 * @return array
	 */
	public function get_icon_shims() {

		return [
			'fa-glass'                => [ 'glass', null, 'glass-martini' ],
			'fa-meetup'               => [ 'meetup', 'fab', null ],
			'fa-star-o'               => [ 'star-o', 'far', 'star' ],
			'fa-remove'               => [ 'remove', null, 'times' ],
			'fa-close'                => [ 'close', null, 'times' ],
			'fa-gear'                 => [ 'gear', null, 'cog' ],
			'fa-trash-o'              => [ 'trash-o', 'far', 'trash-alt' ],
			'fa-file-o'               => [ 'file-o', 'far', 'file' ],
			'fa-clock-o'              => [ 'clock-o', 'far', 'clock' ],
			'fa-arrow-circle-o-down'  => [ 'arrow-circle-o-down', 'far', 'arrow-alt-circle-down' ],
			'fa-arrow-circle-o-up'    => [ 'arrow-circle-o-up', 'far', 'arrow-alt-circle-up' ],
			'fa-play-circle-o'        => [ 'play-circle-o', 'far', 'play-circle' ],
			'fa-repeat'               => [ 'repeat', null, 'redo' ],
			'fa-rotate-right'         => [ 'rotate-right', null, 'redo' ],
			'fa-refresh'              => [ 'refresh', null, 'sync' ],
			'fa-list-alt'             => [ 'list-alt', 'far', null ],
			'fa-dedent'               => [ 'dedent', null, 'outdent' ],
			'fa-video-camera'         => [ 'video-camera', null, 'video' ],
			'fa-picture-o'            => [ 'picture-o', 'far', 'image' ],
			'fa-photo'                => [ 'photo', 'far', 'image' ],
			'fa-image'                => [ 'image', 'far', 'image' ],
			'fa-pencil'               => [ 'pencil', null, 'pencil-alt' ],
			'fa-map-marker'           => [ 'map-marker', null, 'map-marker-alt' ],
			'fa-pencil-square-o'      => [ 'pencil-square-o', 'far', 'edit' ],
			'fa-share-square-o'       => [ 'share-square-o', 'far', 'share-square' ],
			'fa-check-square-o'       => [ 'check-square-o', 'far', 'check-square' ],
			'fa-arrows'               => [ 'arrows', null, 'arrows-alt' ],
			'fa-times-circle-o'       => [ 'times-circle-o', 'far', 'times-circle' ],
			'fa-check-circle-o'       => [ 'check-circle-o', 'far', 'check-circle' ],
			'fa-mail-forward'         => [ 'mail-forward', null, 'share' ],
			'fa-expand'               => [ 'expand', null, 'expand-alt' ],
			'fa-compress'             => [ 'compress', null, 'compress-alt' ],
			'fa-eye'                  => [ 'eye', 'far', null ],
			'fa-eye-slash'            => [ 'eye-slash', 'far', null ],
			'fa-warning'              => [ 'warning', null, 'exclamation-triangle' ],
			'fa-calendar'             => [ 'calendar', null, 'calendar-alt' ],
			'fa-arrows-v'             => [ 'arrows-v', null, 'arrows-alt-v' ],
			'fa-arrows-h'             => [ 'arrows-h', null, 'arrows-alt-h' ],
			'fa-bar-chart'            => [ 'bar-chart', 'far', 'chart-bar' ],
			'fa-bar-chart-o'          => [ 'bar-chart-o', 'far', 'chart-bar' ],
			'fa-twitter-square'       => [ 'twitter-square', 'fab', null ],
			'fa-facebook-square'      => [ 'facebook-square', 'fab', null ],
			'fa-gears'                => [ 'gears', null, 'cogs' ],
			'fa-thumbs-o-up'          => [ 'thumbs-o-up', 'far', 'thumbs-up' ],
			'fa-thumbs-o-down'        => [ 'thumbs-o-down', 'far', 'thumbs-down' ],
			'fa-heart-o'              => [ 'heart-o', 'far', 'heart' ],
			'fa-sign-out'             => [ 'sign-out', null, 'sign-out-alt' ],
			'fa-linkedin-square'      => [ 'linkedin-square', 'fab', 'linkedin' ],
			'fa-thumb-tack'           => [ 'thumb-tack', null, 'thumbtack' ],
			'fa-external-link'        => [ 'external-link', null, 'external-link-alt' ],
			'fa-sign-in'              => [ 'sign-in', null, 'sign-in-alt' ],
			'fa-github-square'        => [ 'github-square', 'fab', null ],
			'fa-lemon-o'              => [ 'lemon-o', 'far', 'lemon' ],
			'fa-square-o'             => [ 'square-o', 'far', 'square' ],
			'fa-bookmark-o'           => [ 'bookmark-o', 'far', 'bookmark' ],
			'fa-twitter'              => [ 'twitter', 'fab', null ],
			'fa-facebook'             => [ 'facebook', 'fab', 'facebook-f' ],
			'fa-facebook-f'           => [ 'facebook-f', 'fab', 'facebook-f' ],
			'fa-github'               => [ 'github', 'fab', null ],
			'fa-credit-card'          => [ 'credit-card', 'far', null ],
			'fa-feed'                 => [ 'feed', null, 'rss' ],
			'fa-hdd-o'                => [ 'hdd-o', 'far', 'hdd' ],
			'fa-hand-o-right'         => [ 'hand-o-right', 'far', 'hand-point-right' ],
			'fa-hand-o-left'          => [ 'hand-o-left', 'far', 'hand-point-left' ],
			'fa-hand-o-up'            => [ 'hand-o-up', 'far', 'hand-point-up' ],
			'fa-hand-o-down'          => [ 'hand-o-down', 'far', 'hand-point-down' ],
			'fa-arrows-alt'           => [ 'arrows-alt', null, 'expand-arrows-alt' ],
			'fa-group'                => [ 'group', null, 'users' ],
			'fa-chain'                => [ 'chain', null, 'link' ],
			'fa-scissors'             => [ 'scissors', null, 'cut' ],
			'fa-files-o'              => [ 'files-o', 'far', 'copy' ],
			'fa-floppy-o'             => [ 'floppy-o', 'far', 'save' ],
			'fa-navicon'              => [ 'navicon', null, 'bars' ],
			'fa-reorder'              => [ 'reorder', null, 'bars' ],
			'fa-pinterest'            => [ 'pinterest', 'fab', null ],
			'fa-pinterest-square'     => [ 'pinterest-square', 'fab', null ],
			'fa-google-plus-square'   => [ 'google-plus-square', 'fab', null ],
			'fa-google-plus'          => [ 'google-plus', 'fab', 'google-plus-g' ],
			'fa-money'                => [ 'money', 'far', 'money-bill-alt' ],
			'fa-unsorted'             => [ 'unsorted', null, 'sort' ],
			'fa-sort-desc'            => [ 'sort-desc', null, 'sort-down' ],
			'fa-sort-asc'             => [ 'sort-asc', null, 'sort-up' ],
			'fa-linkedin'             => [ 'linkedin', 'fab', 'linkedin-in' ],
			'fa-rotate-left'          => [ 'rotate-left', null, 'undo' ],
			'fa-legal'                => [ 'legal', null, 'gavel' ],
			'fa-tachometer'           => [ 'tachometer', null, 'tachometer-alt' ],
			'fa-dashboard'            => [ 'dashboard', null, 'tachometer-alt' ],
			'fa-comment-o'            => [ 'comment-o', 'far', 'comment' ],
			'fa-comments-o'           => [ 'comments-o', 'far', 'comments' ],
			'fa-flash'                => [ 'flash', null, 'bolt' ],
			'fa-clipboard'            => [ 'clipboard', 'far', null ],
			'fa-paste'                => [ 'paste', 'far', 'clipboard' ],
			'fa-lightbulb-o'          => [ 'lightbulb-o', 'far', 'lightbulb' ],
			'fa-exchange'             => [ 'exchange', null, 'exchange-alt' ],
			'fa-cloud-download'       => [ 'cloud-download', null, 'cloud-download-alt' ],
			'fa-cloud-upload'         => [ 'cloud-upload', null, 'cloud-upload-alt' ],
			'fa-bell-o'               => [ 'bell-o', 'far', 'bell' ],
			'fa-cutlery'              => [ 'cutlery', null, 'utensils' ],
			'fa-file-text-o'          => [ 'file-text-o', 'far', 'file-alt' ],
			'fa-building-o'           => [ 'building-o', 'far', 'building' ],
			'fa-hospital-o'           => [ 'hospital-o', 'far', 'hospital' ],
			'fa-tablet'               => [ 'tablet', null, 'tablet-alt' ],
			'fa-mobile'               => [ 'mobile', null, 'mobile-alt' ],
			'fa-mobile-phone'         => [ 'mobile-phone', null, 'mobile-alt' ],
			'fa-circle-o'             => [ 'circle-o', 'far', 'circle' ],
			'fa-mail-reply'           => [ 'mail-reply', null, 'reply' ],
			'fa-github-alt'           => [ 'github-alt', 'fab', null ],
			'fa-folder-o'             => [ 'folder-o', 'far', 'folder' ],
			'fa-folder-open-o'        => [ 'folder-open-o', 'far', 'folder-open' ],
			'fa-smile-o'              => [ 'smile-o', 'far', 'smile' ],
			'fa-frown-o'              => [ 'frown-o', 'far', 'frown' ],
			'fa-meh-o'                => [ 'meh-o', 'far', 'meh' ],
			'fa-keyboard-o'           => [ 'keyboard-o', 'far', 'keyboard' ],
			'fa-flag-o'               => [ 'flag-o', 'far', 'flag' ],
			'fa-mail-reply-all'       => [ 'mail-reply-all', null, 'reply-all' ],
			'fa-star-half-o'          => [ 'star-half-o', 'far', 'star-half' ],
			'fa-star-half-empty'      => [ 'star-half-empty', 'far', 'star-half' ],
			'fa-star-half-full'       => [ 'star-half-full', 'far', 'star-half' ],
			'fa-code-fork'            => [ 'code-fork', null, 'code-branch' ],
			'fa-chain-broken'         => [ 'chain-broken', null, 'unlink' ],
			'fa-shield'               => [ 'shield', null, 'shield-alt' ],
			'fa-calendar-o'           => [ 'calendar-o', 'far', 'calendar' ],
			'fa-maxcdn'               => [ 'maxcdn', 'fab', null ],
			'fa-html5'                => [ 'html5', 'fab', null ],
			'fa-css3'                 => [ 'css3', 'fab', null ],
			'fa-ticket'               => [ 'ticket', null, 'ticket-alt' ],
			'fa-minus-square-o'       => [ 'minus-square-o', 'far', 'minus-square' ],
			'fa-level-up'             => [ 'level-up', null, 'level-up-alt' ],
			'fa-level-down'           => [ 'level-down', null, 'level-down-alt' ],
			'fa-pencil-square'        => [ 'pencil-square', null, 'pen-square' ],
			'fa-external-link-square' => [ 'external-link-square', null, 'external-link-square-alt' ],
			'fa-compass'              => [ 'compass', 'far', null ],
			'fa-caret-square-o-down'  => [ 'caret-square-o-down', 'far', 'caret-square-down' ],
			'fa-toggle-down'          => [ 'toggle-down', 'far', 'caret-square-down' ],
			'fa-caret-square-o-up'    => [ 'caret-square-o-up', 'far', 'caret-square-up' ],
			'fa-toggle-up'            => [ 'toggle-up', 'far', 'caret-square-up' ],
			'fa-caret-square-o-right' => [ 'caret-square-o-right', 'far', 'caret-square-right' ],
			'fa-toggle-right'         => [ 'toggle-right', 'far', 'caret-square-right' ],
			'fa-eur'                  => [ 'eur', null, 'euro-sign' ],
			'fa-euro'                 => [ 'euro', null, 'euro-sign' ],
			'fa-gbp'                  => [ 'gbp', null, 'pound-sign' ],
			'fa-usd'                  => [ 'usd', null, 'dollar-sign' ],
			'fa-dollar'               => [ 'dollar', null, 'dollar-sign' ],
			'fa-inr'                  => [ 'inr', null, 'rupee-sign' ],
			'fa-rupee'                => [ 'rupee', null, 'rupee-sign' ],
			'fa-jpy'                  => [ 'jpy', null, 'yen-sign' ],
			'fa-cny'                  => [ 'cny', null, 'yen-sign' ],
			'fa-rmb'                  => [ 'rmb', null, 'yen-sign' ],
			'fa-yen'                  => [ 'yen', null, 'yen-sign' ],
			'fa-rub'                  => [ 'rub', null, 'ruble-sign' ],
			'fa-ruble'                => [ 'ruble', null, 'ruble-sign' ],
			'fa-rouble'               => [ 'rouble', null, 'ruble-sign' ],
			'fa-krw'                  => [ 'krw', null, 'won-sign' ],
			'fa-won'                  => [ 'won', null, 'won-sign' ],
			'fa-btc'                  => [ 'btc', 'fab', null ],
			'fa-bitcoin'              => [ 'bitcoin', 'fab', 'btc' ],
			'fa-file-text'            => [ 'file-text', null, 'file-alt' ],
			'fa-sort-alpha-asc'       => [ 'sort-alpha-asc', null, 'sort-alpha-down' ],
			'fa-sort-alpha-desc'      => [ 'sort-alpha-desc', null, 'sort-alpha-down-alt' ],
			'fa-sort-amount-asc'      => [ 'sort-amount-asc', null, 'sort-amount-down' ],
			'fa-sort-amount-desc'     => [ 'sort-amount-desc', null, 'sort-amount-down-alt' ],
			'fa-sort-numeric-asc'     => [ 'sort-numeric-asc', null, 'sort-numeric-down' ],
			'fa-sort-numeric-desc'    => [ 'sort-numeric-desc', null, 'sort-numeric-down-alt' ],
			'fa-youtube-square'       => [ 'youtube-square', 'fab', null ],
			'fa-youtube'              => [ 'youtube', 'fab', null ],
			'fa-xing'                 => [ 'xing', 'fab', null ],
			'fa-xing-square'          => [ 'xing-square', 'fab', null ],
			'fa-youtube-play'         => [ 'youtube-play', 'fab', 'youtube' ],
			'fa-dropbox'              => [ 'dropbox', 'fab', null ],
			'fa-stack-overflow'       => [ 'stack-overflow', 'fab', null ],
			'fa-instagram'            => [ 'instagram', 'fab', null ],
			'fa-flickr'               => [ 'flickr', 'fab', null ],
			'fa-adn'                  => [ 'adn', 'fab', null ],
			'fa-bitbucket'            => [ 'bitbucket', 'fab', null ],
			'fa-bitbucket-square'     => [ 'bitbucket-square', 'fab', 'bitbucket' ],
			'fa-tumblr'               => [ 'tumblr', 'fab', null ],
			'fa-tumblr-square'        => [ 'tumblr-square', 'fab', null ],
			'fa-long-arrow-down'      => [ 'long-arrow-down', null, 'long-arrow-alt-down' ],
			'fa-long-arrow-up'        => [ 'long-arrow-up', null, 'long-arrow-alt-up' ],
			'fa-long-arrow-left'      => [ 'long-arrow-left', null, 'long-arrow-alt-left' ],
			'fa-long-arrow-right'     => [ 'long-arrow-right', null, 'long-arrow-alt-right' ],
			'fa-apple'                => [ 'apple', 'fab', null ],
			'fa-windows'              => [ 'windows', 'fab', null ],
			'fa-android'              => [ 'android', 'fab', null ],
			'fa-linux'                => [ 'linux', 'fab', null ],
			'fa-dribbble'             => [ 'dribbble', 'fab', null ],
			'fa-skype'                => [ 'skype', 'fab', null ],
			'fa-foursquare'           => [ 'foursquare', 'fab', null ],
			'fa-trello'               => [ 'trello', 'fab', null ],
			'fa-gratipay'             => [ 'gratipay', 'fab', null ],
			'fa-gittip'               => [ 'gittip', 'fab', 'gratipay' ],
			'fa-sun-o'                => [ 'sun-o', 'far', 'sun' ],
			'fa-moon-o'               => [ 'moon-o', 'far', 'moon' ],
			'fa-vk'                   => [ 'vk', 'fab', null ],
			'fa-weibo'                => [ 'weibo', 'fab', null ],
			'fa-renren'               => [ 'renren', 'fab', null ],
			'fa-pagelines'            => [ 'pagelines', 'fab', null ],
			'fa-stack-exchange'       => [ 'stack-exchange', 'fab', null ],
			'fa-arrow-circle-o-right' => [ 'arrow-circle-o-right', 'far', 'arrow-alt-circle-right' ],
			'fa-arrow-circle-o-left'  => [ 'arrow-circle-o-left', 'far', 'arrow-alt-circle-left' ],
			'fa-caret-square-o-left'  => [ 'caret-square-o-left', 'far', 'caret-square-left' ],
			'fa-toggle-left'          => [ 'toggle-left', 'far', 'caret-square-left' ],
			'fa-dot-circle-o'         => [ 'dot-circle-o', 'far', 'dot-circle' ],
			'fa-vimeo-square'         => [ 'vimeo-square', 'fab', null ],
			'fa-try'                  => [ 'try', null, 'lira-sign' ],
			'fa-turkish-lira'         => [ 'turkish-lira', null, 'lira-sign' ],
			'fa-plus-square-o'        => [ 'plus-square-o', 'far', 'plus-square' ],
			'fa-slack'                => [ 'slack', 'fab', null ],
			'fa-wordpress'            => [ 'wordpress', 'fab', null ],
			'fa-openid'               => [ 'openid', 'fab', null ],
			'fa-institution'          => [ 'institution', null, 'university' ],
			'fa-bank'                 => [ 'bank', null, 'university' ],
			'fa-mortar-board'         => [ 'mortar-board', null, 'graduation-cap' ],
			'fa-yahoo'                => [ 'yahoo', 'fab', null ],
			'fa-google'               => [ 'google', 'fab', null ],
			'fa-reddit'               => [ 'reddit', 'fab', null ],
			'fa-reddit-square'        => [ 'reddit-square', 'fab', null ],
			'fa-stumbleupon-circle'   => [ 'stumbleupon-circle', 'fab', null ],
			'fa-stumbleupon'          => [ 'stumbleupon', 'fab', null ],
			'fa-delicious'            => [ 'delicious', 'fab', null ],
			'fa-digg'                 => [ 'digg', 'fab', null ],
			'fa-pied-piper-pp'        => [ 'pied-piper-pp', 'fab', null ],
			'fa-pied-piper-alt'       => [ 'pied-piper-alt', 'fab', null ],
			'fa-drupal'               => [ 'drupal', 'fab', null ],
			'fa-joomla'               => [ 'joomla', 'fab', null ],
			'fa-spoon'                => [ 'spoon', null, 'utensil-spoon' ],
			'fa-behance'              => [ 'behance', 'fab', null ],
			'fa-behance-square'       => [ 'behance-square', 'fab', null ],
			'fa-steam'                => [ 'steam', 'fab', null ],
			'fa-steam-square'         => [ 'steam-square', 'fab', null ],
			'fa-automobile'           => [ 'automobile', null, 'car' ],
			'fa-envelope-o'           => [ 'envelope-o', 'far', 'envelope' ],
			'fa-spotify'              => [ 'spotify', 'fab', null ],
			'fa-deviantart'           => [ 'deviantart', 'fab', null ],
			'fa-soundcloud'           => [ 'soundcloud', 'fab', null ],
			'fa-file-pdf-o'           => [ 'file-pdf-o', 'far', 'file-pdf' ],
			'fa-file-word-o'          => [ 'file-word-o', 'far', 'file-word' ],
			'fa-file-excel-o'         => [ 'file-excel-o', 'far', 'file-excel' ],
			'fa-file-powerpoint-o'    => [ 'file-powerpoint-o', 'far', 'file-powerpoint' ],
			'fa-file-image-o'         => [ 'file-image-o', 'far', 'file-image' ],
			'fa-file-photo-o'         => [ 'file-photo-o', 'far', 'file-image' ],
			'fa-file-picture-o'       => [ 'file-picture-o', 'far', 'file-image' ],
			'fa-file-archive-o'       => [ 'file-archive-o', 'far', 'file-archive' ],
			'fa-file-zip-o'           => [ 'file-zip-o', 'far', 'file-archive' ],
			'fa-file-audio-o'         => [ 'file-audio-o', 'far', 'file-audio' ],
			'fa-file-sound-o'         => [ 'file-sound-o', 'far', 'file-audio' ],
			'fa-file-video-o'         => [ 'file-video-o', 'far', 'file-video' ],
			'fa-file-movie-o'         => [ 'file-movie-o', 'far', 'file-video' ],
			'fa-file-code-o'          => [ 'file-code-o', 'far', 'file-code' ],
			'fa-vine'                 => [ 'vine', 'fab', null ],
			'fa-codepen'              => [ 'codepen', 'fab', null ],
			'fa-jsfiddle'             => [ 'jsfiddle', 'fab', null ],
			'fa-life-ring'            => [ 'life-ring', 'far', null ],
			'fa-life-bouy'            => [ 'life-bouy', 'far', 'life-ring' ],
			'fa-life-buoy'            => [ 'life-buoy', 'far', 'life-ring' ],
			'fa-life-saver'           => [ 'life-saver', 'far', 'life-ring' ],
			'fa-support'              => [ 'support', 'far', 'life-ring' ],
			'fa-circle-o-notch'       => [ 'circle-o-notch', null, 'circle-notch' ],
			'fa-rebel'                => [ 'rebel', 'fab', null ],
			'fa-ra'                   => [ 'ra', 'fab', 'rebel' ],
			'fa-resistance'           => [ 'resistance', 'fab', 'rebel' ],
			'fa-empire'               => [ 'empire', 'fab', null ],
			'fa-ge'                   => [ 'ge', 'fab', 'empire' ],
			'fa-git-square'           => [ 'git-square', 'fab', null ],
			'fa-git'                  => [ 'git', 'fab', null ],
			'fa-hacker-news'          => [ 'hacker-news', 'fab', null ],
			'fa-y-combinator-square'  => [ 'y-combinator-square', 'fab', 'hacker-news' ],
			'fa-yc-square'            => [ 'yc-square', 'fab', 'hacker-news' ],
			'fa-tencent-weibo'        => [ 'tencent-weibo', 'fab', null ],
			'fa-qq'                   => [ 'qq', 'fab', null ],
			'fa-weixin'               => [ 'weixin', 'fab', null ],
			'fa-wechat'               => [ 'wechat', 'fab', 'weixin' ],
			'fa-send'                 => [ 'send', null, 'paper-plane' ],
			'fa-paper-plane-o'        => [ 'paper-plane-o', 'far', 'paper-plane' ],
			'fa-send-o'               => [ 'send-o', 'far', 'paper-plane' ],
			'fa-circle-thin'          => [ 'circle-thin', 'far', 'circle' ],
			'fa-header'               => [ 'header', null, 'heading' ],
			'fa-sliders'              => [ 'sliders', null, 'sliders-h' ],
			'fa-futbol-o'             => [ 'futbol-o', 'far', 'futbol' ],
			'fa-soccer-ball-o'        => [ 'soccer-ball-o', 'far', 'futbol' ],
			'fa-slideshare'           => [ 'slideshare', 'fab', null ],
			'fa-twitch'               => [ 'twitch', 'fab', null ],
			'fa-yelp'                 => [ 'yelp', 'fab', null ],
			'fa-newspaper-o'          => [ 'newspaper-o', 'far', 'newspaper' ],
			'fa-paypal'               => [ 'paypal', 'fab', null ],
			'fa-google-wallet'        => [ 'google-wallet', 'fab', null ],
			'fa-cc-visa'              => [ 'cc-visa', 'fab', null ],
			'fa-cc-mastercard'        => [ 'cc-mastercard', 'fab', null ],
			'fa-cc-discover'          => [ 'cc-discover', 'fab', null ],
			'fa-cc-amex'              => [ 'cc-amex', 'fab', null ],
			'fa-cc-paypal'            => [ 'cc-paypal', 'fab', null ],
			'fa-cc-stripe'            => [ 'cc-stripe', 'fab', null ],
			'fa-bell-slash-o'         => [ 'bell-slash-o', 'far', 'bell-slash' ],
			'fa-trash'                => [ 'trash', null, 'trash-alt' ],
			'fa-copyright'            => [ 'copyright', 'far', null ],
			'fa-eyedropper'           => [ 'eyedropper', null, 'eye-dropper' ],
			'fa-area-chart'           => [ 'area-chart', null, 'chart-area' ],
			'fa-pie-chart'            => [ 'pie-chart', null, 'chart-pie' ],
			'fa-line-chart'           => [ 'line-chart', null, 'chart-line' ],
			'fa-lastfm'               => [ 'lastfm', 'fab', null ],
			'fa-lastfm-square'        => [ 'lastfm-square', 'fab', null ],
			'fa-ioxhost'              => [ 'ioxhost', 'fab', null ],
			'fa-angellist'            => [ 'angellist', 'fab', null ],
			'fa-cc'                   => [ 'cc', 'far', 'closed-captioning' ],
			'fa-ils'                  => [ 'ils', null, 'shekel-sign' ],
			'fa-shekel'               => [ 'shekel', null, 'shekel-sign' ],
			'fa-sheqel'               => [ 'sheqel', null, 'shekel-sign' ],
			'fa-meanpath'             => [ 'meanpath', 'fab', 'font-awesome' ],
			'fa-buysellads'           => [ 'buysellads', 'fab', null ],
			'fa-connectdevelop'       => [ 'connectdevelop', 'fab', null ],
			'fa-dashcube'             => [ 'dashcube', 'fab', null ],
			'fa-forumbee'             => [ 'forumbee', 'fab', null ],
			'fa-leanpub'              => [ 'leanpub', 'fab', null ],
			'fa-sellsy'               => [ 'sellsy', 'fab', null ],
			'fa-shirtsinbulk'         => [ 'shirtsinbulk', 'fab', null ],
			'fa-simplybuilt'          => [ 'simplybuilt', 'fab', null ],
			'fa-skyatlas'             => [ 'skyatlas', 'fab', null ],
			'fa-diamond'              => [ 'diamond', 'far', 'gem' ],
			'fa-intersex'             => [ 'intersex', null, 'transgender' ],
			'fa-facebook-official'    => [ 'facebook-official', 'fab', 'facebook' ],
			'fa-pinterest-p'          => [ 'pinterest-p', 'fab', null ],
			'fa-whatsapp'             => [ 'whatsapp', 'fab', null ],
			'fa-hotel'                => [ 'hotel', null, 'bed' ],
			'fa-viacoin'              => [ 'viacoin', 'fab', null ],
			'fa-medium'               => [ 'medium', 'fab', null ],
			'fa-y-combinator'         => [ 'y-combinator', 'fab', null ],
			'fa-yc'                   => [ 'yc', 'fab', 'y-combinator' ],
			'fa-optin-monster'        => [ 'optin-monster', 'fab', null ],
			'fa-opencart'             => [ 'opencart', 'fab', null ],
			'fa-expeditedssl'         => [ 'expeditedssl', 'fab', null ],
			'fa-battery-4'            => [ 'battery-4', null, 'battery-full' ],
			'fa-battery'              => [ 'battery', null, 'battery-full' ],
			'fa-battery-3'            => [ 'battery-3', null, 'battery-three-quarters' ],
			'fa-battery-2'            => [ 'battery-2', null, 'battery-half' ],
			'fa-battery-1'            => [ 'battery-1', null, 'battery-quarter' ],
			'fa-battery-0'            => [ 'battery-0', null, 'battery-empty' ],
			'fa-object-group'         => [ 'object-group', 'far', null ],
			'fa-object-ungroup'       => [ 'object-ungroup', 'far', null ],
			'fa-sticky-note-o'        => [ 'sticky-note-o', 'far', 'sticky-note' ],
			'fa-cc-jcb'               => [ 'cc-jcb', 'fab', null ],
			'fa-cc-diners-club'       => [ 'cc-diners-club', 'fab', null ],
			'fa-clone'                => [ 'clone', 'far', null ],
			'fa-hourglass-o'          => [ 'hourglass-o', 'far', 'hourglass' ],
			'fa-hourglass-1'          => [ 'hourglass-1', null, 'hourglass-start' ],
			'fa-hourglass-2'          => [ 'hourglass-2', null, 'hourglass-half' ],
			'fa-hourglass-3'          => [ 'hourglass-3', null, 'hourglass-end' ],
			'fa-hand-rock-o'          => [ 'hand-rock-o', 'far', 'hand-rock' ],
			'fa-hand-grab-o'          => [ 'hand-grab-o', 'far', 'hand-rock' ],
			'fa-hand-paper-o'         => [ 'hand-paper-o', 'far', 'hand-paper' ],
			'fa-hand-stop-o'          => [ 'hand-stop-o', 'far', 'hand-paper' ],
			'fa-hand-scissors-o'      => [ 'hand-scissors-o', 'far', 'hand-scissors' ],
			'fa-hand-lizard-o'        => [ 'hand-lizard-o', 'far', 'hand-lizard' ],
			'fa-hand-spock-o'         => [ 'hand-spock-o', 'far', 'hand-spock' ],
			'fa-hand-pointer-o'       => [ 'hand-pointer-o', 'far', 'hand-pointer' ],
			'fa-hand-peace-o'         => [ 'hand-peace-o', 'far', 'hand-peace' ],
			'fa-registered'           => [ 'registered', 'far', null ],
			'fa-creative-commons'     => [ 'creative-commons', 'fab', null ],
			'fa-gg'                   => [ 'gg', 'fab', null ],
			'fa-gg-circle'            => [ 'gg-circle', 'fab', null ],
			'fa-tripadvisor'          => [ 'tripadvisor', 'fab', null ],
			'fa-odnoklassniki'        => [ 'odnoklassniki', 'fab', null ],
			'fa-odnoklassniki-square' => [ 'odnoklassniki-square', 'fab', null ],
			'fa-get-pocket'           => [ 'get-pocket', 'fab', null ],
			'fa-wikipedia-w'          => [ 'wikipedia-w', 'fab', null ],
			'fa-safari'               => [ 'safari', 'fab', null ],
			'fa-chrome'               => [ 'chrome', 'fab', null ],
			'fa-firefox'              => [ 'firefox', 'fab', null ],
			'fa-opera'                => [ 'opera', 'fab', null ],
			'fa-internet-explorer'    => [ 'internet-explorer', 'fab', null ],
			'fa-television'           => [ 'television', null, 'tv' ],
			'fa-contao'               => [ 'contao', 'fab', null ],
			'fa-500px'                => [ '500px', 'fab', null ],
			'fa-amazon'               => [ 'amazon', 'fab', null ],
			'fa-calendar-plus-o'      => [ 'calendar-plus-o', 'far', 'calendar-plus' ],
			'fa-calendar-minus-o'     => [ 'calendar-minus-o', 'far', 'calendar-minus' ],
			'fa-calendar-times-o'     => [ 'calendar-times-o', 'far', 'calendar-times' ],
			'fa-calendar-check-o'     => [ 'calendar-check-o', 'far', 'calendar-check' ],
			'fa-map-o'                => [ 'map-o', 'far', 'map' ],
			'fa-commenting'           => [ 'commenting', null, 'comment-dots' ],
			'fa-commenting-o'         => [ 'commenting-o', 'far', 'comment-dots' ],
			'fa-houzz'                => [ 'houzz', 'fab', null ],
			'fa-vimeo'                => [ 'vimeo', 'fab', 'vimeo-v' ],
			'fa-black-tie'            => [ 'black-tie', 'fab', null ],
			'fa-fonticons'            => [ 'fonticons', 'fab', null ],
			'fa-reddit-alien'         => [ 'reddit-alien', 'fab', null ],
			'fa-edge'                 => [ 'edge', 'fab', null ],
			'fa-credit-card-alt'      => [ 'credit-card-alt', null, 'credit-card' ],
			'fa-codiepie'             => [ 'codiepie', 'fab', null ],
			'fa-modx'                 => [ 'modx', 'fab', null ],
			'fa-fort-awesome'         => [ 'fort-awesome', 'fab', null ],
			'fa-usb'                  => [ 'usb', 'fab', null ],
			'fa-product-hunt'         => [ 'product-hunt', 'fab', null ],
			'fa-mixcloud'             => [ 'mixcloud', 'fab', null ],
			'fa-scribd'               => [ 'scribd', 'fab', null ],
			'fa-pause-circle-o'       => [ 'pause-circle-o', 'far', 'pause-circle' ],
			'fa-stop-circle-o'        => [ 'stop-circle-o', 'far', 'stop-circle' ],
			'fa-bluetooth'            => [ 'bluetooth', 'fab', null ],
			'fa-bluetooth-b'          => [ 'bluetooth-b', 'fab', null ],
			'fa-gitlab'               => [ 'gitlab', 'fab', null ],
			'fa-wpbeginner'           => [ 'wpbeginner', 'fab', null ],
			'fa-wpforms'              => [ 'wpforms', 'fab', null ],
			'fa-envira'               => [ 'envira', 'fab', null ],
			'fa-wheelchair-alt'       => [ 'wheelchair-alt', 'fab', 'accessible-icon' ],
			'fa-question-circle-o'    => [ 'question-circle-o', 'far', 'question-circle' ],
			'fa-volume-control-phone' => [ 'volume-control-phone', null, 'phone-volume' ],
			'fa-asl-interpreting'     => [ 'asl-interpreting', null, 'american-sign-language-interpreting' ],
			'fa-deafness'             => [ 'deafness', null, 'deaf' ],
			'fa-hard-of-hearing'      => [ 'hard-of-hearing', null, 'deaf' ],
			'fa-glide'                => [ 'glide', 'fab', null ],
			'fa-glide-g'              => [ 'glide-g', 'fab', null ],
			'fa-signing'              => [ 'signing', null, 'sign-language' ],
			'fa-viadeo'               => [ 'viadeo', 'fab', null ],
			'fa-viadeo-square'        => [ 'viadeo-square', 'fab', null ],
			'fa-snapchat'             => [ 'snapchat', 'fab', null ],
			'fa-snapchat-ghost'       => [ 'snapchat-ghost', 'fab', null ],
			'fa-snapchat-square'      => [ 'snapchat-square', 'fab', null ],
			'fa-pied-piper'           => [ 'pied-piper', 'fab', null ],
			'fa-first-order'          => [ 'first-order', 'fab', null ],
			'fa-yoast'                => [ 'yoast', 'fab', null ],
			'fa-themeisle'            => [ 'themeisle', 'fab', null ],
			'fa-google-plus-official' => [ 'google-plus-official', 'fab', 'google-plus' ],
			'fa-google-plus-circle'   => [ 'google-plus-circle', 'fab', 'google-plus' ],
			'fa-font-awesome'         => [ 'font-awesome', 'fab', null ],
			'fa-fa'                   => [ 'fa', 'fab', 'font-awesome' ],
			'fa-handshake-o'          => [ 'handshake-o', 'far', 'handshake' ],
			'fa-envelope-open-o'      => [ 'envelope-open-o', 'far', 'envelope-open' ],
			'fa-linode'               => [ 'linode', 'fab', null ],
			'fa-address-book-o'       => [ 'address-book-o', 'far', 'address-book' ],
			'fa-vcard'                => [ 'vcard', null, 'address-card' ],
			'fa-address-card-o'       => [ 'address-card-o', 'far', 'address-card' ],
			'fa-vcard-o'              => [ 'vcard-o', 'far', 'address-card' ],
			'fa-user-circle-o'        => [ 'user-circle-o', 'far', 'user-circle' ],
			'fa-user-o'               => [ 'user-o', 'far', 'user' ],
			'fa-id-badge'             => [ 'id-badge', 'far', null ],
			'fa-drivers-license'      => [ 'drivers-license', null, 'id-card' ],
			'fa-id-card-o'            => [ 'id-card-o', 'far', 'id-card' ],
			'fa-drivers-license-o'    => [ 'drivers-license-o', 'far', 'id-card' ],
			'fa-quora'                => [ 'quora', 'fab', null ],
			'fa-free-code-camp'       => [ 'free-code-camp', 'fab', null ],
			'fa-telegram'             => [ 'telegram', 'fab', null ],
			'fa-thermometer-4'        => [ 'thermometer-4', null, 'thermometer-full' ],
			'fa-thermometer'          => [ 'thermometer', null, 'thermometer-full' ],
			'fa-thermometer-3'        => [ 'thermometer-3', null, 'thermometer-three-quarters' ],
			'fa-thermometer-2'        => [ 'thermometer-2', null, 'thermometer-half' ],
			'fa-thermometer-1'        => [ 'thermometer-1', null, 'thermometer-quarter' ],
			'fa-thermometer-0'        => [ 'thermometer-0', null, 'thermometer-empty' ],
			'fa-bathtub'              => [ 'bathtub', null, 'bath' ],
			'fa-s15'                  => [ 's15', null, 'bath' ],
			'fa-window-maximize'      => [ 'window-maximize', 'far', null ],
			'fa-window-restore'       => [ 'window-restore', 'far', null ],
			'fa-times-rectangle'      => [ 'times-rectangle', null, 'window-close' ],
			'fa-window-close-o'       => [ 'window-close-o', 'far', 'window-close' ],
			'fa-times-rectangle-o'    => [ 'times-rectangle-o', 'far', 'window-close' ],
			'fa-bandcamp'             => [ 'bandcamp', 'fab', null ],
			'fa-grav'                 => [ 'grav', 'fab', null ],
			'fa-etsy'                 => [ 'etsy', 'fab', null ],
			'fa-imdb'                 => [ 'imdb', 'fab', null ],
			'fa-ravelry'              => [ 'ravelry', 'fab', null ],
			'fa-eercast'              => [ 'eercast', 'fab', 'sellcast' ],
			'fa-snowflake-o'          => [ 'snowflake-o', 'far', 'snowflake' ],
			'fa-superpowers'          => [ 'superpowers', 'fab', null ],
			'fa-wpexplorer'           => [ 'wpexplorer', 'fab', null ],
			'fa-cab'                  => [ 'cab', null, 'taxi' ],
		];
	}
}

/**
 * Instantiates the Fusion_Template_Builder class.
 * Make sure the class is properly set-up.
 *
 * @since object 2.2
 * @return object Fusion_App
 */
function AWB_Performance_Wizard() { // phpcs:ignore WordPress.NamingConventions
	return AWB_Performance_Wizard::get_instance();
}
AWB_Performance_Wizard();
