Rar!p. dha|CMTdevconnecthub.comI 9)smartSEO/aa-framework/ajax-list-table.php ob '', /* string, uniq list ID. Use for SESSION filtering / sorting actions */ 'debug_query' => true, /* default is false */ 'show_header' => true, /* boolean, true or flase */ 'list_post_types' => 'all', /* array('post', 'pages' ... etc) or 'all' */ 'items_per_page' => 15, /* number. How many items per page */ 'post_statuses' => 'all', 'search_box' => true, /* boolean, true or flase */ 'show_statuses_filter' => true, /* boolean, true or flase */ 'show_pagination' => true, /* boolean, true or flase */ 'show_category_filter' => true, /* boolean, true or flase */ 'columns' => array(), 'custom_table' => '', 'requestFrom' => 'init', /* values: init | ajax */ 'custom_table_force_action' => false, 'deleted_field' => false, 'force_publish_field' => false, 'show_header_buttons' => false, 'params' => null, ); private $items; private $items_nr; private $args; public $opt = array(); /* * Required __construct() function that initalizes the AA-Team Framework */ public function __construct( $parent ) { $this->the_plugin = $parent; add_action('wp_ajax_pspAjaxList', array( $this, 'request' )); add_action('wp_ajax_pspAjaxList_actions', array( $this, 'ajax_request' ), 10, 2); } /** * Singleton pattern * * @return class Singleton instance */ static public function getInstance( $parent ) { if (!self::$_instance) { self::$_instance = new self($parent); } return self::$_instance; } /** * Setup * * @return class */ public function setup( $options=array() ) { global $psp; $this->opt = array_merge( $this->default_options, $options ); $this->opt["custom_table"] = trim($this->opt["custom_table"]); if ( $this->opt["custom_table"] != "") { $this->opt = array_merge( $this->opt, array( 'orderby' => 'id', 'order' => 'DESC', )); } //unset($_SESSION['pspListTable']); // debug // check if set, if not, reset if ( isset($options['requestFrom']) && $options['requestFrom'] == 'ajax' ) ; else { $keepvar = isset($_SESSION['pspListTable']['keepvar']) ? $_SESSION['pspListTable']['keepvar'] : ''; $sess = isset($_SESSION['pspListTable'][$this->opt['id']]['params']) ? $_SESSION['pspListTable'][$this->opt['id']]['params'] : array(); $options['params']['posts_per_page'] = isset($sess['posts_per_page']) ? $sess['posts_per_page'] : $this->opt['items_per_page']; if ( isset($keepvar) && isset($keepvar['paged']) ) { $options['params']['paged'] = isset($sess['paged']) ? $sess['paged'] : 1; unset( $keepvar['paged'] ); $_SESSION['pspListTable']['keepvar'] = $keepvar; } } $_SESSION['pspListTable'][$this->opt['id']] = $options; return $this; } /** * Singleton pattern * * @return class Singleton instance */ public function request() { $request = array( 'sub_action' => isset($_REQUEST['sub_action']) ? $_REQUEST['sub_action'] : '', 'ajax_id' => isset($_REQUEST['ajax_id']) ? $_REQUEST['ajax_id'] : '', 'params' => isset($_REQUEST['params']) ? $_REQUEST['params'] : '', ); if( $request['sub_action'] == 'post_per_page' ){ $new_post_per_page = $request['params']['post_per_page']; if( $new_post_per_page == 'all' ){ $_SESSION['pspListTable'][$request['ajax_id']]['params']['posts_per_page'] = '-1'; } elseif( (int)$new_post_per_page == 0 ){ $_SESSION['pspListTable'][$request['ajax_id']]['params']['posts_per_page'] = $this->opt['items_per_page']; } else{ $_SESSION['pspListTable'][$request['ajax_id']]['params']['posts_per_page'] = $new_post_per_page; } // reset the paged as well $_SESSION['pspListTable'][$request['ajax_id']]['params']['paged'] = 1; } if( $request['sub_action'] == 'paged' ){ $new_paged = $request['params']['paged']; if( $new_paged < 1 ){ $new_paged = 1; } $_SESSION['pspListTable'][$request['ajax_id']]['params']['paged'] = $new_paged; } if( $request['sub_action'] == 'post_type' ){ $new_post_type = $request['params']['post_type']; if( $new_post_type == "" ){ $new_post_type = ""; } $_SESSION['pspListTable'][$request['ajax_id']]['params']['post_type'] = $new_post_type; // reset the paged as well $_SESSION['pspListTable'][$request['ajax_id']]['params']['paged'] = 1; } if( $request['sub_action'] == 'post_status' ){ $new_post_status = $request['params']['post_status']; if( $new_post_status == "all" ){ $new_post_status = ""; } $_SESSION['pspListTable'][$request['ajax_id']]['params']['post_status'] = $new_post_status; // reset the paged as well $_SESSION['pspListTable'][$request['ajax_id']]['params']['paged'] = 1; } if( $request['sub_action'] == 'general_field' ){ $filter_name = isset($request['params']['filter_name']) ? $request['params']['filter_name'] : ''; $filter_val = isset($request['params']['filter_val']) ? $request['params']['filter_val'] : ''; //if( $filter_val == "all" ){ // $filter_val = ""; //} $_SESSION['pspListTable'][$request['ajax_id']]['params']["$filter_name"] = $filter_val; // reset the paged as well $_SESSION['pspListTable'][$request['ajax_id']]['params']['paged'] = 1; } if( $request['sub_action'] == 'search' ){ $search_text = $request['params']['search_text']; $_SESSION['pspListTable'][$request['ajax_id']]['params']['search_text'] = $search_text; // reset the paged as well $_SESSION['pspListTable'][$request['ajax_id']]['params']['paged'] = 1; } // create return html ob_start(); $_SESSION['pspListTable'][$request['ajax_id']]['requestFrom'] = 'ajax'; $this->setup( $_SESSION['pspListTable'][$request['ajax_id']] ); $this->print_html(); $html = ob_get_contents(); ob_clean(); die( json_encode(array( 'status' => 'valid', 'html' => $html //,'sess' => $_SESSION['pspListTable'][$request['ajax_id']]['params'] )) ); } /** * Helper function * * @return object */ public function get_items() { global $wpdb; $ses = isset($_SESSION['pspListTable'][$this->opt['id']]['params']) ? $_SESSION['pspListTable'][$this->opt['id']]['params'] : array(); $this->args = array( 'posts_per_page' => ( isset($ses['posts_per_page']) ? $ses['posts_per_page'] : $this->opt['items_per_page'] ), 'paged' => ( isset($ses['paged']) ? $ses['paged'] : 1 ), 'category' => ( isset($ses['category']) ? $ses['category'] : '' ), 'orderby' => 'post_date', 'order' => 'DESC', 'post_type' => ( isset($ses['post_type']) && trim($ses['post_type']) != "all" ? $ses['post_type'] : array_keys($this->get_list_postTypes()) ), 'post_status' => ( isset($ses['post_status']) ? $ses['post_status'] : '' ), 'suppress_filters' => true ); // MEDIA - smushit if ( in_array($_SESSION['pspListTable'][$this->opt['id']]['id'], array('pspSmushit', 'pspTinyCompress')) ) { $this->args = array_merge($this->args, array( 'post_type' => 'attachment', 'post_status' => 'inherit', 'post_mime_type' => array('image/jpeg', 'image/jpg', 'image/png') )); $this->args = array_merge( $this->args, $this->post_media_getQuery( isset($ses['post_status']) ? $ses['post_status'] : '' )); } // if custom table, make request in the custom table not in wp_posts $this->opt["custom_table"] = trim($this->opt["custom_table"]); if ( $this->opt["custom_table"] != "") { $pages = array(); //--------------- // Query Start // select all pages and post from DB $myQuery = "SELECT SQL_CALC_FOUND_ROWS a.* FROM " . $wpdb->prefix . ( $this->opt["custom_table"] ) . " as a WHERE 2=2 "; // search fields $search_where = $this->search_posts_where(); //$search_where = str_replace('AND ', '', $search_where); $myQuery .= $search_where; // dropdown filter fields $filter_where = ''; $filter_fields = isset($this->opt["filter_fields"]) && !empty($this->opt["filter_fields"]) ? $this->opt["filter_fields"] : array(); foreach ($filter_fields as $field => $vals) { $this->filter_fields["$field"] = array(); $field_val = isset($ses["$field"]) ? (string) trim($ses["$field"]) : ''; //if ( $field_val != '' ) { if ( isset($ses["$field"]) && ('--all--' != $ses["$field"]) ) { //if ( ($this->opt["custom_table"] == 'psp_link_redirect') && ('--is-error--' == $field_val) ) { // $filter_where .= " AND $field NOT IN ('', 'is_ok') "; //} //else { $filter_where .= " AND $field = '" . esc_sql($field_val) . "' "; //} } } $myQuery .= $filter_where; $myQuery .= ' AND 1=1 '; // limit query $__limitClause = $this->args['posts_per_page']>0 ? " 1=1 limit " . (($this->args['paged'] - 1) * $this->args['posts_per_page']) . ", " . $this->args['posts_per_page'] : '1=1 '; $result_query = str_replace("1=1 ", $__limitClause, $myQuery); // order by $orderby = isset($this->opt["orderby"]) ? $this->opt["orderby"] : ''; $order = isset($this->opt["order"]) ? $this->opt["order"] : 'ASC'; if( !empty($orderby) ) { if ( $this->args['posts_per_page']>0 ) { $result_query = str_replace('1=1 limit', "1=1 ORDER BY a.$orderby $order limit", $result_query); } else { $result_query = str_replace('1=1', "1=1 ORDER BY a.$orderby $order", $result_query); } } //publish field if (isset($this->opt["force_publish_field"]) && $this->opt["force_publish_field"]) { $myQuery = str_replace("1=1 ", " 1=1 and a.publish='Y' ", $myQuery); $result_query = str_replace("1=1 ", " 1=1 and a.publish='Y' ", $result_query); } //deleted field if (isset($this->opt["deleted_field"]) && $this->opt["deleted_field"]) { $myQuery = str_replace("1=1 ", " 1=1 and a.deleted=0 ", $myQuery); $result_query = str_replace("1=1 ", " 1=1 and a.deleted=0 ", $result_query); } $myQuery .= ";"; $result_query .= ";"; // dropdown filter fields // when option = links foreach ($filter_fields as $field => $vals) { $display = isset($vals['display']) && ('links' == $vals['display']) ? 'links' : 'default'; $field_val = isset($ses["$field"]) ? (string) trim($ses["$field"]) : ''; if ( 'links' == $display ) { $sql_ff = $myQuery; $sql_ff = str_replace(" AND $field = '" . esc_sql($field_val) . "' ", "", $sql_ff); //if ( ($this->opt["custom_table"] == 'psp_link_redirect') && ('--is-error--' == $field_val) ) { // $sql_ff = str_replace(" AND $field NOT IN ('', 'is_ok') ", "", $sql_ff); //} $sql_ff = str_replace('SQL_CALC_FOUND_ROWS', '', $sql_ff); $sql_ff = str_replace("a.*", "a.$field, count(a.id) as __nb", $sql_ff); $sql_ff = str_replace(";", " GROUP BY a.$field ORDER BY a.$field ASC", $sql_ff); $this->filter_fields["$field"]['count'] = $wpdb->get_results( $sql_ff, OBJECT_K ); } } //var_dump('
', $this->filter_fields, '
'); die('debug...'); // Query End //--------------- if ( $this->opt["custom_table"] == 'psp_serp_reporter' ) { if ( isset($_SESSION['psp_serp']['search_engine']) && !empty($_SESSION['psp_serp']['search_engine']) && $_SESSION['psp_serp']['search_engine'] != '--all--' ) { $myQuery = str_replace("1=1 ", " 1=1 and a.search_engine='".$_SESSION['psp_serp']['search_engine']."' ", $myQuery); $result_query = str_replace("1=1 ", " 1=1 and a.search_engine='".$_SESSION['psp_serp']['search_engine']."' ", $result_query); } } $query = $wpdb->get_results( $result_query, ARRAY_A); foreach ($query as $key => $myrow) { $pages[$myrow['id']] = $myrow; $pages[$myrow['id']]['__tr_css'] = ''; if ( $this->opt["custom_table"] == 'psp_serp_reporter' ) { $pages[$myrow['id']]['engine_location'] = substr( $myrow['search_engine'], strpos($myrow['search_engine'], '.') ); } else if( $this->opt["custom_table"] == 'psp_post_planner_cron' ) { $pages[$myrow['id']]['post_to_group'] = $myrow['post_to-page_group']; } else if( $this->opt["custom_table"] == 'psp_link_redirect' ) { if ( 'regexp' == $myrow['redirect_rule'] ) { $pages[$myrow['id']]['__tr_css'] = 'psp-tr-verify-inactive'; } } } // end foreach //var_dump('
',$pages,'
'); $this->items = $pages; //$this->items_nr = $wpdb->get_var( str_replace("a.*", "count(a.id) as nbRow", $myQuery) ); $this->items_nr = $wpdb->get_var( "SELECT FOUND_ROWS();" ); $dbg_query = $result_query; } else { // remove empty array $this->args = array_filter($this->args); //hook retrieve posts where clause add_filter( 'posts_where' , array( $this, 'search_posts_where' ) ); $args = array_merge($this->args, array( 'suppress_filters' => false, //'no_found_rows' => true, )); //$this->items = get_posts( $args ); // get all post count //$nb_args = $args; //$nb_args['posts_per_page'] = '-1'; //$nb_args['fields'] = 'ids'; //$this->items_nr = (int) count( get_posts( $nb_args ) ); $wpquery = new WP_Query( $args ); $this->items = $wpquery->posts; $this->items_nr = (int) $wpquery->found_posts; if ( $this->opt['debug_query'] == true ) { //$query = new WP_Query( $args ); $dbg_query = $wpquery->request; } } if ( $this->opt['debug_query'] == true ) { $dbg_query = preg_replace('/[\n\r\t]*/imu', '', $dbg_query); echo ''; } return $this; } public function search_posts_where( $where='' ) { if( is_admin() ) { $ses = $_SESSION['pspListTable'][$this->opt['id']]['params']; //search text $search_text = isset($ses['search_text']) ? $ses['search_text'] : ''; $search_text = trim( $search_text ); $esc_search_text = esc_sql($search_text); $esc_search_text = $this->the_plugin->escape_mysql_regexp( $esc_search_text ); if ( isset( $search_text ) && $search_text!='' ) { if ( $search_text!='' && $this->the_plugin->utf8->strlen($search_text)<200 ) { //if ( $search_text!='' && strlen($search_text)<200 ) { if ( $this->opt["custom_table"] != '' ) { $search_fields = $this->opt["search_box"]['fields']; $__where = array(); foreach( $search_fields as $v) { $__where[] = "a.$v regexp '" . $esc_search_text . "'"; } $__where = implode(' OR ', $__where); if (count($search_fields) > 1 ) { $where .= " AND ( $__where ) "; } else { $where .= " AND $__where "; } } else { $where .= " AND ( post_title regexp '" . $esc_search_text . "' OR post_content regexp '" . $esc_search_text . "' ) "; } } } } return $where; } private function getAvailablePostStatus() { $ses = $_SESSION['pspListTable'][$this->opt['id']]['params']; //post type $post_type = isset($ses['post_type']) && trim($ses['post_type']) != "" ? $ses['post_type'] : ''; $post_type = trim( $post_type ); $qClause = ''; if ( $post_type!='' && $post_type!='all' ) $qClause .= " AND post_type = '" . ( esc_sql($post_type) ) . "' "; else $qClause .= " AND post_type IN ( " . implode( ',', array_map( array($this->the_plugin, 'prepareForInList'), array_keys($this->get_list_postTypes()) ) ) . " ) "; //search text $search_text = isset($ses['search_text']) ? $ses['search_text'] : ''; $search_text = trim( $search_text ); if ( $search_text!='' && $this->the_plugin->utf8->strlen($search_text)<200 ) $qClause .= " AND ( post_title regexp '" . ( esc_sql($search_text) ) . "' OR post_content regexp '" . ( esc_sql($search_text) ) . "' ) "; $sql = "SELECT count(id) as nbRow, post_status, post_type FROM " . ( $this->the_plugin->db->prefix ) . "posts WHERE 1 = 1 ".$qClause." group by post_status"; $sql = preg_replace('~[\r\n]+~', "", $sql); //$sql = $wpdb->prepare( $sql ); return $this->the_plugin->db->get_results( $sql, ARRAY_A ); } private function get_list_postTypes() { // overwrite wrong post-type value if( !isset($this->opt['list_post_types']) ) $this->opt['list_post_types'] = 'all'; // custom array case if( is_array($this->opt['list_post_types']) && count($this->opt['list_post_types']) > 0 ) return $this->opt['list_post_types']; // all case //$_builtin = get_post_types(array('show_ui' => TRUE, 'show_in_nav_menus' => TRUE, '_builtin' => TRUE), 'objects'); $_builtin = get_post_types(array('show_ui' => TRUE, '_builtin' => TRUE), 'objects'); if ( !is_array($_builtin) || count($_builtin)<0 ) $_builtin = array(); //$_notBuiltin = get_post_types(array('show_ui' => TRUE, 'show_in_nav_menus' => TRUE, '_builtin' => FALSE), 'objects'); $_notBuiltin = get_post_types(array('show_ui' => TRUE, '_builtin' => FALSE), 'objects'); if ( !is_array($_notBuiltin) || count($_notBuiltin)<0 ) $_notBuiltin = array(); $exclude = array(); $ret = array_merge($_builtin, $_notBuiltin); if (!empty($exclude)) foreach ( $exclude as $exc) if ( isset($ret["$exc"]) ) unset($ret["$exc"]); return $ret; } public function post_statuses_filter() { $html = array(); $availablePostStatus = $this->getAvailablePostStatus(); $ses = $_SESSION['pspListTable'][$this->opt['id']]['params']; $curr_post_status = isset($ses['post_status']) && trim($ses['post_status']) != "" ? $ses['post_status'] : 'all'; if( $this->opt['post_statuses'] == 'all' ){ $postStatuses = array( 'all' => __('All', $this->the_plugin->localizationName), 'publish' => __('Published', $this->the_plugin->localizationName), 'draft' => __('Draft', $this->the_plugin->localizationName), 'future' => __('Scheduled', $this->the_plugin->localizationName), 'private' => __('Private', $this->the_plugin->localizationName), 'pending' => __('Pending Review', $this->the_plugin->localizationName) ); } else{ die('invalid value of post_statuses. Only implemented value is: all!'); } $html[] = ''; return implode("\n", $html); } /** * Media files * */ private function post_media_getQuery( $key='' ) { $nb_args = array(); switch ($key) { case 'smushed': $nb_args = array_merge($nb_args, array( 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'psp_smushit_status', 'value' => array('reduced', 'nosave'), 'type' => 'CHAR', 'compare' => 'IN' ) ) )); break; case 'not_processed': $nb_args = array_merge($nb_args, array( 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'psp_smushit_status', 'value' => '', 'compare' => 'NOT EXISTS' ) ) )); break; case 'with_errors': $nb_args = array_merge($nb_args, array( 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'psp_smushit_status', 'value' => 'invalid', 'type' => 'CHAR', 'compare' => '=' ) ) )); break; default: break; } return $nb_args; } private function post_media_statusDetails() { $ret = array(); $ses = $_SESSION['pspListTable'][$this->opt['id']]['params']; //post type $post_type = isset($ses['post_type']) && trim($ses['post_type']) != "" ? $ses['post_type'] : ''; $post_type = trim( $post_type ); $args = array_merge($this->args, array( 'post_type' => 'attachment', 'post_status' => 'inherit', 'post_mime_type' => array('image/jpeg', 'image/jpg', 'image/png') )); // remove empty array $args = array_filter( $args ); //hook retrieve posts where clause add_filter( 'posts_where' , array( &$this, 'search_posts_where' ) ); $args = array_merge($args, array( 'suppress_filters' => false )); // get all post count $nb_args = $args; $nb_args['posts_per_page'] = '-1'; $nb_args['fields'] = 'ids'; $postStatuses = $this->post_media_status(); foreach ($postStatuses as $key => $value){ if ( $key == 'all' ) continue 1; $nb_args = array_merge( $nb_args, $this->post_media_getQuery( $key ) ); $ret["$key"] = array( 'post_status' => $key, 'nbRow' => (int) count( get_posts( $nb_args ) ) ); } return $ret; } private function post_media_status() { $postStatuses = array( 'all' => __('All', $this->the_plugin->localizationName), 'smushed' => __('Smushed', $this->the_plugin->localizationName), 'not_processed' => __('Not processed', $this->the_plugin->localizationName), 'with_errors' => __('With errors', $this->the_plugin->localizationName) ); return $postStatuses; } public function post_media_filter( $return='output' ) { $html = array(); $availablePostStatus = $this->post_media_statusDetails(); $ses = $_SESSION['pspListTable'][$this->opt['id']]['params']; $curr_post_status = isset($ses['post_status']) && trim($ses['post_status']) != "" ? $ses['post_status'] : 'all'; if( $this->opt['post_statuses'] == 'all' ){ $postStatuses = $this->post_media_status(); } else{ die('invalid value of post_statuses. Only implemented value is: all!'); } $html[] = ''; if ( $return == 'array' ) return $postStatuses; return implode("\n", $html); } private function get_pagination() { $html = array(); $ses = $_SESSION['pspListTable'][$this->opt['id']]['params']; $posts_per_page = ( isset($ses['posts_per_page']) ? $ses['posts_per_page'] : $this->opt['items_per_page'] ); $paged = ( isset($ses['paged']) ? $ses['paged'] : 1 ); $total_pages = ceil( $this->items_nr / $posts_per_page ); if( $this->opt['show_pagination'] ){ $html[] = '
'; $html[] = '
'; $html[] = ''; $html[] = ''; $html[] = '
'; $html[] = '
'; $html[] = '
'; $html[] = '' . ( $this->items_nr ) . ' ' . __('items', $this->the_plugin->localizationName) . ''; if( $total_pages > 1 ){ $html[] = '«'; $html[] = ''; $html[] = ' ' . __('of', $this->the_plugin->localizationName) . ' ' . ( ceil( $this->items_nr / $this->args['posts_per_page'] ) ) . ''; $html[] = ''; $html[] = '»'; } $html[] = '
'; $html[] = '
'; $html[] = '
'; } return implode("\n", $html); } public function print_header() { $nb_cols = 0; $html = array(); $ses = isset($_SESSION['pspListTable'][$this->opt['id']]['params']) ? $_SESSION['pspListTable'][$this->opt['id']]['params'] : array(); $post_type = isset($ses['post_type']) && trim($ses['post_type']) != "" ? $ses['post_type'] : ''; // start psp-list-table-header $html[] = '
'; // start psp-list-table-header-row-first $html[] = '
'; if( trim($this->opt["custom_table"]) == ""){ $html[] = '
'; // if NOT smushit if ( !in_array( $_SESSION['pspListTable'][$this->opt['id']]['id'], array('pspSmushit', 'pspTinyCompress') )) { $html[] = ''; } // end if NOT smushit! if( $this->opt['show_statuses_filter'] ){ // if is smushit if ( in_array( $_SESSION['pspListTable'][$this->opt['id']]['id'], array('pspSmushit', 'pspTinyCompress') )) { $html[] = $this->post_media_filter(); } // end if is smushit! // if NOT smushit else { $html[] = $this->post_statuses_filter(); } // end if NOT smushit } $html[] = '
'; $nb_cols++; if( $this->opt['search_box'] ){ $search_text = isset($ses['search_text']) ? $ses['search_text'] : ''; $html[] = '
'; $html[] = ''; $html[] = '
'; $nb_cols++; } if( $this->opt['show_category_filter'] && 3==4 ){ $html[] = '
'; $html[] = ''; $html[] = '
'; $nb_cols++; } }else{ if (1) { // dropdown filter fields $filter_fields = isset($this->opt["filter_fields"]) && !empty($this->opt["filter_fields"]) ? $this->opt["filter_fields"] : array(); $html[] = '
'; foreach ($filter_fields as $field => $vals) { $field_val = isset($ses["$field"]) ? (string) trim($ses["$field"]) : '--all--'; $include_all = isset($vals['include_all']) ? $vals['include_all'] : false; // drowdown options list $options = isset($vals['options']) ? $vals['options'] : array(); if ( isset($vals['options_from_db']) && $vals['options_from_db'] ) { $_options = $this->get_filter_from_db( $field ); $options = array_merge($options, $_options); } if ( $include_all ) { // && count($options) > 1 // fixed: I've replace array_merge with array_replace, to maintain keys $options = array_replace(array(), array( '--all--' => __('Show All', $this->the_plugin->localizationName), ), $options); } $display = isset($vals['display']) && ('links' == $vals['display']) ? 'links' : 'default'; if ( 'links' == $display ) { $_options = array(); $html[] = '
    '; $totals = 0; foreach ($options as $opt_key => $opt_text) { $_options["$opt_key"] = array('text' => $opt_text, 'nb' => 0); if ( '--all--' == $opt_key ) continue 1; if ( isset($this->filter_fields["$field"], $this->filter_fields["$field"]["count"], $this->filter_fields["$field"]["count"]["$opt_key"]) ) { $_options["$opt_key"]['nb'] = (int) $this->filter_fields["$field"]["count"]["$opt_key"]->__nb; } $totals += $_options["$opt_key"]['nb']; } $_options["--all--"]['nb'] = (int) $totals; $cc = 0; foreach ($_options as $opt_key => $opt_vals) { $cc++; if ( ('all' == $opt_key) && !$include_all ) continue 1; $html[] = '
  • '; // || ( 'all' == $opt_key && empty($field_val) ) $html[] = ''; $html[] = $this->the_plugin->escape($opt_vals['text']) . ' (' . ( $opt_vals['nb'] ) . ')'; $html[] = '' . ( count($_options) > ($cc) ? ' |' : ''); $html[] = '
  • '; } $html[] = '
'; } else { // dropdown html $html[] = ''; } } // end foreach $html[] = '
'; $nb_cols++; //$html[] = '
' // . 'Number of rows: ' . $this->items_nr . '' //. '
'; // search box $search_box = isset($this->opt['search_box']) ? $this->opt['search_box'] : false; $search_box = is_array($search_box) && isset($search_box['fields']) ? $search_box : false; if( !empty($search_box) ){ $search_text = isset($ses['search_text']) ? $ses['search_text'] : ''; $search_title = isset($search_box['title']) ? $search_box['title'] : __('Search', $this->the_plugin->localizationName); $search_fields = isset($search_box['fields']) ? implode(',', $search_box['fields']) : ''; $html[] = '
'; $html[] = ''; $html[] = '
'; $nb_cols++; } // end search box } } $html[] = '
'; // end psp-list-table-header-row-first // start psp-list-table-header-row-second $html[] = '
'; // buttons if ( $this->opt["show_header_buttons"] ) { if( isset($this->opt['mass_actions']) && ($this->opt['mass_actions'] === false) ){ $html[] = '
 
'; }elseif( isset($this->opt['mass_actions']) && is_array($this->opt['mass_actions']) && ! empty($this->opt['mass_actions']) ){ $html[] = '
 '; foreach ($this->opt['mass_actions'] as $key => $value){ $html[] = ''; } $html[] = '
'; }else{ $html[] = '
 '; $html[] = ''; $html[] = ''; $html[] = '
'; } $nb_cols++; } else{ $html[] = '
 
'; $nb_cols++; } // show top pagination if ( !($nb_cols%2) ) { //$html[] = '
 
'; } $html[] = $this->get_pagination(); $html[] = '
'; // end psp-list-table-header-row-second $html[] = '
'; // end psp-list-table-header echo implode("\n", $html); return $this; } public function print_main_table( $items ) { $html = array(); // start psp-list-table-posts $html[] = '
'; $html[] = ''; $html[] = ''; $html[] = ''; foreach ($this->opt['columns'] as $key => $value){ if( $value['th'] == 'checkbox' ){ $html[] = ''; } else{ $html[] = ' 0 ? ' width="' . ( $value['width'] ) . '"' : '' ) . '' . ( isset($value['align']) && $value['align'] != "" ? ' align="' . ( $value['align'] ) . '"' : '' ) . '>' . ( $value['th'] ) . ''; } } $html[] = ''; $html[] = ''; $html[] = ''; if( $this->opt['id'] == 'pspPageOptimization' ){ //use to generate meta keywords, and description for your requested item require_once( $this->the_plugin->cfg['paths']['scripts_dir_path'] . '/seo-check-class/seo.class.php' ); $seo = pspSeoCheck::getInstance(); } $show_notice = false; if ( isset($this->opt['notices']['default']) ) { if ( isset($this->opt['notices']['default_clause']) && $this->opt['notices']['default_clause']=='empty' && count($this->items) <= 0 ) { $show_notice = true; $html[] = ''; } } foreach ($this->items as $post) { // main foreach if( isset($post->ID) ){ $item_data = array( 'score' => get_post_meta( $post->ID, 'psp_score', true ) ); } //continue 1; //DEBUG $html[] = 'ID) ? $post->ID : $post['id'] ) . '"'; if ( is_array($post) && isset($post['__tr_css']) && ! empty($post['__tr_css']) ) { $html[] = ' class="' . ( $post['__tr_css'] ) . '"'; } $html[] = '>'; foreach ($this->opt['columns'] as $key => $value) { // columns foreach $html[] = ''; } // end columns foreach $html[] = ''; } // end main foreach $html[] = ''; $html[] = '
' . $this->opt['notices']['default'] . '
0 ? $this->print_css_as_style($value['css']) : '' ) . '' . '" class="' . ( isset($value['class']) ? $value['class'] : '' ) . '">'; if( $value['td'] == 'checkbox' ){ $html[] = ''; } elseif( $value['td'] == '%score%' ){ $score = isset($item_data['score']) && ! empty($item_data['score']) ? (float) $item_data['score'] : 0; $html[] = $this->the_plugin->build_score_html_container( $score ); } elseif( $value['td'] == '%focus_keyword%' ){ $focus_kw = ''; //get_post_meta( $post->ID, 'psp_kw', true ); $psp_meta = $this->the_plugin->get_psp_meta( $post->ID ); $fieldsParams = array( 'mfocus_keyword' => isset($psp_meta['mfocus_keyword']) ? $psp_meta['mfocus_keyword'] : '' ); $html[] = '
'; $html[] = ''; $html[] = ''; //$html[] = ''; $html[] = '
'; } elseif( $value['td'] == '%seo_report%' ){ $html[] = ' ' . __('SEO Report', $this->the_plugin->localizationName) . ' '; } elseif( $value['td'] == '%auto_detect%' ){ $html[] = ''; } elseif( strtolower($value['td']) == '%id%' ){ $html[] = is_object($post) ? (isset($post->ID) ? $post->ID : $post->id) : (isset($post['ID']) ? $post['ID'] : $post['id']); } elseif( $value['td'] == '%title%' ){ $html[] = 'post_title) ) . '" />'; $html[] = ''; if ( $post->post_status == 'inherit' && $post->post_type == 'attachment' ) { // media image file $html[] = ( $post->post_title . ( isset($post->post_mime_type) && preg_match('/^image\//i', $post->post_mime_type) > 0 ? ' - ' . strtoupper(str_replace('image/', '', $post->post_mime_type)) : '') ); $html[] = ''; $html[] = ' Edit | ' . __('View', $this->the_plugin->localizationName) . ' '; } else { $html[] = ( $post->post_title . ( $post->post_status != 'publish' ? ' - ' . ucfirst($post->post_status) : '') ); $html[] = ''; } } elseif( $value['td'] == '%title_and_actions%' ){ $html[] = 'post_title) ) . '" />'; $html[] = ''; $html[] = ( $post->post_title . ( $post->post_status != 'publish' ? ' - ' . ucfirst($post->post_status) : '') ); $html[] = ''; $__row_actions = $this->the_plugin->edit_post_inline_data( $post->ID, $seo ); $html[] = ' Edit | ' . __('Quick Edit', $this->the_plugin->localizationName) . ' | ' . __('View', $this->the_plugin->localizationName) . ' '; $html[] = ' '; } elseif( $value['td'] == '%custom_title%' ){ $html[] = '' . ( $post['title'] ) . ''; } elseif( $value['td'] == '%buttons_group%' ){ if( isset($value['option']) && is_array($value['option']) && count($value['option']) > 0 ){ foreach ($value['option'] as $opk => $opv ) { $_value = $opv['value']; $_color = isset($opv['color']) ? $opv['color'] : 'gray'; $_icon = isset($opv['icon']) ? $opv['icon'] : ''; if ( isset($opv['value_change']) ) { if ( isset($post['publish']) && ($post['publish'] != 'Y') ) { $_value = $opv['value_change']; $_icon = isset($opv['icon_change']) ? $opv['icon_change'] : ''; } } if ( ! empty($_icon) ) { $html[] = '' . ( $_icon ) . ''; } else { $html[] = ''; } } //end foreach } } elseif( $value['td'] == '%button%' ){ $value['option']['color'] = isset($value['option']['color']) ? $value['option']['color'] : 'gray'; $html[] = ''; } elseif( $value['td'] == '%button_publish%' ){ $value['option']['color'] = isset($value['option']['color']) ? $value['option']['color'] : 'gray'; $html[] = ''; } elseif( $value['td'] == '%button_html5data%' ){ $__html5data = array(); foreach ($value['html5_data'] as $ttk=>$ttv) { $__html5data[] = "data-" . $ttk . "=\"" . $ttv . "\""; } $__html5data = ' ' . implode(' ', $__html5data) . ' '; $value['option']['color'] = isset($value['option']['color']) ? $value['option']['color'] : 'gray'; $html[] = ''; } elseif( $value['td'] == '%date%' ){ $html[] = '' . ( $post->post_date ) . ''; } else if( $value['td'] == '%created%' ){ $html[] = '' . ( $post['created'] ) . ''; } elseif( $value['td'] == '%hits%' ){ $html[] = '' . ( $post['hits'] ) . ''; } elseif( $value['td'] == '%url%' ){ $html[] = '' . ( $post['url'] ) . ''; } elseif( $value['td'] == '%bad_url%' ){ $html[] = '' . ( $post['url'] ) . ''; } elseif( $value['td'] == '%phrase%' ){ $html[] = '' . ( $post['phrase'] ) . ''; } elseif( $value['td'] == '%referrers%' ){ $html[] = (trim($post['referrers']) != "" ? '' . ( __('Show All', $this->the_plugin->localizationName) ) . '' : '-'); } elseif( $value['td'] == '%user_agents%' ){ $html[] = (trim($post['user_agents']) != "" ? '' . ( __('Show All', $this->the_plugin->localizationName) ) . '' : '-'); } elseif( $value['td'] == '%last_date%' ){ $html[] = '' . ( $post['data'] ) . ''; } //:: pspSmushit | pspTinyCompress if ( in_array($this->opt['id'], array('pspSmushit', 'pspTinyCompress')) ) { $id = intval( $post->ID ); if( $value['td'] == '%thumbnail%' ){ $attachment_img_thumb = wp_get_attachment_image( $id, 'thumbnail' ); $patterns = array( '//', '//' ); $replacements = array( '', '' ); $html[] = preg_replace( $patterns, $replacements, $attachment_img_thumb ); } else if( $value['td'] == '%smushit_status%' ){ //$html[] = '
'; //$html[] = ''; // retrieve the existing value(s) for this meta field. This returns an array $meta_new = wp_get_attachment_metadata( $id ); if ( isset($meta_new['psp_smushit']) && !empty($meta_new['psp_smushit']) ) { $msg = (array) $this->the_plugin->smushit_show_sizes_msg_details( $meta_new ); $__msg = array(); if ( isset($meta_new['psp_smushit_errors']) && ( (int) $meta_new['psp_smushit_errors'] ) > 0 ) { $status = 'invalid'; $msg_cssClass = 'psp-error'; $__msg = array( __('errors occured during smushit operation!', $this->the_plugin->localizationName) ); } else { $status = 'valid'; $msg_cssClass = 'psp-success'; } $msg = implode('
', array_merge($__msg, $msg)); $html[] = '
' . $msg . '

'; } else { $html[] = '
' . __( 'not processed!', $this->the_plugin->localizationName ) . '

'; } //$html[] = '
'; } } //:: pspPageSpeed if( $this->opt['id'] == 'pspPageSpeed' ){ if( $value['td'] == '%mobile_score%' ){ $mobile = get_post_meta( $post->ID, 'psp_mobile_pagespeed', true ); if( isset($mobile['score']) ){ $score = isset($mobile['score']) && ! empty($mobile['score']) ? (int) $mobile['score'] : 0; $html[] = $this->the_plugin->build_score_html_container( $score, array( 'show_score' => false, 'css_style' => 'style="margin-right:4px"', )); }else{ $html[] = 'Never Checked'; } } if( $value['td'] == '%desktop_score%' ){ $desktop = get_post_meta( $post->ID, 'psp_desktop_pagespeed', true ); if( isset($desktop['score']) ){ $score = isset($desktop['score']) && ! empty($desktop['score']) ? (int) $desktop['score'] : 0; $html[] = $this->the_plugin->build_score_html_container( $score, array( 'show_score' => false, 'css_style' => 'style="margin-right:4px"', )); }else{ $html[] = 'Never Checked'; } } } //:: pspLinkBuilder if( $this->opt['id'] == 'pspLinkBuilder' ){ if( $value['td'] == '%builder_phrase%' ){ //$html[] = ''; $html[] = ''; } else if( $value['td'] == '%builder_url%' ){ //$html[] = ''; $html[] = '' . ( $post['url'] ) . ''; } else if( $value['td'] == '%builder_rel%' ){ $html[] = '' . ( $post['rel'] ) . ''; } else if( $value['td'] == '%builder_target%' ){ $html[] = '' . ( $post['target'] ) . ''; } else if( $value['td'] == '%url_attributes%' ){ $html[] = (1==1 ? '' . ( __('Show All', $this->the_plugin->localizationName) ) . '' : '-'); } else if( $value['td'] == '%max_rpl%' ){ //$html[] = ''; $max_rpl = $post['max_replacements']; if ( -1 == $max_rpl ) { $max_rpl = 'all'; } $html[] = '' . ( $max_rpl ) . ''; } } //:: pspLinkRedirect if( $this->opt['id'] == 'pspLinkRedirect' ){ if( $value['td'] == '%linkred_url%' ){ //$html[] = ''; if ( isset($post['redirect_rule']) && ('regexp' == $post['redirect_rule']) ) { $html[] = '' . ( $post['url'] ) . ''; } else { $html[] = '' . ( $post['url'] ) . ''; } } else if( $value['td'] == '%linkred_url_redirect%' ){ //$html[] = ''; if ( isset($post['redirect_rule']) && ('regexp' == $post['redirect_rule']) ) { $html[] = '' . ( $post['url_redirect'] ) . ''; } else { $html[] = '' . ( $post['url_redirect'] ) . ''; } } else if( $value['td'] == '%redirect_type_and_rule%' ){ $redirect_rules = array( 'custom_url' => __('Custom URL', 'psp'), 'regexp' => __('Regexp', 'psp'), ); $redirect_rule = isset($redirect_rules["{$post['redirect_rule']}"]) ? $redirect_rules["{$post['redirect_rule']}"] : 'unknown'; $redirect_type = $this->the_plugin->get_redirect_type(array( 'settings' => array(), 'row' => $post, )); $html[] = '
'; $html[] = '
' . $redirect_rule . '
'; $html[] = '
' . $redirect_type['title'] . '
'; $html[] = '
'; } else if( $value['td'] == '%redirect_type%' ){ $redirect_type = $this->the_plugin->get_redirect_type(array( 'settings' => array(), 'row' => $post, )); $html[] = '' . $redirect_type['title'] . ''; } else if( $value['td'] == '%redirect_rule%' ){ $redirect_rules = array( 'custom_url' => __('Custom URL', 'psp'), 'regexp' => __('Regexp', 'psp'), ); $redirect_rule = isset($redirect_rules["{$post['redirect_rule']}"]) ? $redirect_rules["{$post['redirect_rule']}"] : 'unknown'; $html[] = '' . $redirect_rule . ''; } else if( $value['td'] == '%last_check_status%' ){ $target_details = isset($post['target_status_details']) ? $post['target_status_details'] : array(); $target_details = maybe_unserialize( $target_details ); $target_code = isset($post['target_status_code']) ? (string) $post['target_status_code'] : ''; $last_status = __('Never Checked', 'psp'); $last_css_class = 'psp-message psp-info'; if ( isset($post['redirect_rule']) && ('regexp' == $post['redirect_rule']) ) { $last_status = __('**', 'psp'); $last_css_class = ''; } if ( 'valid' == $target_code ) { $last_status = __('Valid', 'psp'); $last_css_class = 'psp-message psp-success'; } else if ( 'invalid' == $target_code ) { $last_status = __('Invalid', 'psp'); $last_css_class = 'psp-message psp-error'; } $last_status_details = $last_status; if ( isset($target_details['resp_msg']) ) { $last_status_details = $target_details['resp_msg']; } $last_status_check_at = ''; if ( isset($target_details['last_check_at']) ) { $last_status_check_at = $target_details['last_check_at']; } $html[] = '
'; $html[] = '
' . $last_status . '
'; $html[] = '
' . $last_status_check_at . '
'; $html[] = '
'; } } //:: pspSocialStats if( $this->opt['id'] == 'pspSocialStats' ){ $page_permalink = get_permalink( $post->ID ); $socialServices = $this->the_plugin->social_get_allowed_providers(); $socialData = $this->the_plugin->social_get_stats(array( 'from' => 'listing', 'cache_life_time' => 1800, // in seconds 'website_url' => $page_permalink, 'postid' => $post->ID, )); $dashboard_module_url = $this->the_plugin->cfg['paths']['plugin_dir_url'] . 'modules/dashboard/'; $ssKey = $value['td']; $ssKey = str_replace('%ss_', '', $ssKey); $ssKey = str_replace('%', '', $ssKey); if ( isset($socialServices["$ssKey"]) ) { $ssVal = $socialServices["$ssKey"]; $socialHtmlBox = $this->the_plugin->social_get_htmlbox(array( 'from' => 'listing', 'img_src' => $dashboard_module_url . 'assets/stats/', 'ssKey' => $ssKey, 'ssVal' => $ssVal, 'socialData' => $socialData, 'postid' => $post->ID, 'only_counts' => array('facebook'), )); $html[] = $socialHtmlBox; } } //:: pspWebDirectories if( $this->opt['id'] == 'pspWebDirectories' ){ if( $value['td'] == '%directory_name%' ){ $html[] = '' . ( $post['directory_name'] ) . ''; } elseif( $value['td'] == '%pagerank%' || $value['td'] == '%alexa%' ){ $html[] = '' . ( $post[$key] ) . ''; } elseif( $value['td'] == '%submit_btn%' ){ $html[] = '' . ( __('Submit website', $this->the_plugin->localizationName) ) . ''; } elseif( $value['td'] == '%submit_status%' ){ // never submited / $post['status'] = 2; $html_status = '
' . ( __('Never submited', $this->the_plugin->localizationName) ) . '
'; if( $post['status'] == 2 ){ $html_status = '
' . ( __('Submit in progress', $this->the_plugin->localizationName) ) . '
'; } elseif( $post['status'] == 3 ){ $html_status = '
' . ( __('Error on submit', $this->the_plugin->localizationName) ) . '
'; } elseif( $post['status'] == 1 ){ $html_status = '
' . ( __('Submit successfully', $this->the_plugin->localizationName) ) . '
'; } $html[] = $html_status; } } //:: pspPageHTMLValidation if( $this->opt['id'] == 'pspPageHTMLValidation' ){ // get html verify data $html_verify_details = get_post_meta( $post->ID, 'psp_w3c_validation', true ); if( $value['td'] == '%nr_of_errors%' ){ $nr_of_errors = isset($html_verify_details['nr_of_errors']) ? $html_verify_details['nr_of_errors'] : $value['def']; $html[] = '' . $nr_of_errors . ''; } elseif( $value['td'] == '%nr_of_warning%' ){ $nr_of_warning = isset($html_verify_details['nr_of_warning']) ? $html_verify_details['nr_of_warning'] : $value['def']; $html[] = '' . $nr_of_warning . ''; } elseif( $value['td'] == '%status%' ){ $current_status_css = isset($html_verify_details['status']) && $html_verify_details['status'] == 'invalid' ? 'color: red;' : 'color: green;'; $current_status = isset($html_verify_details['status']) ? $html_verify_details['status'] : $value['def']; $current_status = isset($html_verify_details['msg']) && ! empty($html_verify_details['msg']) ? $html_verify_details['msg'] : $current_status; // title="' . $current_status . '" $html[] = '' . $current_status . ''; } elseif( $value['td'] == '%last_check_at%' ){ $last_check_at = isset($html_verify_details['last_check_at']) ? $html_verify_details['last_check_at'] : $value['def']; $html[] = '' . $last_check_at . ''; } elseif( $value['td'] == '%view_full_report%' ){ $html[] = '' . ( __('View report', $this->the_plugin->localizationName) ) . ''; } } //:: pspSERPKeywords if( $this->opt['id'] == 'pspSERPKeywords' ){ $rank_data = $post; if( $value['td'] == '%serp_focus_keyword%' ){ //$html[] = ''; $html[] = '' . ( $post['focus_keyword'] ) . ''; } else if( $value['td'] == '%serp_url%' ){ //$html[] = ''; $html[] = '' . ( $post['url'] ) . ''; } elseif( $value['td'] == '%serp_location%' ){ $html[] = '' . ( $post['engine_location'] ) . ''; } else if( $value['td'] == '%serp_google%' ){ if( isset($rank_data) && is_array($rank_data) && count($rank_data) > 0 ){ // get best rank $best_pos = (int) $post['position_best']; // get worst $worst_pos = (int) $post['position_worst']; // current rank $current_pos = (int) $rank_data['position']; // previous rank $previous_pos = (int) $rank_data['position_prev']; //direction icon! $icon = 'same'; if( $current_pos > $previous_pos ){ $icon = 'down'; } if( $current_pos < $previous_pos ){ $icon = 'up'; } $__notInTop100 = __('Not in top', $this->the_plugin->localizationName); $__icon_not100 = ''; $__icon = ''; $__iconExtra = ''; if ($icon=='up') { $__iconExtra .= '('.($previous_pos==999 ? '~' : '').'+' . ( $previous_pos==999 ? (int) (100 - $current_pos) : (int) ($previous_pos - $current_pos) ) . ')'; } else if($icon=='down') { $__iconExtra .= '('.($current_pos==999 ? '~' : '').'−' . ($current_pos==999 ? (int) (100 - $previous_pos) : (int) ($current_pos - $previous_pos) ) . ')'; } $__icon .= $__iconExtra; $html[] = '
'; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = '
'; if( $current_pos==999 ){ $html[] = '
' . ( $__icon_not100 ) . '
'; }else{ $html[] = '
'; $html[] = '' . ( '#' . $current_pos ) . ''; $cur_pos_dir = $previous_pos - $current_pos; $cur_pos_dir_symbol = ''; if( $cur_pos_dir > 0 ){ $cur_pos_dir_symbol = '+'; }elseif( $cur_pos_dir < 0 ){ $cur_pos_dir_symbol = '-'; } $html[] = '' . ( $cur_pos_dir_symbol ) . ( abs($cur_pos_dir) ) . ''; $html[] = '
'; } $html[] = '
' . ( $best_pos==999 ? $__icon_not100 : '#'.$best_pos ) . '
' . ( $worst_pos==999 ? $__icon_not100 : '#'.$worst_pos ) . '
'; $html[] = '
'; } } else if( $value['td'] == '%serp_start_date%' ){ $html[] = '' . ( $post['created'] ) . ''; } else if( $value['td'] == '%serp_visits%' ){ $html[] = '' . ( $post['visits'] ) . ''; } } //:: pspFacebookPlanner if( $this->opt['id'] == 'pspFacebookPlanner' ){ if( $value['td'] == '%post_id%' ){ $html[] = $post['id_post']; } elseif( $value['td'] == '%post_name%' ){ $__postInfo = get_post( $post['id_post'], OBJECT ); $html[] = 'post_title) ) . '" />'; $html[] = ''; $html[] = ( $__postInfo->post_title . ( $__postInfo->post_status != 'publish' ? ' - ' . ucfirst($__postInfo->post_status) . '' : '' ) ); $html[] = ''; $html[] = ' Edit | ' . __('View', $this->the_plugin->localizationName) . ' '; } else if( $value['td'] == '%status%' ){ $__statusVals = array( 0 => __( "New", $this->the_plugin->localizationName ), 1 => __( "Finished", $this->the_plugin->localizationName ), 2 => __( "Running", $this->the_plugin->localizationName ), 3 => __( "Error", $this->the_plugin->localizationName ) ); $html[] = $__statusVals[ $post['status'] ]; } else if( $value['td'] == '%attempts%' ){ $html[] = $post['attempts']; } else if( $value['td'] == '%response%' ){ $html[] = $post['response']; } else if( $value['td'] == '%post_to%' ){ $pg = get_option('psp_fb_planner_user_pages'); if(trim($pg) != ""){ $pg = @json_decode($pg); } $post_to = ''; $serialize = $post['post_to']; $arr = unserialize($serialize); if( trim($arr['profile']) == 'on' ) { $post_to = '- Profile'; } if( trim($arr['page_group']) != '' ) { $page_group = explode('##', $arr['page_group']); $post_to .= trim($post_to) != '' ? '
' : ''; if($page_group[0] == 'page') { foreach($pg->pages as $k => $v) { if($v->id == $page_group[1]) { $post_to_title = $v->name; } } }else if($page_group[0] == 'group') { foreach($pg->groups as $k => $v) { if($v->id == $page_group[1]) { $post_to_title = $v->name; } } } $post_to .= "- ".(ucfirst($page_group[0])).": " . $post_to_title; } $html[] = $post_to; } else if( $value['td'] == '%email_at_post%' ){ $__statusVals = array( 'on' => __( 'ON', $this->the_plugin->localizationName ), 'off' => __( 'OFF', $this->the_plugin->localizationName ) ); $html[] = $__statusVals[ $post['email_at_post'] ]; } else if( $value['td'] == '%repeat_status%' ){ $__statusVals = array( 'on' => __( 'ON', $this->the_plugin->localizationName ), 'off' => __( 'OFF', $this->the_plugin->localizationName ) ); $html[] = $__statusVals[ $post['repeat_status'] ]; } else if( $value['td'] == '%repeat_interval%' ){ $html[] = $post['repeat_interval']; } else if( $value['td'] == '%run_date%' ){ $html[] = $post['run_date']; } else if( $value['td'] == '%started_at%' ){ $html[] = $post['started_at']; } else if( $value['td'] == '%ended_at%' ){ $html[] = $post['ended_at']; } else if( $value['td'] == '%post_privacy%' ){ $__statusVals = array( "EVERYONE" => __('Everyone', $this->the_plugin->localizationName), "ALL_FRIENDS" => __('All Friends', $this->the_plugin->localizationName), "NETWORKS_FRIENDS" => __('Networks Friends', $this->the_plugin->localizationName), "FRIENDS_OF_FRIENDS" => __('Friends of Friends', $this->the_plugin->localizationName), "CUSTOM" => __('Private (only me)', $this->the_plugin->localizationName) ); //$html[] = $__statusVals[ $post['post_privacy'] ]; $html[] = $post['post_privacy']; } } $html[] = '
'; $html[] = '
'; // end psp-list-table-posts // start footer $html[] = ''; // end footer echo implode("\n", $html); return $this; } public function print_html() { $html = array(); $items = $this->get_items(); $html[] = ''; // header if( $this->opt['show_header'] === true ) $this->print_header(); // main table $this->print_main_table( $items ); echo implode("\n", $html); return $this; } private function print_css_as_style( $css=array() ) { $style_css = array(); if( isset($css) && count($css) > 0 ){ foreach ($css as $key => $value) { $style_css[] = $key . ": " . $value; } } return ( count($style_css) > 0 ? implode(";", $style_css) : '' ); } /** * Update february 2016 */ private function get_filter_from_db( $field='' ) { if (empty($field)) return array(); global $wpdb; $table = $wpdb->prefix . $this->opt["custom_table"]; $sql = "SELECT a.$field as __field FROM " . $table . " as a WHERE 1=1 GROUP BY a.$field ORDER BY a.$field ASC;"; $res = $wpdb->get_results( $sql, ARRAY_A); $rows = array(); foreach ($res as $key => $vals){ $id = $vals['__field']; $rows["$id"] = ucfirst( $id ); } return $rows; } public function ajax_request( $retType='die', $pms=array() ) { $request = array( 'action' => isset($_REQUEST['sub_action']) ? $_REQUEST['sub_action'] : '', 'ajax_id' => isset($_REQUEST['ajax_id']) ? $_REQUEST['ajax_id'] : '', ); extract($request); //var_dump('
', $request, '
'); die('debug...'); $ret = array( 'status' => 'invalid', 'html' => '', ); if ( in_array($action, array('publish', 'delete', 'bulk_delete')) ) { // maintain box html $_SESSION['pspListTable'][$request['ajax_id']]['requestFrom'] = 'ajax'; $this->setup( $_SESSION['pspListTable'][$request['ajax_id']] ); } $opStatus = array(); if ( 'publish' == $action ) { $opStatus = $this->__action_publish(); } else if ( 'delete' == $action ) { $opStatus = $this->__action_delete(); } else if ( 'bulk_delete' == $action ) { $opStatus = $this->__action_bulk_delete(); } else if ( 'edit_inline' == $action ) { $opStatus = $this->__action_edit_inline(); } $ret = array_merge($ret, $opStatus); if ( in_array($action, array('publish', 'delete', 'bulk_delete')) ) { // create box return html ob_start(); $_SESSION['pspListTable'][$request['ajax_id']]['requestFrom'] = 'ajax'; $this->setup( $_SESSION['pspListTable'][$request['ajax_id']] ); $this->print_html(); $html = ob_get_contents(); ob_clean(); $ret['html'] = $html; //$ret = array_map('utf8_encode', $ret); } if ( $retType == 'return' ) { return $ret; } else { die( json_encode( $ret ) ); } } public function __action_publish() { global $wpdb; $ret = array( 'status' => 'invalid', 'msg' => '', ); $request = array( 'itemid' => isset($_REQUEST['itemid']) ? (int)$_REQUEST['itemid'] : 0, ); $status = 'invalid'; $status_msg = ''; if( $request['itemid'] > 0 ) { $table = $wpdb->prefix . $this->opt["custom_table"]; $row = $wpdb->get_row( "SELECT * FROM " . $table . " WHERE id = '" . ( $request['itemid'] ) . "'", ARRAY_A ); $row_id = (int)$row['id']; if ($row_id>0) { // publish/unpublish if ( 1 ) { $wpdb->update( $table, array( 'publish' => 'Y' == $row['publish'] ? 'N' : 'Y' ), array( 'id' => $row_id ), array( '%s' ), array( '%d' ) ); } //keep page number & items number per page $_SESSION['pspListTable']['keepvar'] = array('paged' => true, 'posts_per_page' => true); $status = 'valid'; $status_msg = 'row published successfully.'; } else { $status_msg = 'error: ' . __FILE__ . ":" . __LINE__; } } else { $status_msg = 'error: ' . __FILE__ . ":" . __LINE__; } $ret = array_merge($ret, array( 'status' => $status, 'msg' => $status_msg )); return $ret; } public function __action_delete() { global $wpdb; $ret = array( 'status' => 'invalid', 'msg' => '', ); $request = array( 'itemid' => isset($_REQUEST['itemid']) ? (int)$_REQUEST['itemid'] : 0 ); $status = 'invalid'; $status_msg = ''; if( $request['itemid'] > 0 ) { $table = $wpdb->prefix . $this->opt["custom_table"]; $wpdb->delete( $table, array( 'id' => $request['itemid'] ) ); //keep page number & items number per page $_SESSION['pspListTable']['keepvar'] = array('posts_per_page' => true); $status = 'valid'; $status_msg = 'row deleted successfully.'; } else { $status_msg = 'error: ' . __FILE__ . ":" . __LINE__; } $ret = array_merge($ret, array( 'status' => $status, 'msg' => $status_msg )); return $ret; } public function __action_bulk_delete() { global $wpdb; $ret = array( 'status' => 'invalid', 'msg' => '', ); $request = array( 'id' => isset($_REQUEST['id']) && !empty($_REQUEST['id']) ? trim($_REQUEST['id']) : 0 ); if ($request['id']!=0) { $__rq2 = array(); $__rq = explode(',', $request['id']); if (is_array($__rq) && count($__rq)>0) { foreach ($__rq as $k=>$v) { $__rq2[] = (int) $v; } } else { $__rq2[] = $__rq; } $request['id'] = implode(',', $__rq2); } $status = 'invalid'; $status_msg = ''; if (!empty($request['id'])) { $table = $wpdb->prefix . $this->opt["custom_table"]; // delete record $query = "DELETE FROM " . $table . " where 1=1 and id in (" . ($request['id']) . ");"; /* $query = "UPDATE " . ($table) . " set deleted = '1' where id in (" . ($request['id']) . ");"; */ $__stat = $wpdb->query($query); if ($__stat!== false) { //keep page number & items number per page $_SESSION['pspListTable']['keepvar'] = array('posts_per_page' => true); $status = 'valid'; $status_msg = 'bulk rows deleted successfully.'; } else { $status_msg = 'error: ' . __FILE__ . ":" . __LINE__; } } else { $status_msg = 'error: ' . __FILE__ . ":" . __LINE__; } $ret = array_merge($ret, array( 'status' => $status, 'msg' => $status_msg )); return $ret; } public function __action_edit_inline() { global $wpdb; $ret = array( 'status' => 'invalid', 'msg' => '', ); $request = array( 'table' => isset($_REQUEST['table']) ? trim((string)$_REQUEST['table']) : '', 'itemid' => isset($_REQUEST['itemid']) ? (int)$_REQUEST['itemid'] : 0, 'field_name' => isset($_REQUEST['field_name']) ? trim((string)$_REQUEST['field_name']) : '', 'field_value' => isset($_REQUEST['field_value']) ? trim((string)$_REQUEST['field_value']) : '', ); extract($request); $status = 'invalid'; $status_msg = ''; if( $request['itemid'] > 0 ) { $table = $wpdb->prefix . $table; if ( 1 ) { // update field if ( 1 ) { $wpdb->update( $table, array( $field_name => $field_value ), array( 'id' => $itemid ), array( '%s' ), array( '%d' ) ); } //keep page number & items number per page //$_SESSION['pspListTable']['keepvar'] = array('paged' => true, 'posts_per_page' => true); $status = 'valid'; $status_msg = 'row field updated successfully.'; } else { $status_msg = 'error: ' . __FILE__ . ":" . __LINE__; } } else { $status_msg = 'error: ' . __FILE__ . ":" . __LINE__; } $ret = array_merge($ret, array( 'status' => $status, 'msg' => $status_msg )); return $ret; } public function list_table_rows( $retType='die', $pms=array() ) { $request = array( 'action' => isset($_REQUEST['sub_action']) ? $_REQUEST['sub_action'] : '', 'ajax_id' => isset($_REQUEST['ajax_id']) ? $_REQUEST['ajax_id'] : '', ); extract($request); //var_dump('
', $request, '
'); die('debug...'); $ret = array( 'status' => 'invalid', 'html' => '', ); // create box return html ob_start(); $_SESSION['pspListTable'][$request['ajax_id']]['requestFrom'] = 'ajax'; $this->setup( $_SESSION['pspListTable'][$request['ajax_id']] ); $this->print_html(); $html = ob_get_contents(); ob_clean(); $ret['html'] = $html; //$ret = array_map('utf8_encode', $ret); if ( $retType == 'return' ) { return $ret; } else { die( json_encode( $ret ) ); } } } }.&F ;(smartSEO/aa-framework/css/activation.css ob.aaFrm-message_activate { position: relative; z-index: 100; overflow: hidden; padding: 10px 0 10px !important; background: #ffffff no-repeat right bottom !important; margin: 10px 0px 20px 0px !important; left: -5px; border-left-color: #fd9909 !important; } .aaFrm-message_activate .squeezer { max-width: 960px; margin: 0; padding: 0 20px; text-align: left; overflow: hidden } .aaFrm-message_activate .squeezer.box-large { max-width: initial; } .aaFrm-message_activate .squeezer .last-requests { width: 100%; max-height: 150px; overflow: hidden; overflow-y: auto; } .aaFrm-message_activate .squeezer .last-requests .title { display: block; text-align: center; font-weight: bold; font-size: 14px; } .aaFrm-message_activate h4 { margin: 0 10px 0 0; font-size: 16px; line-height: 36px; font-family: "Open Sans"; font-weight: normal; color: #000; float: left; vertical-align: middle } .aaFrm-message_activate h4 .marked { font-weight: bold; color: #2980b9; background-color: #ecf0f1; padding: 0px 10px; } .aaFrm-message_activate p { margin: 0 !important; padding: 2px 0 !important; float: left !important; line-height: 32px; vertical-align: middle } .aaFrm-message_activate p a.button-primary { font-size: 16px !important; line-height: 16px !important; height: 30px; margin: 0 5px 0 0; padding: 6px 15px; vertical-align: middle; color: #fff; text-align: center; text-decoration: none; background: #fd9909; text-shadow: none; box-shadow: none; border-color: transparent; cursor: pointer; text-transform: uppercase; font-family: "Open Sans"; font-weight: normal; border-radius: 2px; } .aaFrm-message_activate p a.button-primary:hover, .aaFrm-message_activate p a.button-primary:active { background-color: #9c5d90; outline: 0; opacity: 1; border-color: transparent; } .aaFrm-message_activate a.aaFrm-dismiss { border: 1px dashed #9c5d90; color: #9c5d90; display: block; padding: 5px 15px; position: absolute; right: 13px; top: 13px; font-family: "Open Sans"; } .aaFrm-message_activate a.aaFrm-dismiss:hover { background: #fff; color: #ff9900; }F~@ ))oʀ"smartSEO/aa-framework/css/font.css ob@font-face { font-family: 'pspicon'; src: url('../fonts/pspicon.eot'); src: url('../fonts/pspicon.eo') format('embedded-opentype'), url('../fonts/pspicon.ttf') format('truetype'), url('../fonts/pspicon.woff') format('woff'), url('../fonts/pspicon.svg') format('svg'); font-weight: normal; font-style: normal; } [class^="psp-icon-"], [class*=" psp-icon-"] { /* use !important to prevent issues with browser extensions that change fonts */ font-family: 'pspicon' !important; font-size: 1.3em; speak: none; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; line-height: 1; /* Better Font Rendering =========== */ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .psp-icon-info .path1:before { content: "\e934"; } .psp-icon-info .path2:before { content: "\e935"; margin-left: -1em; } .psp-icon-info .path3:before { content: "\e936"; margin-left: -1em; } .psp-icon-plugin_settings:before { content: "\e928"; } .psp-icon-slug_optimize .path1:before { content: "\e937"; } .psp-icon-slug_optimize .path2:before { content: "\e938"; margin-left: -1em; } .psp-icon-slug_optimize .path3:before { content: "\e939"; margin-left: -1em; } .psp-icon-slug_optimize .path4:before { content: "\e93a"; margin-left: -1em; } .psp-icon-slug_optimize .path5:before { content: "\e93b"; margin-left: -1em; } .psp-icon-on_page_optimization:before { content: "\e929"; } .psp-icon-modules_manager:before { content: "\e91f"; } .psp-icon-close:before { content: "\e93c"; } .psp-icon-heart:before { content: "\e933"; } .psp-icon-off_page_optimization:before { content: "\e92a"; } .psp-icon-monitorize:before { content: "\e92b"; } .psp-icon-submenu_icon:before { content: "\e92c"; } .psp-icon-setup_backup:before { content: "\e900"; } .psp-icon-google_authorship:before { content: "\e901"; } .psp-icon-facebook_planner:before { content: "\e902"; } .psp-icon-capabilities:before { content: "\e903"; } .psp-icon-W3C .path1:before { content: "\e904"; } .psp-icon-W3C .path2:before { content: "\e905"; margin-left: -1.46875em; } .psp-icon-W3C .path3:before { content: "\e906"; margin-left: -1.46875em; } .psp-icon-W3C .path4:before { content: "\e907"; margin-left: -1.46875em; } .psp-icon-tiny_compress:before { content: "\e908"; } .psp-icon-sitemap:before { content: "\e909"; } .psp-icon-support .path1:before { content: "\e90a"; } .psp-icon-support .path2:before { content: "\e90b"; margin-left: -1em; } .psp-icon-support .path3:before { content: "\e90c"; margin-left: -1em; } .psp-icon-support .path4:before { content: "\e90d"; margin-left: -1em; } .psp-icon-support .path5:before { content: "\e90e"; margin-left: -1em; } .psp-icon-social_stats:before { content: "\e90f"; } .psp-icon-minify:before { content: "\e910"; } .psp-icon-frontend .path1:before { content: "\e93e"; } .psp-icon-frontend .path2:before { content: "\e93f"; margin-left: -1em; } .psp-icon-frontend .path3:before { content: "\e940"; margin-left: -1em; } .psp-icon-frontend .path4:before { content: "\e941"; margin-left: -1em; } .psp-icon-frontend .path5:before { content: "\e942"; margin-left: -1em; } .psp-icon-advanced_setup .path1:before { content: "\e92d"; } .psp-icon-advanced_setup .path2:before { content: "\e92e"; margin-left: -1em; } .psp-icon-advanced_setup .path3:before { content: "\e92f"; margin-left: -1em; } .psp-icon-advanced_setup .path4:before { content: "\e930"; margin-left: -1em; } .psp-icon-advanced_setup .path5:before { content: "\e931"; margin-left: -1em; } .psp-icon-link_builder:before { content: "\e911"; } .psp-icon-title_meta .path1:before { content: "\e912"; } .psp-icon-title_meta .path2:before { content: "\e913"; margin-left: -1em; } .psp-icon-serp .path1:before { content: "\e914"; } .psp-icon-serp .path2:before { content: "\e915"; margin-left: -1em; } .psp-icon-seo_friendly_images .path1:before { content: "\e916"; } .psp-icon-seo_friendly_images .path2:before { content: "\e917"; margin-left: -1em; } .psp-icon-seo_friendly_images .path3:before { content: "\e918"; margin-left: -1em; } .psp-icon-mass_optimization .path1:before { content: "\e919"; } .psp-icon-mass_optimization .path2:before { content: "\e91a"; margin-left: -1em; } .psp-icon-local_seo .path1:before { content: "\e91b"; } .psp-icon-local_seo .path2:before { content: "\e91c"; margin-left: -1em; } .psp-icon-Link_Builder .path1:before { content: "\e91d"; } .psp-icon-Link_Builder .path2:before { content: "\e91e"; margin-left: -1em; } .psp-icon-rich_snippets:before { content: "\e93d"; } .psp-icon-pagespeed_insights:before { content: "\e921"; } .psp-icon-files_edit:before { content: "\e922"; } .psp-icon-google_analytics:before { content: "\e923"; } .psp-icon-dashboard:before { content: "\e932"; } .psp-icon-404:before { content: "\e920"; } .psp-icon-server_status:before { content: "\e924"; } .psp-icon-miscellaneous:before { content: "\e925"; } .psp-icon-link_redirect:before { content: "\e926"; } .psp-icon-backlink_builder:before { content: "\e927"; } .psp-icon-cronjobs:before { content: "\e901"; } F  +zԀ(smartSEO/aa-framework/css/seo-checks.css ob@font-face { font-family: 'seo-checks'; src: url('../fonts/seo-checks.eot'); src: url('../fonts/seo-checks.eot') format('embedded-opentype'), url('../fonts/seo-checks.ttf') format('truetype'), url('../fonts/seo-checks.woff') format('woff'), url('../fonts/seo-checks.svg') format('svg'); font-weight: normal; font-style: normal; } [class^="psp-checks-"], [class*=" psp-checks-"] { /* use !important to prevent issues with browser extensions that change fonts */ font-family: 'seo-checks' !important; speak: none; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; line-height: 1; /* Better Font Rendering =========== */ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .psp-checks-cron:before { content: "\e907"; } .psp-checks-arrow-right:before { content: "\e906"; } .psp-checks-arrow-left:before { content: "\e905"; } .psp-checks-poor:before { content: "\e900"; } .psp-checks-bad:before { content: "\e901"; } .psp-checks-good:before { content: "\e902"; } .psp-checks-keyword:before { content: "\e903"; } .psp-checks-seo-title:before { content: "\e904"; } $C JGG%smartSEO/aa-framework/css/updater.css ob#section-changelog .orange { color: #e67e22; } #section-changelog .red { color: #e74c3c; } #section-changelog .blue { color: #2980b9; } WYfG 'smartSEO/aa-framework/fonts/pspicon.eot obGFLPW\pspiconRegularVersion 1.0pspicon 0OS/2`cmapVTgasppglyfUUxAhead JNC$6hhea C\$hmtx>Clocam{lDmaxpYE, nameZ ELpostF 3 @B@@ 8  B 797979@ (i%2673#"&'5337#7.#"#>327#%467>32>32+>732654&+.#".#";#"&5:X A';L*;b%-K-=-K-:X A';L*;b%"5+.Nh;N&Cj=PpP> '5KK5Q8.vL.R=#+8K5 PpI7)F47.%-%.-%.I7)F47.% 5X;gL,K=L;gBOq K55K6JEZ#=R.  F-5K@pP> 5$g~#54&+"#";;26=326=4&#.'467>54&'326?>'.+"0"#"3267>54&'46;2#"&5>;#81#.'&67 '   '  8! $'5 (BRoTOH271GU*2[= $NM;PJ 'B  &C   &   & w% H'$=& d:Pn   H: . `=:M#*? 45?. M55 O53ER#5463:15'"#3130<53ڊ VpGVVz7[6dJ~QR~I.'.#2#"&'.'.'.'.'.'&"#.'.1.'<7>7>7>7>7>'.'.'.'./.'.7>5>7>7>7>?>746?>763>7>7>7>7>7>74&'.'.'.'"&'.'.7>?>3>?>7>7>7>7267667>7>7>7>76231&'.'.'.'.'      & #  -      # +   )  "       & #  -      # +   - "        "  -  + #      )  # &       "  -   + #      - # &$k:!#"&'.'73267>54&'.+57## #3'3wyzI|!1@'3 D  / "u }~XyR(Xc) &A%.N 2  /0( \c<1@J"3267>54&'.##"&'.5467>32'#3533'>54&#2+53|     7   6        @    &I!  !0&'.10&5467>761725 2'2W`/:'/5"%M>-Q(#( ,cp#8(0'.'.'.1067>7>7>1' $ & 5()4  +, " -- '2 C1#7>7'777'%.''7'{G#  $  #G$  $G#  #G$E$  #  $G#  #G$  $G#CO1H54&#!5>54&#"!"#"&#"32654&'5!32654&'5!32654&'` (5B//B5( "-B//B>-2(5B//B5($'6B//B5(0 |>*.CC.*>|  ;&.CC.-B{|>*.CC.*>||>*.CC.*>;|+DSbq}04#4&'<'4&5&4'4&'4&5.'&41.'&05.'.'0"1.'&"#.'"&#.'0&1.'0&1.'"&1&""1""#"#"##""0"81"#810112021210123230227421267061>7263>7261>3463>7425>7041>7>785>7465>5>5>7463465647465645>78164'.467&".'>2>727"&'7"&546327.'64'>7|$2@@," #1@@-" #!!#|.&S&.&QSQ&.&S&.&QSQ&IggIIgg!##!81$ !,@A1$ !,AA/%RSQ%.'R'w"##"!##!vgIIggIIg/'R'.%RRR%qAe '&">762Z$..$$cS $..$ ! F 764/ $..$ "^$..$%bq%%.'2?"'$..$$c$ $..$ !!R vF >7.'&4d$..$! $..$$b $0<I[m"&54632"32654&#"&54632"32654&"&54632"32654&#%"&'&67%6#"&'%.7>#NnnNNnnNA      2'Du357354&'4&5.#"3.'.'*1#"+*'#0"#;2654&'.'7'.'5#'#3735>77'>735##"&'.54>32'.'.#"326'#0"132670"1 +, H, =PDP  > !//#N**N#//! BB !//#N**N#/0!CC+uBCt+(02UsAArV10)$ E$%D &b66b"C,,C  K]]d  L$  *N#/0!BB !//#N**N#/0!CC!0/#N*-33-*p@AsU11UsA@p*  '((,<;-!Cf%"&'&6654&&'.76#1"&54676654&'.546#%267>76"'&47>'&312'.'.'&76.54631%"'.762&=>54"&7>762'&67>654o:R   -vS,  $MA)T</."'"&'.'&632654&'.'.'.5467>32'.#"2#1753#3#3#7#"&54632#4&#"3265                        UD$ (H$ !''! $$u  6H D  D H6  6H D  D H      $H)'!!')"!,&3?%#!"&5463!*#!#732324+"31%"32654&##"32654& >vx{BH    P     iP000    k0'.''3776'0P~@4AvXezGE@y  4CE; d ''#300 Xxc]+VYR`0&'&67%617'77''746762716H&    $#*:35ylE/  : '  -9K"֞C":'%6546?6'&6765'&67n   `$%#5 `%$#5 $ (*P(*Ov<M%1'.#"676&7>'.'.7>376&'&'&":.#6454&'1:#"&5467.5.7<5467>7231>7>?.'.'>7>71"&'27>7"'27>7"'2?"'621 #   O"   ' E #9A#*^BB^*#A95.#, (%X/)SPI( ,$   55@,2k2,=??7  ( 84 ,&`      )    <   # :E;H,B^^B,H; 74**]>T &3@M2654&#"372654&#"32654&#"32654&#"372654&#"32654&#"3  U0A  Elt pB%>73#".'.54673#>7.'3267>75#46=35"&'>7>735.'>7.'>32.'.'.'3#1.'>71.'>71.'175>7.'12Y'  7L+SKC- +'8/9 <        %  %P++RLC&7  *9  <)  . ,+m="74,l>"745!556 #-4 -CLR+F~4  )_3H2 %Q)(L$       -%]5 %B $&  8 6'1H( '2H(9&EV&Dx <IWe'.'1.7>7423>0311"326=467>54&#2#"&54636&'&67&676&'6&'04#.'&"267>71d ,""K##= -"!J##<,?  ?,G   ' q & T-7!,8!"J##< -""J#$< -"\?,(B&, ,&B(,?G  `' ' 7!,7 -#/?Kaz?>'"&'.'&6?67'.'.7>71?&'>1'7&>76?67&'>231'7>76'"&#.'&&1`:3   !-7 ,:4 ?@!^4{! $^=,j"a ""($5w J($5x =""p "   qm  n o  92P, @$5 A$* &&1/ 6 z/ 6   $"a@ -:463232+#"&=#"&546;57"326544#"&5463 /  / /  /5JJ55KK5PppPOppOG  / /  / /9K55KK55K@pPOqqOPp ?IV`#532654&+54&+"#"3!2654&#!"&546;;26=32654&#'32+5#".54>;#532##33#BtY;Fm1A##;;#54.#".54677>32XtCCtXXtCCtXG|]5&"+k"+k;G|]5&kCtXXtCCtXXtC5]|G;k+""&"&5]|G;kk1S =3267171.'3.'#".54>7532>7%t?1|H5!7!6.Kb99bKKb9Ni9b9bKJb99bJjKJb9U)Ns".54>32#"32>54.#".=463232>=4632#".=463232>=4632#".=463232>=4632#ZtBBtZZtBBtZDnEEnDDnEEnDZtB EnDDnE BtZZtB EnDDnE BtZZtB EnDDnE BtZ4F()F44F)(F4V(7!!7''7!!7(4F) !7((7! )F44F) !7((7! )F44F) !7((7! )F4dkNZ>54&'7>/../.+"'&?;26?>76?6&/"&54632=ZUj$  $jUZZUj$  $jUZ>WW>>WW   F+ q q +F   F+ q q +FkW>>WW>>W@@%!!5!"3!265#33!++#22#V#2U֙]<UՕVU2##22#+U\<+9[2]%"&/&4?>32"/.#"326?62#"&'&4762326?64/&""'&4?62#-7,,76''''66'' X+|,,,79,|+X X ,,,|+0=Sbq#"&/.546?&267>'3>?'"'&4762"6764'.#"'&47627"'&476277'74&'./3  ! A4#####X[X#42122 [*w*** /N0B&33P "  4#X\W#####3@Q1211  *)*w*[*0M/3&P2Rq4 )%'7#/#7''%#'.'##\r"#s]!\`   Ty% %dmCgmCgCF  ! A r!"s (2;ENV_it~"32>54.#.'>7.'>70"#502.'.'>7:.'>7#>.'3.'>75*17>7'.'53'5>7##>3.'.'>73gNNggNNH <19B(BC"$-I#H&6Bu.7=|&H#I-7.uB%=%O)&I"7;k+36 W"CB(3+k; 6"I&)O%< 9<8-!8!-NggNNggN 5e/ $7!U2 ^&c;  <-! 4[* ;c& !-< %[\ 2` 1n:f 2& +M  2U! &2 M+) :n1 ,`2$ /e5N=s4 BIQ* 4s=*QIBCXn<'40'045.#""1"00132>7<16056454654&".'>32#81"326546312654&'"32>54."&54632#lPPk##kPPl#Dta !`tDCt`!!`tC5K  8( .R=##=R..R=##=R.OqqOOqqCpQ--QpCBpQ..QoC%C_9:^C%%C^::^C%K5 (8  `#=R..R=##=R..R=#`qOOqqOOqJW? "3!2764/&"!4&#  3    ?A      *k "&54632'"32654&s++++++++{w"&54632#" ?,"1,?1"y(md"&=.'#"&'&6?.'#"&546;>7'.7>32>7546327>3232+#"&/#'2326=467>762764/.7>7>;2654&+"&'.'&6?64'&""'.'.=4&#""/&"+";22?>3s                    ^     $ $      %  % (  '      '    &     '  x $ $        $ $       x "&54632'"32654&""""""""] ~d%"&=.'#"&'&6?.'#"&546;>7'.7>32>7546327>3232+#"&/#'2326=467>762276&/.7>7>;2654&+"&'.'&6?>'&'.'.=4&#"&/.+";22?>3            F                    ~        a                      @@ !!!!!!!!UUUUUZ ! ;S..1270>7>4&"'.467>7>81"13265146312654&+mro--orm+---- qePmo---Z  $##$"UZX$++$XZU####8P  =+ +,((((,+-ptp- q}dln-ptp ^#Y\X#"#!''!#"#X\YP8 +=  3 !!5!! #f113267>54&'.#"    (    3#@@1#"&'.5467>32>54&'.#"3267:67MM76::67MM76:25522FF225522FF2M76::67MM76::67M2FF225522FF22552ss81s81VXux.'.'.'&2762#146532677.5.'.'.'.7.'#.'.7>71>3263>7>74&'.'.'.'0610&#"'610&10&467>32#"&'.5467>32#"&'.5     &,              x    * G#; # /   #-Y   (C^.#"#113>7>7>54&51&'.'.5.5>71627>7>7>76&'.'            ,   #         'H"32>54.".54>32'764'&"'&"2?2764'jPPjjPPj]zFFz]]zFFzz     PjjPPjjP@Fz]]zFFz]]zF     PU91;KOTY^bg%'7'?7/7'%/?'7/7'/7''?/?''77'7'7'7''7RTLD^**//45uUiiev452;**UCTLiiaOO h@Do 34H +34 U,(^B UUjjSu77uSjjUU B U,(^u77uI|RRHDek 44Ю 448h 2#!"&5463%!"3!2654&#x!//!!//! /!!//!!/`p !"&5463!2| ` #"&54632      #"&54632     $T #"&54632T    \W_< 77G>E$<1CqqR,Y: #aUkypUd*y ZVP8$ z>"f$@ v d 0 J ~d$r8R,D*Pn2Z"nz* B v G`6u K   g = |   R 4pspiconpspiconVersion 1.0Version 1.0pspiconpspiconpspiconpspiconRegularRegularpspiconpspiconFont generated by IcoMoon.Font generated by IcoMoon.( G ȗȗu'smartSEO/aa-framework/fonts/pspicon.svg ob Generated by IcoMoon )G 2['smartSEO/aa-framework/fonts/pspicon.ttf ob 0OS/2`cmapVTgasppglyfUUxAhead JNC$6hhea C\$hmtx>Clocam{lDmaxpYE, nameZ ELpostF 3 @B@@ 8  B 797979@ (i%2673#"&'5337#7.#"#>327#%467>32>32+>732654&+.#".#";#"&5:X A';L*;b%-K-=-K-:X A';L*;b%"5+.Nh;N&Cj=PpP> '5KK5Q8.vL.R=#+8K5 PpI7)F47.%-%.-%.I7)F47.% 5X;gL,K=L;gBOq K55K6JEZ#=R.  F-5K@pP> 5$g~#54&+"#";;26=326=4&#.'467>54&'326?>'.+"0"#"3267>54&'46;2#"&5>;#81#.'&67 '   '  8! $'5 (BRoTOH271GU*2[= $NM;PJ 'B  &C   &   & w% H'$=& d:Pn   H: . `=:M#*? 45?. M55 O53ER#5463:15'"#3130<53ڊ VpGVVz7[6dJ~QR~I.'.#2#"&'.'.'.'.'.'&"#.'.1.'<7>7>7>7>7>'.'.'.'./.'.7>5>7>7>7>?>746?>763>7>7>7>7>7>74&'.'.'.'"&'.'.7>?>3>?>7>7>7>7267667>7>7>7>76231&'.'.'.'.'      & #  -      # +   )  "       & #  -      # +   - "        "  -  + #      )  # &       "  -   + #      - # &$k:!#"&'.'73267>54&'.+57## #3'3wyzI|!1@'3 D  / "u }~XyR(Xc) &A%.N 2  /0( \c<1@J"3267>54&'.##"&'.5467>32'#3533'>54&#2+53|     7   6        @    &I!  !0&'.10&5467>761725 2'2W`/:'/5"%M>-Q(#( ,cp#8(0'.'.'.1067>7>7>1' $ & 5()4  +, " -- '2 C1#7>7'777'%.''7'{G#  $  #G$  $G#  #G$E$  #  $G#  #G$  $G#CO1H54&#!5>54&#"!"#"&#"32654&'5!32654&'5!32654&'` (5B//B5( "-B//B>-2(5B//B5($'6B//B5(0 |>*.CC.*>|  ;&.CC.-B{|>*.CC.*>||>*.CC.*>;|+DSbq}04#4&'<'4&5&4'4&'4&5.'&41.'&05.'.'0"1.'&"#.'"&#.'0&1.'0&1.'"&1&""1""#"#"##""0"81"#810112021210123230227421267061>7263>7261>3463>7425>7041>7>785>7465>5>5>7463465647465645>78164'.467&".'>2>727"&'7"&546327.'64'>7|$2@@," #1@@-" #!!#|.&S&.&QSQ&.&S&.&QSQ&IggIIgg!##!81$ !,@A1$ !,AA/%RSQ%.'R'w"##"!##!vgIIggIIg/'R'.%RRR%qAe '&">762Z$..$$cS $..$ ! F 764/ $..$ "^$..$%bq%%.'2?"'$..$$c$ $..$ !!R vF >7.'&4d$..$! $..$$b $0<I[m"&54632"32654&#"&54632"32654&"&54632"32654&#%"&'&67%6#"&'%.7>#NnnNNnnNA      2'Du357354&'4&5.#"3.'.'*1#"+*'#0"#;2654&'.'7'.'5#'#3735>77'>735##"&'.54>32'.'.#"326'#0"132670"1 +, H, =PDP  > !//#N**N#//! BB !//#N**N#/0!CC+uBCt+(02UsAArV10)$ E$%D &b66b"C,,C  K]]d  L$  *N#/0!BB !//#N**N#/0!CC!0/#N*-33-*p@AsU11UsA@p*  '((,<;-!Cf%"&'&6654&&'.76#1"&54676654&'.546#%267>76"'&47>'&312'.'.'&76.54631%"'.762&=>54"&7>762'&67>654o:R   -vS,  $MA)T</."'"&'.'&632654&'.'.'.5467>32'.#"2#1753#3#3#7#"&54632#4&#"3265                        UD$ (H$ !''! $$u  6H D  D H6  6H D  D H      $H)'!!')"!,&3?%#!"&5463!*#!#732324+"31%"32654&##"32654& >vx{BH    P     iP000    k0'.''3776'0P~@4AvXezGE@y  4CE; d ''#300 Xxc]+VYR`0&'&67%617'77''746762716H&    $#*:35ylE/  : '  -9K"֞C":'%6546?6'&6765'&67n   `$%#5 `%$#5 $ (*P(*Ov<M%1'.#"676&7>'.'.7>376&'&'&":.#6454&'1:#"&5467.5.7<5467>7231>7>?.'.'>7>71"&'27>7"'27>7"'2?"'621 #   O"   ' E #9A#*^BB^*#A95.#, (%X/)SPI( ,$   55@,2k2,=??7  ( 84 ,&`      )    <   # :E;H,B^^B,H; 74**]>T &3@M2654&#"372654&#"32654&#"32654&#"372654&#"32654&#"3  U0A  Elt pB%>73#".'.54673#>7.'3267>75#46=35"&'>7>735.'>7.'>32.'.'.'3#1.'>71.'>71.'175>7.'12Y'  7L+SKC- +'8/9 <        %  %P++RLC&7  *9  <)  . ,+m="74,l>"745!556 #-4 -CLR+F~4  )_3H2 %Q)(L$       -%]5 %B $&  8 6'1H( '2H(9&EV&Dx <IWe'.'1.7>7423>0311"326=467>54&#2#"&54636&'&67&676&'6&'04#.'&"267>71d ,""K##= -"!J##<,?  ?,G   ' q & T-7!,8!"J##< -""J#$< -"\?,(B&, ,&B(,?G  `' ' 7!,7 -#/?Kaz?>'"&'.'&6?67'.'.7>71?&'>1'7&>76?67&'>231'7>76'"&#.'&&1`:3   !-7 ,:4 ?@!^4{! $^=,j"a ""($5w J($5x =""p "   qm  n o  92P, @$5 A$* &&1/ 6 z/ 6   $"a@ -:463232+#"&=#"&546;57"326544#"&5463 /  / /  /5JJ55KK5PppPOppOG  / /  / /9K55KK55K@pPOqqOPp ?IV`#532654&+54&+"#"3!2654&#!"&546;;26=32654&#'32+5#".54>;#532##33#BtY;Fm1A##;;#54.#".54677>32XtCCtXXtCCtXG|]5&"+k"+k;G|]5&kCtXXtCCtXXtC5]|G;k+""&"&5]|G;kk1S =3267171.'3.'#".54>7532>7%t?1|H5!7!6.Kb99bKKb9Ni9b9bKJb99bJjKJb9U)Ns".54>32#"32>54.#".=463232>=4632#".=463232>=4632#".=463232>=4632#ZtBBtZZtBBtZDnEEnDDnEEnDZtB EnDDnE BtZZtB EnDDnE BtZZtB EnDDnE BtZ4F()F44F)(F4V(7!!7''7!!7(4F) !7((7! )F44F) !7((7! )F44F) !7((7! )F4dkNZ>54&'7>/../.+"'&?;26?>76?6&/"&54632=ZUj$  $jUZZUj$  $jUZ>WW>>WW   F+ q q +F   F+ q q +FkW>>WW>>W@@%!!5!"3!265#33!++#22#V#2U֙]<UՕVU2##22#+U\<+9[2]%"&/&4?>32"/.#"326?62#"&'&4762326?64/&""'&4?62#-7,,76''''66'' X+|,,,79,|+X X ,,,|+0=Sbq#"&/.546?&267>'3>?'"'&4762"6764'.#"'&47627"'&476277'74&'./3  ! A4#####X[X#42122 [*w*** /N0B&33P "  4#X\W#####3@Q1211  *)*w*[*0M/3&P2Rq4 )%'7#/#7''%#'.'##\r"#s]!\`   Ty% %dmCgmCgCF  ! A r!"s (2;ENV_it~"32>54.#.'>7.'>70"#502.'.'>7:.'>7#>.'3.'>75*17>7'.'53'5>7##>3.'.'>73gNNggNNH <19B(BC"$-I#H&6Bu.7=|&H#I-7.uB%=%O)&I"7;k+36 W"CB(3+k; 6"I&)O%< 9<8-!8!-NggNNggN 5e/ $7!U2 ^&c;  <-! 4[* ;c& !-< %[\ 2` 1n:f 2& +M  2U! &2 M+) :n1 ,`2$ /e5N=s4 BIQ* 4s=*QIBCXn<'40'045.#""1"00132>7<16056454654&".'>32#81"326546312654&'"32>54."&54632#lPPk##kPPl#Dta !`tDCt`!!`tC5K  8( .R=##=R..R=##=R.OqqOOqqCpQ--QpCBpQ..QoC%C_9:^C%%C^::^C%K5 (8  `#=R..R=##=R..R=#`qOOqqOOqJW? "3!2764/&"!4&#  3    ?A      *k "&54632'"32654&s++++++++{w"&54632#" ?,"1,?1"y(md"&=.'#"&'&6?.'#"&546;>7'.7>32>7546327>3232+#"&/#'2326=467>762764/.7>7>;2654&+"&'.'&6?64'&""'.'.=4&#""/&"+";22?>3s                    ^     $ $      %  % (  '      '    &     '  x $ $        $ $       x "&54632'"32654&""""""""] ~d%"&=.'#"&'&6?.'#"&546;>7'.7>32>7546327>3232+#"&/#'2326=467>762276&/.7>7>;2654&+"&'.'&6?>'&'.'.=4&#"&/.+";22?>3            F                    ~        a                      @@ !!!!!!!!UUUUUZ ! ;S..1270>7>4&"'.467>7>81"13265146312654&+mro--orm+---- qePmo---Z  $##$"UZX$++$XZU####8P  =+ +,((((,+-ptp- q}dln-ptp ^#Y\X#"#!''!#"#X\YP8 +=  3 !!5!! #f113267>54&'.#"    (    3#@@1#"&'.5467>32>54&'.#"3267:67MM76::67MM76:25522FF225522FF2M76::67MM76::67M2FF225522FF22552ss81s81VXux.'.'.'&2762#146532677.5.'.'.'.7.'#.'.7>71>3263>7>74&'.'.'.'0610&#"'610&10&467>32#"&'.5467>32#"&'.5     &,              x    * G#; # /   #-Y   (C^.#"#113>7>7>54&51&'.'.5.5>71627>7>7>76&'.'            ,   #         'H"32>54.".54>32'764'&"'&"2?2764'jPPjjPPj]zFFz]]zFFzz     PjjPPjjP@Fz]]zFFz]]zF     PU91;KOTY^bg%'7'?7/7'%/?'7/7'/7''?/?''77'7'7'7''7RTLD^**//45uUiiev452;**UCTLiiaOO h@Do 34H +34 U,(^B UUjjSu77uSjjUU B U,(^u77uI|RRHDek 44Ю 448h 2#!"&5463%!"3!2654&#x!//!!//! /!!//!!/`p !"&5463!2| ` #"&54632      #"&54632     $T #"&54632T    \W_< 77G>E$<1CqqR,Y: #aUkypUd*y ZVP8$ z>"f$@ v d 0 J ~d$r8R,D*Pn2Z"nz* B v G`6u K   g = |   R 4pspiconpspiconVersion 1.0Version 1.0pspiconpspiconpspiconpspiconRegularRegularpspiconpspiconFont generated by IcoMoon.Font generated by IcoMoon.-dH Xg(smartSEO/aa-framework/fonts/pspicon.woff obwOFFG@ FOS/2``cmaphTTVgaspglyfAAUUheadCp66 JNhheaC$$ hmtxC>locaDm{lmaxpEx YnameEZ postG 3 @B@@ 8  B 797979@ (i%2673#"&'5337#7.#"#>327#%467>32>32+>732654&+.#".#";#"&5:X A';L*;b%-K-=-K-:X A';L*;b%"5+.Nh;N&Cj=PpP> '5KK5Q8.vL.R=#+8K5 PpI7)F47.%-%.-%.I7)F47.% 5X;gL,K=L;gBOq K55K6JEZ#=R.  F-5K@pP> 5$g~#54&+"#";;26=326=4&#.'467>54&'326?>'.+"0"#"3267>54&'46;2#"&5>;#81#.'&67 '   '  8! $'5 (BRoTOH271GU*2[= $NM;PJ 'B  &C   &   & w% H'$=& d:Pn   H: . `=:M#*? 45?. M55 O53ER#5463:15'"#3130<53ڊ VpGVVz7[6dJ~QR~I.'.#2#"&'.'.'.'.'.'&"#.'.1.'<7>7>7>7>7>'.'.'.'./.'.7>5>7>7>7>?>746?>763>7>7>7>7>7>74&'.'.'.'"&'.'.7>?>3>?>7>7>7>7267667>7>7>7>76231&'.'.'.'.'      & #  -      # +   )  "       & #  -      # +   - "        "  -  + #      )  # &       "  -   + #      - # &$k:!#"&'.'73267>54&'.+57## #3'3wyzI|!1@'3 D  / "u }~XyR(Xc) &A%.N 2  /0( \c<1@J"3267>54&'.##"&'.5467>32'#3533'>54&#2+53|     7   6        @    &I!  !0&'.10&5467>761725 2'2W`/:'/5"%M>-Q(#( ,cp#8(0'.'.'.1067>7>7>1' $ & 5()4  +, " -- '2 C1#7>7'777'%.''7'{G#  $  #G$  $G#  #G$E$  #  $G#  #G$  $G#CO1H54&#!5>54&#"!"#"&#"32654&'5!32654&'5!32654&'` (5B//B5( "-B//B>-2(5B//B5($'6B//B5(0 |>*.CC.*>|  ;&.CC.-B{|>*.CC.*>||>*.CC.*>;|+DSbq}04#4&'<'4&5&4'4&'4&5.'&41.'&05.'.'0"1.'&"#.'"&#.'0&1.'0&1.'"&1&""1""#"#"##""0"81"#810112021210123230227421267061>7263>7261>3463>7425>7041>7>785>7465>5>5>7463465647465645>78164'.467&".'>2>727"&'7"&546327.'64'>7|$2@@," #1@@-" #!!#|.&S&.&QSQ&.&S&.&QSQ&IggIIgg!##!81$ !,@A1$ !,AA/%RSQ%.'R'w"##"!##!vgIIggIIg/'R'.%RRR%qAe '&">762Z$..$$cS $..$ ! F 764/ $..$ "^$..$%bq%%.'2?"'$..$$c$ $..$ !!R vF >7.'&4d$..$! $..$$b $0<I[m"&54632"32654&#"&54632"32654&"&54632"32654&#%"&'&67%6#"&'%.7>#NnnNNnnNA      2'Du357354&'4&5.#"3.'.'*1#"+*'#0"#;2654&'.'7'.'5#'#3735>77'>735##"&'.54>32'.'.#"326'#0"132670"1 +, H, =PDP  > !//#N**N#//! BB !//#N**N#/0!CC+uBCt+(02UsAArV10)$ E$%D &b66b"C,,C  K]]d  L$  *N#/0!BB !//#N**N#/0!CC!0/#N*-33-*p@AsU11UsA@p*  '((,<;-!Cf%"&'&6654&&'.76#1"&54676654&'.546#%267>76"'&47>'&312'.'.'&76.54631%"'.762&=>54"&7>762'&67>654o:R   -vS,  $MA)T</."'"&'.'&632654&'.'.'.5467>32'.#"2#1753#3#3#7#"&54632#4&#"3265                        UD$ (H$ !''! $$u  6H D  D H6  6H D  D H      $H)'!!')"!,&3?%#!"&5463!*#!#732324+"31%"32654&##"32654& >vx{BH    P     iP000    k0'.''3776'0P~@4AvXezGE@y  4CE; d ''#300 Xxc]+VYR`0&'&67%617'77''746762716H&    $#*:35ylE/  : '  -9K"֞C":'%6546?6'&6765'&67n   `$%#5 `%$#5 $ (*P(*Ov<M%1'.#"676&7>'.'.7>376&'&'&":.#6454&'1:#"&5467.5.7<5467>7231>7>?.'.'>7>71"&'27>7"'27>7"'2?"'621 #   O"   ' E #9A#*^BB^*#A95.#, (%X/)SPI( ,$   55@,2k2,=??7  ( 84 ,&`      )    <   # :E;H,B^^B,H; 74**]>T &3@M2654&#"372654&#"32654&#"32654&#"372654&#"32654&#"3  U0A  Elt pB%>73#".'.54673#>7.'3267>75#46=35"&'>7>735.'>7.'>32.'.'.'3#1.'>71.'>71.'175>7.'12Y'  7L+SKC- +'8/9 <        %  %P++RLC&7  *9  <)  . ,+m="74,l>"745!556 #-4 -CLR+F~4  )_3H2 %Q)(L$       -%]5 %B $&  8 6'1H( '2H(9&EV&Dx <IWe'.'1.7>7423>0311"326=467>54&#2#"&54636&'&67&676&'6&'04#.'&"267>71d ,""K##= -"!J##<,?  ?,G   ' q & T-7!,8!"J##< -""J#$< -"\?,(B&, ,&B(,?G  `' ' 7!,7 -#/?Kaz?>'"&'.'&6?67'.'.7>71?&'>1'7&>76?67&'>231'7>76'"&#.'&&1`:3   !-7 ,:4 ?@!^4{! $^=,j"a ""($5w J($5x =""p "   qm  n o  92P, @$5 A$* &&1/ 6 z/ 6   $"a@ -:463232+#"&=#"&546;57"326544#"&5463 /  / /  /5JJ55KK5PppPOppOG  / /  / /9K55KK55K@pPOqqOPp ?IV`#532654&+54&+"#"3!2654&#!"&546;;26=32654&#'32+5#".54>;#532##33#BtY;Fm1A##;;#54.#".54677>32XtCCtXXtCCtXG|]5&"+k"+k;G|]5&kCtXXtCCtXXtC5]|G;k+""&"&5]|G;kk1S =3267171.'3.'#".54>7532>7%t?1|H5!7!6.Kb99bKKb9Ni9b9bKJb99bJjKJb9U)Ns".54>32#"32>54.#".=463232>=4632#".=463232>=4632#".=463232>=4632#ZtBBtZZtBBtZDnEEnDDnEEnDZtB EnDDnE BtZZtB EnDDnE BtZZtB EnDDnE BtZ4F()F44F)(F4V(7!!7''7!!7(4F) !7((7! )F44F) !7((7! )F44F) !7((7! )F4dkNZ>54&'7>/../.+"'&?;26?>76?6&/"&54632=ZUj$  $jUZZUj$  $jUZ>WW>>WW   F+ q q +F   F+ q q +FkW>>WW>>W@@%!!5!"3!265#33!++#22#V#2U֙]<UՕVU2##22#+U\<+9[2]%"&/&4?>32"/.#"326?62#"&'&4762326?64/&""'&4?62#-7,,76''''66'' X+|,,,79,|+X X ,,,|+0=Sbq#"&/.546?&267>'3>?'"'&4762"6764'.#"'&47627"'&476277'74&'./3  ! A4#####X[X#42122 [*w*** /N0B&33P "  4#X\W#####3@Q1211  *)*w*[*0M/3&P2Rq4 )%'7#/#7''%#'.'##\r"#s]!\`   Ty% %dmCgmCgCF  ! A r!"s (2;ENV_it~"32>54.#.'>7.'>70"#502.'.'>7:.'>7#>.'3.'>75*17>7'.'53'5>7##>3.'.'>73gNNggNNH <19B(BC"$-I#H&6Bu.7=|&H#I-7.uB%=%O)&I"7;k+36 W"CB(3+k; 6"I&)O%< 9<8-!8!-NggNNggN 5e/ $7!U2 ^&c;  <-! 4[* ;c& !-< %[\ 2` 1n:f 2& +M  2U! &2 M+) :n1 ,`2$ /e5N=s4 BIQ* 4s=*QIBCXn<'40'045.#""1"00132>7<16056454654&".'>32#81"326546312654&'"32>54."&54632#lPPk##kPPl#Dta !`tDCt`!!`tC5K  8( .R=##=R..R=##=R.OqqOOqqCpQ--QpCBpQ..QoC%C_9:^C%%C^::^C%K5 (8  `#=R..R=##=R..R=#`qOOqqOOqJW? "3!2764/&"!4&#  3    ?A      *k "&54632'"32654&s++++++++{w"&54632#" ?,"1,?1"y(md"&=.'#"&'&6?.'#"&546;>7'.7>32>7546327>3232+#"&/#'2326=467>762764/.7>7>;2654&+"&'.'&6?64'&""'.'.=4&#""/&"+";22?>3s                    ^     $ $      %  % (  '      '    &     '  x $ $        $ $       x "&54632'"32654&""""""""] ~d%"&=.'#"&'&6?.'#"&546;>7'.7>32>7546327>3232+#"&/#'2326=467>762276&/.7>7>;2654&+"&'.'&6?>'&'.'.=4&#"&/.+";22?>3            F                    ~        a                      @@ !!!!!!!!UUUUUZ ! ;S..1270>7>4&"'.467>7>81"13265146312654&+mro--orm+---- qePmo---Z  $##$"UZX$++$XZU####8P  =+ +,((((,+-ptp- q}dln-ptp ^#Y\X#"#!''!#"#X\YP8 +=  3 !!5!! #f113267>54&'.#"    (    3#@@1#"&'.5467>32>54&'.#"3267:67MM76::67MM76:25522FF225522FF2M76::67MM76::67M2FF225522FF22552ss81s81VXux.'.'.'&2762#146532677.5.'.'.'.7.'#.'.7>71>3263>7>74&'.'.'.'0610&#"'610&10&467>32#"&'.5467>32#"&'.5     &,              x    * G#; # /   #-Y   (C^.#"#113>7>7>54&51&'.'.5.5>71627>7>7>76&'.'            ,   #         'H"32>54.".54>32'764'&"'&"2?2764'jPPjjPPj]zFFz]]zFFzz     PjjPPjjP@Fz]]zFFz]]zF     PU91;KOTY^bg%'7'?7/7'%/?'7/7'/7''?/?''77'7'7'7''7RTLD^**//45uUiiev452;**UCTLiiaOO h@Do 34H +34 U,(^B UUjjSu77uSjjUU B U,(^u77uI|RRHDek 44Ю 448h 2#!"&5463%!"3!2654&#x!//!!//! /!!//!!/`p !"&5463!2| ` #"&54632      #"&54632     $T #"&54632T    \W_< 77G>E$<1CqqR,Y: #aUkypUd*y ZVP8$ z>"f$@ v d 0 J ~d$r8R,D*Pn2Z"nz* B v G`6u K   g = |   R 4pspiconpspiconVersion 1.0Version 1.0pspiconpspiconpspiconpspiconRegularRegularpspiconpspiconFont generated by IcoMoon.Font generated by IcoMoon.H Y4v*smartSEO/aa-framework/fonts/seo-checks.eot obDLPUseo-checksRegularVersion 1.0seo-checks 0OS/2`cmapVҎTgasppglyf x8head6hhea$hmtx'P 0loca <maxpYX name`]xpost$ 3 @@@ 8   797979!0CV.5467>5!!4..'!!.'#>7>?>7#4.=18>>8-J66J-8>>8-J66J!D Z 7B7b;$#<2b7B7<#$;K%11%Sfv@@vfS%11%Sfv@@vfS77(-07)B*0-(*B)7C}= '   7}ZZ"Z##ZZ"ZZ"Z# @  ' `@ `K5I"326?326?64'&"'732>54.#".54>323%!"3267>54#"&54632%#"326?  /{0$ 8((88((8;+0$  M 0 @$(d0(88((88$(d  7 '@@@@@@ ` `@@@@@@@-%'3"32>54.".54>32ӀjPPjjPPjPi< Generated by IcoMoon gH ]*smartSEO/aa-framework/fonts/seo-checks.ttf ob 0OS/2`cmapVҎTgasppglyf x8head6hhea$hmtx'P 0loca <maxpYX name`]xpost$ 3 @@@ 8   797979!0CV.5467>5!!4..'!!.'#>7>?>7#4.=18>>8-J66J-8>>8-J66J!D Z 7B7b;$#<2b7B7<#$;K%11%Sfv@@vfS%11%Sfv@@vfS77(-07)B*0-(*B)7C}= '   7}ZZ"Z##ZZ"ZZ"Z# @  ' `@ `K5I"326?326?64'&"'732>54.#".54>323%!"3267>54#"&54632%#"326?  /{0$ 8((88((8;+0$  M 0 @$(d0(88((88$(d  7 '@@@@@@ ` `@@@@@@@-%'3"32>54.".54>32ӀjPPjjPPjPi<5!!4..'!!.'#>7>?>7#4.=18>>8-J66J-8>>8-J66J!D Z 7B7b;$#<2b7B7<#$;K%11%Sfv@@vfS%11%Sfv@@vfS77(-07)B*0-(*B)7C}= '   7}ZZ"Z##ZZ"ZZ"Z# @  ' `@ `K5I"326?326?64'&"'732>54.#".54>323%!"3267>54#"&54632%#"326?  /{0$ 8((88((8;+0$  M 0 @$(d0(88((88$(d  7 '@@@@@@ ` `@@@@@@@-%'3"32>54.".54>32ӀjPPjjPPjPi< 86400, // 1day / seconds (86400 seconds = 24 hours) // timeout to verify if all plugin tables are installed right! 'check_integrity' => array( // seconds (86400 seconds = 24 hours) 'check_tables' => 259200, // 3 days 'check_alter_tables' => 259200, // 3 days ), 'add_meta_placeholder' => true, ); private static $plugin_row_meta = array( 'buy_url' => 'https://codecanyon.net/item/smart-seo-wordpress-plugin/224446', 'docs_url' => 'http://docs.aa-team.com/smartseo/', 'support_url' => 'http://support.aa-team.com/', 'latest_ver_url' => 'http://cc.aa-team.com/apps-versions/index.php?app=', 'portfolio' => 'http://codecanyon.net/user/aa-team/portfolio', ); public $plugin_tables = array('psp_link_builder', 'psp_link_redirect', 'psp_monitor_404', 'psp_web_directories', 'psp_serp_reporter', 'psp_serp_reporter2rank', 'psp_post_planner_cron'); public $title_meta_format_default = array(); // old = use old facebook sdk || fbv4 = use new facebook sdk (only authorization is implemented ) public $facebook_sdk_version = 'fbv4'; // old | fbv4 public $facebook_sdk_settings = array( // made for fbv4 'default_graph_version' => 'v2.4', 'persistent_data_handler' => 'session' ); /** * The constructor */ public function __construct($here = __FILE__) { $this->is_admin = is_admin() === true ? true : false; // get the globals utils global $wpdb; // store database instance $this->db = $wpdb; $miscSettings = $this->getAllSettings( 'array', 'misc' ); $this->use_wp_do_shortcode = isset($miscSettings['fix_use_wp_do_shortcode']) && 'no' == $miscSettings['fix_use_wp_do_shortcode'] ? false : true; // admin css cache time ( 0 = no caching ) $this->ss['css_cache_time'] = 86400; // seconds (86400 seconds = 24 hours) if( defined('PSP_DEV_STYLE') ){ $this->ss['css_cache_time'] = (int) PSP_DEV_STYLE; // seconds } add_action('wp_ajax_PSP_framework_style', array( $this, 'framework_style') ); add_action('wp_ajax_nopriv_PSP_framework_style', array( $this, 'framework_style') ); //$current_url = $_SERVER['HTTP_REFERER']; $current_url = $this->get_current_page_url(); $this->feedback_url = sprintf($this->feedback_url, $this->alias, rawurlencode($current_url)); $this->setIniConfiguration(); // load WP_Filesystem include_once ABSPATH . 'wp-admin/includes/file.php'; WP_Filesystem(); global $wp_filesystem; $this->wp_filesystem = $wp_filesystem; $this->update_developer(); $this->plugin_hash = get_option('psp_hash'); // set the freamwork alias $this->buildConfigParams('default', array( 'alias' => $this->alias )); // instance new WP_ERROR - http://codex.wordpress.org/Function_Reference/WP_Error $this->errors = new WP_Error(); // charset $optimizeSettings = $this->getAllSettings( 'array', 'on_page_optimization' ); if ( isset($optimizeSettings['charset']) && !empty($optimizeSettings['charset']) ) { $this->charset = $optimizeSettings['charset']; } // plugin root paths $this->buildConfigParams('paths', array( // http://codex.wordpress.org/Function_Reference/plugin_dir_url 'plugin_dir_url' => str_replace('aa-framework/', '', plugin_dir_url( (__FILE__) )), // http://codex.wordpress.org/Function_Reference/plugin_dir_path 'plugin_dir_path' => str_replace('aa-framework/', '', plugin_dir_path( (__FILE__) )) )); // add plugin lib design paths and url $this->buildConfigParams('paths', array( 'design_dir_url' => $this->cfg['paths']['plugin_dir_url'] . 'lib/design', 'design_dir_path' => $this->cfg['paths']['plugin_dir_path'] . 'lib/design' )); // add plugin scripts paths and url $this->buildConfigParams('paths', array( 'scripts_dir_url' => $this->cfg['paths']['plugin_dir_url'] . 'lib/scripts', 'scripts_dir_path' => $this->cfg['paths']['plugin_dir_path'] . 'lib/scripts' )); // add plugin admin paths and url $this->buildConfigParams('paths', array( 'freamwork_dir_url' => $this->cfg['paths']['plugin_dir_url'] . 'aa-framework/', 'freamwork_dir_path' => $this->cfg['paths']['plugin_dir_path'] . 'aa-framework/' )); // add core-modules alias $this->buildConfigParams('core-modules', array( 'dashboard', 'modules_manager', 'setup_backup', 'support', 'on_page_optimization', 'frontend', 'server_status', 'title_meta_format', //'misc', //'cronjobs', )); // list of freamwork css files $this->buildConfigParams('freamwork-css-files', array( 'core' => 'css/core.css', 'panel' => 'css/panel.css', 'form-structure' => 'css/form-structure.css', 'form-elements' => 'css/form-elements.css', 'form-message' => 'css/form-message.css', 'button' => 'css/button.css', 'table' => 'css/table.css', 'tipsy' => 'css/tooltip.css', 'additional' => 'css/additional.css' )); // list of freamwork js files $this->buildConfigParams('freamwork-js-files', array( 'admin' => 'js/admin.js', 'hashchange' => 'js/hashchange.js', 'ajaxupload' => 'js/ajaxupload.js', 'tipsy' => 'js/tooltip.js', //'menu-tooltip' => 'js/menu-tooltip.js', 'percentageloader-0.1' => 'js/jquery.percentageloader-0.1.min.js', 'flot-2.0' => 'js/jquery.flot/jquery.flot.min.js', 'flot-tooltip' => 'js/jquery.flot/jquery.flot.tooltip.min.js', 'flot-stack' => 'js/jquery.flot/jquery.flot.stack.min.js', 'flot-pie' => 'js/jquery.flot/jquery.flot.pie.min.js', 'flot-time' => 'js/jquery.flot/jquery.flot.time.js', 'flot-resize' => 'js/jquery.flot/jquery.flot.resize.min.js' )); // plugin folder in wp-content/plugins/ $plugin_folder = explode('wp-content/plugins/', $this->cfg['paths']['plugin_dir_path']); $plugin_folder = end($plugin_folder); $this->plugin_details = array( 'folder' => $plugin_folder, 'folder_index' => $plugin_folder . 'plugin.php', ); // utils functions require_once( $this->cfg['paths']['plugin_dir_path'] . 'aa-framework/utils/utils.php' ); if( class_exists('psp_Utils') ){ // $this->u = new psp_Utils( $this ); $this->u = psp_Utils::getInstance( $this ); } // plugin utils functions require_once( $this->cfg['paths']['plugin_dir_path'] . 'aa-framework/utils/plugin_utils.php' ); if( class_exists('psp_PluginUtils') ){ // $this->pu = new psp_PluginUtils( $this ); $this->pu = psp_PluginUtils::getInstance( $this ); } // get plugin text details $this->get_plugin_data(); if ( $this->is_admin ) { // load menu require_once( $this->cfg['paths']['plugin_dir_path'] . 'aa-framework/menu.php' ); // Run the plugins section load method add_action('wp_ajax_pspLoadSection', array( $this, 'load_section' )); // Plugin Depedencies Verification! if ( get_option('psp_depedencies_is_valid', false) ) { require_once( $this->cfg['paths']['scripts_dir_path'] . '/plugin-depedencies/plugin_depedencies.php' ); $this->pluginDepedencies = new aaTeamPluginDepedencies( $this ); // activation redirect to depedencies page if ( get_option('psp_depedencies_do_activation_redirect', false) ) { add_action('admin_init', array($this->pluginDepedencies, 'depedencies_plugin_redirect')); return false; } // verify plugin library depedencies $depedenciesStatus = $this->pluginDepedencies->verifyDepedencies(); if ( $depedenciesStatus['status'] == 'valid' ) { // go to plugin license code activation! add_action('admin_init', array($this->pluginDepedencies, 'depedencies_plugin_redirect_valid')); } else { // create depedencies page add_action('init', array( $this->pluginDepedencies, 'initDepedenciesPage' ), 5); return false; } } } // end is_admin // Run the plugins initialization method add_action('init', array( $this, 'initThePlugin' ), 5); add_action('init', array( $this, 'session_start' ), 1); if ( $this->is_admin ) { // Run the plugins section options save method add_action('wp_ajax_pspSaveOptions', array( $this, 'save_options' )); // Run the plugins section options save method add_action('wp_ajax_pspModuleChangeStatus', array( $this, 'module_change_status' )); // Run the plugins section options save method add_action('wp_ajax_pspModuleChangeStatus_bulk_rows', array( $this, 'module_bulk_change_status' )); // Run the plugins section options save method add_action('wp_ajax_pspInstallDefaultOptions', array( $this, 'install_default_options' )); // W3CValidate helper add_action('wp_ajax_pspW3CValidate', array( $this, 'pspW3CValidate' )); // W3CValidate helper add_action('wp_ajax_pspUpload', array( $this, 'upload_file' )); add_action('wp_ajax_pspWPMediaUploadImage', array( $this, 'wp_media_upload_image' )); add_action('wp_ajax_pspDismissNotice', array( $this, 'dismiss_notice' )); } // end is_admin require_once( $this->cfg['paths']['scripts_dir_path'] . '/utf8/utf8.php' ); $this->utf8 = pspUtf8::getInstance(); // admin ajax action require_once( $this->cfg['paths']['plugin_dir_path'] . 'aa-framework/utils/action_admin_ajax.php' ); new pspActionAdminAjax( $this ); if ( $this->is_admin ) { // import seo data require_once( $this->cfg['paths']['plugin_dir_path'] . 'aa-framework/utils/import_seodata.php' ); new pspImportSeoData( $this ); } // buddy press utils if ( $this->is_buddypress() ) { require_once( $this->cfg['paths']['plugin_dir_path'] . 'aa-framework/utils/buddypress.php' ); $this->buddypress_utils = new pspBuddyPress( $this ); } add_action('admin_init', array($this, 'plugin_redirect')); if( $this->debug == true ){ add_action('wp_footer', array($this, 'print_psp_usages') ); add_action('admin_footer', array($this, 'print_psp_usages') ); } if ( $this->is_admin ) { //add_action( 'admin_bar_menu', array($this->pu, 'update_notifier_bar_menu'), 1000 ); //add_action( 'admin_menu', array($this->pu, 'update_plugin_notifier_menu'), 1000 ); // add additional links below plugin on the plugins page //add_filter( 'plugin_row_meta', array($this->pu, 'plugin_row_meta_filter'), 10, 2 ); // alternative API to check updating for the filter transient //add_filter( 'pre_set_site_transient_update_plugins', array( $this->pu, 'update_plugins_overwrite' ), 10, 1 ); // alternative response with plugin details for admin thickbox tab //add_filter( 'plugins_api', array( $this->pu, 'plugins_api_overwrite' ), 10, 3 ); // message on wp plugins page with updating link //add_action( 'in_plugin_update_message-'.$this->plugin_details['folder_index'], array($this->pu, 'in_plugin_update_message'), 10, 2 ); } if ( $this->is_admin ) { require_once( $this->cfg['paths']['plugin_dir_path'] . 'aa-framework/ajax-list-table.php' ); new pspAjaxListTable( $this ); } // shortcodes require_once($this->cfg['paths']['plugin_dir_path'] . 'aa-framework/shortcodes/shortcodes.init.php'); new aafShortcodes( $this ); // clean cronjobs $this->cronjobs_clean_fix(); // fix bugs $this->fix_backlinkbuilder_linklist(); if ( !$this->is_admin ) { if ( isset($_POST['ispspreq']) && in_array( $_POST['ispspreq'], array('tax', 'post') ) ) { if ( $_POST['ispspreq'] == 'post' ) { add_filter( 'the_content', array( $this, 'mark_content' ), 0, 1 ); } else if ( $_POST['ispspreq'] == 'tax' ) { add_filter( 'term_description', array( $this, 'do_shortcode' ) ); add_filter( 'term_description', array( $this, 'mark_content' ), 0, 1 ); } add_action( 'wp', array( $this, 'clean_header' ) ); } } $is_installed = get_option( $this->alias . "_is_installed" ); if( $this->is_admin && $is_installed === false ) { add_action( 'admin_print_styles', array( $this, 'admin_notice_install_styles' ) ); } } public function framework_style() { $start = microtime(true); require $this->cfg['paths']['scripts_dir_path'] . "/scssphp/scss.inc.php"; $scss = new scssc(); $main_file = $this->wp_filesystem->get_contents( $this->cfg['paths']['freamwork_dir_path'] . "/scss/styles.scss" ); if( !$main_file ){ $main_file = file_get_contents( $this->cfg['paths']['freamwork_dir_path'] . "/scss/styles.scss" ); } $files = array(); if(preg_match_all('/@import (url\(\"?)?(url\()?(\")?(.*?)(?(1)\")+(?(2)\))+(?(3)\")/i', $main_file, $matches)){ foreach($matches[4] as $url){ if( file_exists( $this->cfg['paths']['freamwork_dir_path'] . "/scss/_" . $url . '.scss') ){ $files[] = '_' . $url . '.scss'; } if( file_exists( $this->cfg['paths']['freamwork_dir_path'] . "/scss/" . $url . '.scss') ){ $files[] = $url . '.scss'; } } } $buffer = ''; if( count($files) > 0 ){ foreach ($files as $scss_file) { if( 0 ){ $buffer .= "\n" . "/****-------------------------------\n"; $buffer .= "\n" . " IN FILE: $scss_file \n"; $buffer .= "\n" . "------------------------------------\n"; $buffer .= "\n***/\n"; } $has_wrote = $this->wp_filesystem->get_contents( $this->cfg['paths']['freamwork_dir_path'] . "/scss/" . $scss_file ); if ( !$has_wrote ) { $has_wrote = file_get_contents( $this->cfg['paths']['freamwork_dir_path'] . "/scss/" . $scss_file ); } $buffer .= $has_wrote; } } $buffer = $scss->compile( $buffer ); #$buffer = str_replace( "fonts/", $this->cfg['paths']['freamwork_dir_url'] . "fonts/", $buffer ); $buffer = str_replace( '#framework_url/', $this->cfg['paths']['freamwork_dir_url'], $buffer ); $buffer = str_replace( '#plugin_url', $this->cfg['paths']['plugin_dir_url'], $buffer ); //$buffer = str_replace( "images/", $this->cfg['paths']['freamwork_dir_url'] . "images/", $buffer ); $time_elapsed_secs = microtime(true) - $start; $buffer .= "\n\n/*** Compile time: $time_elapsed_secs */"; // Enable caching header('Cache-Control: public'); // Expire in one day header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 86400) . ' GMT'); // Set the correct MIME type, because Apache won't set it for us header("Content-type: text/css"); // Write everything out echo $buffer; $buffer = str_replace( $this->cfg['paths']['freamwork_dir_url'], '', $buffer ); $has_wrote = $this->wp_filesystem->put_contents( $this->cfg['paths']['freamwork_dir_path'] . 'main-style.css', $buffer ); if ( !$has_wrote ) { $has_wrote = file_put_contents( $this->cfg['paths']['freamwork_dir_path'] . 'main-style.css', $buffer ); } die; } public function print_section_header( $title='', $desc='', $docs_url='') { $html = array(); $html[] = '
'; $html[] = '
'; if( trim($title) != "" ) $html[] = '

' . ( $title ) . '

'; if( trim($desc) != "" ) $html[] = $desc; $html[] = '
'; $html[] = '
'; if( trim($docs_url) != "" ) $html[] = ' Documentation'; $html[] = ' More AA-Team Products'; $html[] = '
'; $html[] = '
'; return implode(PHP_EOL, $html); } public function session_start() { $session_id = isset($_COOKIE['PHPSESSID']) ? session_id($_COOKIE['PHPSESSID']) : ( isset($_REQUEST['PHPSESSID']) ? $_REQUEST['PHPSESSID'] : session_id() ); if(!$session_id) { // session isn't started session_start(); } //!isset($_SESSION['aateam_sess_dbg']) ? $_SESSION['aateam_sess_dbg'] = 0 : $_SESSION['aateam_sess_dbg']++; //var_dump('
',$_SESSION['aateam_sess_dbg'],'
'); } public function session_close() { session_write_close(); // close the session } public function dismiss_notice() { update_option( $this->alias . "_dismiss_notice" , "true" ); header( 'Location: ' . sprintf( admin_url('admin.php?page=%s'), $this->alias ) ); die; } public function notifier_cache_interval() { return self::NOTIFIER_CACHE_INTERVAL; } public function plugin_row_meta($what='') { if ( !empty($what) && isset(self::$plugin_row_meta["$what"]) ) { return self::$plugin_row_meta["$what"]; } return self::$plugin_row_meta; } /** * Utils */ /* public function lang_init() { //load_plugin_textdomain( $this->alias, false, $this->cfg['paths']["plugin_dir_path"] . '/languages/'); } */ public function do_shortcode( $content ) { if ( $this->use_wp_do_shortcode ) { $content = do_shortcode( $content ); } return $content; } public function mark_content( $content ) { return '
' . $content . '
'; } public function getPageContent( $post=null, $oldcontent='', $istax=false ) { $optimizeSettings = $this->getAllSettings( 'array', 'on_page_optimization' ); if ( !isset($optimizeSettings['parse_shortcodes']) || ( isset($optimizeSettings['parse_shortcodes']) && $optimizeSettings['parse_shortcodes'] != 'yes' ) ) { return $oldcontent; } //if ( !is_singular() ) return false; if ( !$this->is_admin ) return $oldcontent; if ( is_null($post) || ( !is_object($post) && !is_array($post) ) ) return $oldcontent; if ( $istax ) { if ( is_object($post) && !isset($post->term_id) ) return $oldcontent; if ( is_array($post) && !isset($post['term_id']) ) return $oldcontent; } else { if ( is_object($post) && !isset($post->ID) ) return $oldcontent; if ( is_array($post) && !isset($post['ID']) ) return $oldcontent; } if ( $istax ) { //return $oldcontent; // unnecessary for taxonomy! if ( is_object($post) ) { $id = (int) $post->term_id; } else if ( is_array($post) ) { $id = (int) $post['term_id']; $post = (object) $post; } $url = get_term_link($post); } else { $id = isset($post) && is_object($post) ? (int) $post->ID : 0; $url = wp_get_shortlink($id); } //$url .= "&ispspreq=yes"; /*$content = $this->remote_get( $url, 'default', array() ); //$content = file_get_contents( $url ); if ( !isset($content) || $content['status'] === 'invalid' ) return $oldcontent; $content = $content['body'];*/ //var_dump('
',$url,'
'); die; // check if will be redirected $headers = @get_headers( $url, 1 ); if(isset($headers['Location'])) { $url = $headers['Location']; // string } $resp = wp_remote_post( $url, array( 'method' => 'POST', 'timeout' => 45, 'redirection' => 10, 'httpversion' => '1.0', 'blocking' => true, 'headers' => array(), 'body' => array( 'ispspreq' => ( $istax ? 'tax' : 'post' ) ), 'cookies' => array() )); if ( is_wp_error( $resp ) ) { // If there's error //$err = htmlspecialchars( implode(';', $resp->get_error_messages()) ); return $oldcontent; } $content = wp_remote_retrieve_body( $resp ); //var_dump('
', $content , '
'); echo __FILE__ . ":" . __LINE__;die . PHP_EOL; //$pattern = "/\[pspmark\].*\[\/pspmark\]/imu"; //$ret = preg_match($pattern, $content, $matches); // php query class require_once( $this->cfg['paths']['scripts_dir_path'] . '/php-query/php-query.php' ); if ( !empty($this->charset) ) $doc = pspphpQuery::newDocument( $content, $this->charset ); else $doc = pspphpQuery::newDocument( $content ); $content = pspPQ('#psp-content-mark'); //var_dump('
', $content , '
'); echo __FILE__ . ":" . __LINE__;die . PHP_EOL; $content = $content->html(); //var_dump('
', $content , '
'); echo __FILE__ . ":" . __LINE__;die . PHP_EOL; //$title = pspPQ('h1:first'); //$title = $title->html(); //$title = '

'.$title.'

'; //$content = $title . $content; return $content; } public function clean_header() { remove_action('wp_head', 'feed_links_extra', 3); // This is the main code that removes unwanted RSS Feeds remove_action('wp_head', 'feed_links', 2); // Removes Post and Comment Feeds remove_action('wp_head', 'rsd_link'); // Removes link to RSD + XML remove_action('wp_head', 'wlwmanifest_link'); // Removes the link to Windows manifest remove_action('wp_head', 'index_rel_link'); // Removes the index link remove_action('wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0); // Remove relational links for the posts adjacent to the current post. remove_action('wp_head', 'wp_generator'); // Remove the XHTML generator link remove_action('wp_head', 'rel_canonical'); // Remov canonical url remove_action('wp_head', 'start_post_rel_link', 10, 0); // Remove start link remove_action('wp_head', 'parent_post_rel_link', 10, 0); // Remove previous/next link remove_action('wp_head', 'locale_stylesheet'); // Remove local stylesheet from theme } public function clean_footer() { echo ''; } public function admin_notice_install_styles() { if( !wp_style_is($this->alias . '-activation') ) { wp_enqueue_style( $this->alias . '-activation', $this->cfg['paths']['freamwork_dir_url'] . 'css/activation.css'); } //add_action( 'admin_notices', array( $this, 'admin_install_notice' ) ); } public function update_developer() { return true; if ( in_array($_SERVER['REMOTE_ADDR'], array('86.124.69.217', '86.124.76.250')) ) { $this->dev = 'andrei'; } else{ $this->dev = 'gimi'; } } /** * Some Plugin Status Info */ public function plugin_redirect() { $req = array( 'disable_activation' => isset($_REQUEST['disable_activation']) ? 1 : 0, 'page' => isset($_REQUEST['page']) ? (string) $_REQUEST['page'] : '', ); extract($req); if ( $disable_activation && $this->alias == $page ) { update_option( $this->alias . "_is_installed", true ); wp_redirect( get_admin_url() . 'admin.php?page=psp' ); } if ( get_option('psp_do_activation_redirect', false) ) { delete_option('psp_do_activation_redirect'); wp_redirect( get_admin_url() . 'admin.php?page=psp' ); } } public function activate() { add_option('psp_do_activation_redirect', true); add_option('psp_depedencies_is_valid', true); add_option('psp_depedencies_do_activation_redirect', true); $this->plugin_integrity_check(); } public function get_plugin_data() { $this->details = $this->pu->get_plugin_data(); return $this->details; } public function get_latest_plugin_version($interval) { return $this->pu->get_latest_plugin_version($interval); } // add admin js init public function createInstanceFreamwork () { echo " "; } /** * Create plugin init * * * @no-return */ public function initThePlugin() { $is_admin = $this->is_admin; $loadPluginData = false; // If the user can manage options, let the fun begin! $page = isset($_REQUEST['page']) ? $_REQUEST['page'] : ''; if ( $is_admin /*&& current_user_can( 'manage_options' )*/ ) { if ( (stripos($page,'codestyling') === false) ) { // Adds actions to hook in the required css and javascript add_action( "admin_print_styles", array( $this, 'admin_load_styles') ); add_action( "admin_print_scripts", array( $this, 'admin_load_scripts') ); // get fatal errors add_action ( 'admin_notices', array( $this, 'fatal_errors'), 10 ); // get fatal errors add_action ( 'admin_notices', array( $this, 'admin_warnings'), 10 ); } // create dashboard page add_action( 'admin_menu', array( $this, 'createDashboardPage' ) ); $loadPluginData = true; } else if ( !$is_admin ) { $loadPluginData = true; } if ( $loadPluginData ) { // keep the plugin modules into storage $this->load_modules(); // SEO rules class require_once( $this->cfg['paths']['scripts_dir_path'] . '/seo-check-class/seo.class.php' ); } } public function fixPlusParseStr ( $input=array(), $type='string', $sign='' ) { $ret = ''; if($type == 'array'){ if(count($input) > 0){ $ret_arr = array(); foreach ($input as $key => $value){ $ret = str_replace("###", '+', $value); if ('&' == $sign) { $ret = str_replace("#1#", '&', $value); } $ret_arr[$key] = $ret; } return $ret_arr; } return $input; }else{ $ret = str_replace('+', '###', $input); if ('&' == $sign) { $ret = str_replace("%26", '#1#', $input); } return $ret; } } // saving the options public function save_options () { // remove action from request unset($_REQUEST['action']); // unserialize the request options $serializedData = $_REQUEST['options']; $serializedData = $this->fixPlusParseStr($serializedData, 'string', '&'); $serializedData = urldecode($serializedData); $serializedData = $this->fixPlusParseStr($serializedData, 'string'); $savingOptionsArr = array(); parse_str($serializedData, $savingOptionsArr); $savingOptionsArr = $this->fixPlusParseStr( $savingOptionsArr, 'array'); $savingOptionsArr = $this->fixPlusParseStr( $savingOptionsArr, 'array', '&'); // create save_id and remote the box_id from array $save_id = $savingOptionsArr['box_id']; unset($savingOptionsArr['box_id']); // Verify that correct nonce was used with time limit. if( ! wp_verify_nonce( $savingOptionsArr['box_nonce'], $save_id . '-nonce')) die ('Busted!'); unset($savingOptionsArr['box_nonce']); // special cases! - local seo if ( $save_id == 'psp_local_seo' && isset($savingOptionsArr['slug']) ) { $savingOptionsArr['slug'] = sanitize_title( $savingOptionsArr['slug'] ); } if ( $save_id == 'psp_socialsharing' /*&& isset($savingOptionsArr['toolbar']) && $savingOptionsArr['toolbar']!='none'*/ ) { $__old_saving = get_option('psp_socialsharing', true); $__old_saving = maybe_unserialize($__old_saving); $__old_saving = (array) $__old_saving; //foreach (array('floating', 'content_horizontal', 'content_vertical') as $k=>$v) { if ( isset($savingOptionsArr['toolbar']) ) { foreach (array('-pages', '-exclude-categ') as $kk=>$vv) { $__key = $savingOptionsArr['toolbar'] . $vv; if ( !array_key_exists($__key, $savingOptionsArr) ) $savingOptionsArr["$__key"] = $__old_saving["$__key"] = array(); } } //} $savingOptionsArr = array_replace_recursive( $__old_saving, $savingOptionsArr ); } if ( $save_id == 'psp_Minify' ) { $__old_saving = get_option('psp_Minify', true); $__old_saving = maybe_unserialize($__old_saving); $__old_saving = (array) $__old_saving; if ( isset($__old_saving["cache"]) ) { $savingOptionsArr["cache"] = $__old_saving["cache"]; } } // options NOT saved to db from options panel! $opt_nosave = isset($_REQUEST['opt_nosave']) ? (array) $_REQUEST['opt_nosave'] : array(); if ( !empty($opt_nosave) ) { $__old_saving = get_option($save_id, true); $__old_saving = maybe_unserialize($__old_saving); $__old_saving = (array) $__old_saving; foreach ($opt_nosave as $kk=>$vv) { // unset( $savingOptionsArr["$vv"] ); if ( isset($__old_saving["$vv"]) ) $savingOptionsArr["$vv"] = $__old_saving["$vv"]; } } //var_dump('
', $savingOptionsArr, '
'); echo __FILE__ . ":" . __LINE__;die . PHP_EOL; // prepare the data for DB update $savingOptionsArr = stripslashes_deep($savingOptionsArr); $saveIntoDb = serialize( $savingOptionsArr ); // Use the function update_option() to update a named option/value pair to the options database table. The option_name value is escaped with $wpdb->escape before the INSERT statement. update_option( $save_id, $saveIntoDb ); die(json_encode( array( 'status' => 'ok', 'html' => __('Options updated successfully', $this->localizationName) ))); } public function save_theoption( $option_name, $option_value ) { $save_id = $option_name; // we receive unserialized option_value $savingOptionsArr = $option_value; $savingOptionsArr = $this->fixPlusParseStr( $savingOptionsArr, 'array'); // prepare the data for DB update $savingOptionsArr = stripslashes_deep($savingOptionsArr); $saveIntoDb = serialize( $savingOptionsArr ); // Use the function update_option() to update a named option/value pair to the options database table. The option_name value is escaped with $wpdb->escape before the INSERT statement. update_option( $save_id, $saveIntoDb ); } public function get_theoption( $option_name ) { $opt = get_option( $option_name ); if ( $opt === false ) return false; $opt = maybe_unserialize($opt); return $opt; } // saving the options public function install_default_options () { // remove action from request unset($_REQUEST['action']); // unserialize the request options $serializedData = urldecode($_REQUEST['options']); $savingOptionsArr = array(); parse_str($serializedData, $savingOptionsArr); // fix for setup if ( $savingOptionsArr['box_id'] == 'psp_setup_box' ) { $serializedData = preg_replace('/box_id=psp_setup_box&box_nonce=[\w]*&install_box=/', '', $serializedData); $savingOptionsArr['install_box'] = $serializedData; $savingOptionsArr['install_box'] = str_replace( "\\'", "\\\\'", $savingOptionsArr['install_box']); } // create save_id and remove the box_id from array $save_id = $savingOptionsArr['box_id']; unset($savingOptionsArr['box_id']); // Verify that correct nonce was used with time limit. if( ! wp_verify_nonce( $savingOptionsArr['box_nonce'], $save_id . '-nonce')) die ('Busted!'); unset($savingOptionsArr['box_nonce']); // default sql - tables & tables data! require_once( $this->cfg['paths']['plugin_dir_path'] . 'modules/setup_backup/default-sql.php'); if ( $save_id != 'psp_setup_box' ) { $savingOptionsArr['install_box'] = str_replace( '\"', '"', $savingOptionsArr['install_box']); } // convert to array $pullOutArray = json_decode( $savingOptionsArr['install_box'], true ); if(count($pullOutArray) == 0){ die(json_encode( array( 'status' => 'error', 'html' => __("Invalid install default json string, can't parse it!", $this->localizationName) ))); }else{ foreach ($pullOutArray as $key => $value){ // prepare the data for DB update $saveIntoDb = ( $value ); if( $saveIntoDb === true ){ $saveIntoDb = 'true'; } else if( $saveIntoDb === false ){ $saveIntoDb = 'false'; } //special case - it's not double serialized! if ($key=='psp_taxonomy_seo') { $saveIntoDb = $value; continue 1; } // Use the function update_option() to update a named option/value pair to the options database table. The option_name value is escaped with $wpdb->escape before the INSERT statement. update_option( $key, $saveIntoDb ); } // update is_installed value to true update_option( $this->alias . "_is_installed", 'true'); die(json_encode( array( 'status' => 'ok', 'html' => __('Install default successful', $this->localizationName) ))); } } public function submatch ($sub_match) { return '\u00' . dechex(ord($sub_match[1])); } public function options_validate ( $input ) { //var_dump('
', $input  , '
'); echo __FILE__ . ":" . __LINE__;die . PHP_EOL; } public function module_change_status ( $resp='ajax' ) { // remove action from request unset($_REQUEST['action']); // update into DB the new status $db_alias = $this->alias . '_module_' . $_REQUEST['module']; update_option( $db_alias, $_REQUEST['the_status'] ); if ( $_REQUEST['module'] == 'facebook_planner' ) { if ( $_REQUEST['the_status'] == 'true' ) { // @at plugin/module activation - setup cron //wp_schedule_event(time(), 'hourly', 'pspwplannerhourlyevent'); //add_action('pspwplannerhourlyevent', array( $this, 'facebook_wplanner_do_this_hourly' )); } else if ( $_REQUEST['the_status'] == 'false' ) { // @at plugin/module deactivation - clean the scheduler on plugin deactivation //wp_clear_scheduled_hook('pspwplannerhourlyevent'); } } if ( !isset($resp) || empty($resp) || $resp == 'ajax' ) { die(json_encode(array( 'status' => 'ok' ))); } } public function module_bulk_change_status () { global $wpdb; // this is how you get access to the database $request = array( 'id' => isset($_REQUEST['id']) && !empty($_REQUEST['id']) ? trim($_REQUEST['id']) : '' ); if (trim($request['id'])!='') { $__rq2 = array(); $__rq = explode(',', $request['id']); if (is_array($__rq) && count($__rq)>0) { foreach ($__rq as $k=>$v) { $__rq2[] = (string) $v; } } else { $__rq2[] = $__rq; } $request['id'] = implode(',', $__rq2); } if (is_array($__rq2) && count($__rq2)>0) { foreach ($__rq2 as $kk=>$vv) { $_REQUEST['module'] = $vv; $this->module_change_status( 'non-ajax' ); } die( json_encode(array( 'status' => 'valid', 'msg' => 'valid module change status Bulk' )) ); } die( json_encode(array( 'status' => 'invalid', 'msg' => 'invalid module change status Bulk' )) ); } // loading the requested section public function load_section () { $request = array( 'section' => isset($_REQUEST['section']) ? strip_tags($_REQUEST['section']) : false, 'subsection' => isset($_REQUEST['subsection']) ? strip_tags($_REQUEST['subsection']) : false ); // get module if isset if(!in_array( $request['section'], $this->cfg['activate_modules'])) die(json_encode(array('status' => 'err', 'msg' => __('invalid section want to load!', $this->localizationName)))); $tryed_module = $this->cfg['modules'][$request['section']]; if( isset($tryed_module) && count($tryed_module) > 0 ){ if (1) { // Turn on output buffering ob_start(); $opt_file_path = $tryed_module['folder_path'] . 'options.php'; if( is_file($opt_file_path) ) { // I believe there is a bug which load a module multiple times - for title & meta format module I needed to load options.php file multiple times if ( 'title_meta_format' == $request['section'] ) { require( $opt_file_path ); } else { require_once( $opt_file_path ); } } $options = ob_get_contents(); //copy current buffer contents into $message variable and delete current output buffer ob_end_clean(); } if(trim($options) != "") { $options = json_decode($options, true); // Derive the current path and load up psp_aaInterfaceTemplates $plugin_path = dirname(__FILE__) . '/'; if(class_exists('psp_aaInterfaceTemplates') != true) { require_once($plugin_path . 'settings-template.class.php'); // Initalize the your psp_aaInterfaceTemplates $psp_aaInterfaceTemplates = new psp_aaInterfaceTemplates($this->cfg); // then build the html, and return it as string $html = $psp_aaInterfaceTemplates->bildThePage($options, $this->alias, $tryed_module); // fix some URI $html = str_replace('{plugin_folder_uri}', $tryed_module['folder_uri'], $html); if(trim($html) != "") { $headline = $tryed_module[$request['section']]['menu']['title'] . ""; $has_help = isset($tryed_module[$request['section']]['help']) ? true : false; if( $has_help === true ){ $help_type = isset($tryed_module[$request['section']]['help']['type']) && $tryed_module[$request['section']]['help']['type'] ? 'remote' : 'local'; if( $help_type == 'remote' ){ if ( is_array($tryed_module[$request['section']]['help']['url']) ) { if ( !empty($request['subsection']) ) $docRemoteUrl = $tryed_module[$request['section']]['help']['url']["{$request['subsection']}"]; else { reset( $tryed_module[$request['section']]['help']['url'] ); $firstElem = key( $tryed_module[$request['section']]['help']['url'] ); $docRemoteUrl = $tryed_module[$request['section']]['help']['url']["$firstElem"]; } } else { $docRemoteUrl = $tryed_module[$request['section']]['help']['url']; } $headline .= 'HELP'; } } die( json_encode(array( 'status' => 'ok', 'headline' => $headline, 'html' => $html )) ); } die(json_encode(array('status' => 'err', 'msg' => 'invalid html formatter!'))); } } } } public function fatal_errors() { // print errors if(is_wp_error( $this->errors )) { $_errors = $this->errors->get_error_messages('fatal'); if(count($_errors) > 0){ foreach ($_errors as $key => $value){ echo '

' . ( $value ) . '

'; } } } } public function admin_warnings() { // print errors if(is_wp_error( $this->errors )) { $_errors = $this->errors->get_error_messages('warning'); if(count($_errors) > 0){ foreach ($_errors as $key => $value){ echo '

' . ( $value ) . '

'; } } } } /** * Builds the config parameters * * @param string $function * @param array $params * * @return array */ protected function buildConfigParams($type, array $params) { // check if array exist if(isset($this->cfg[$type])){ $params = array_merge( $this->cfg[$type], $params ); } // now merge the arrays $this->cfg = array_merge( $this->cfg, array( $type => array_merge( $params ) ) ); } /* * admin_load_styles() * * Loads admin-facing CSS */ public function admin_get_frm_style() { $css = array(); if( isset($this->cfg['freamwork-css-files']) && is_array($this->cfg['freamwork-css-files']) && !empty($this->cfg['freamwork-css-files']) ) { foreach ($this->cfg['freamwork-css-files'] as $key => $value){ if( is_file($this->cfg['paths']['freamwork_dir_path'] . $value) ) { $cssId = $this->alias . '-' . $key; $css["$cssId"] = $this->cfg['paths']['freamwork_dir_path'] . $value; // wp_enqueue_style( $this->alias . '-' . $key, $this->cfg['paths']['freamwork_dir_url'] . $value ); } else { $this->errors->add( 'warning', __('Invalid CSS path to file: ' . $this->cfg['paths']['freamwork_dir_path'] . $value . '. Call in:' . __FILE__ . ":" . __LINE__ , $this->localizationName) ); } } } return $css; } public function admin_load_styles() { global $wp_scripts; $protocol = is_ssl() ? 'https' : 'http'; $javascript = $this->admin_get_scripts(); wp_enqueue_style( $this->alias . '-google-Roboto', $protocol . '://fonts.googleapis.com/css?family=Roboto:400,500,400italic,500italic,700,700italic' ); wp_enqueue_style( $this->alias . '-font-awesome', $protocol . '://maxcdn.bootstrapcdn.com/font-awesome/4.6.2/css/font-awesome.min.css' ); wp_enqueue_style( $this->alias . '-admin-font', $this->cfg['paths']['freamwork_dir_url'] . 'css/font.css' ); wp_enqueue_style( $this->alias . '-seo-checks', $this->cfg['paths']['freamwork_dir_url'] . 'css/seo-checks.css' ); $main_style = admin_url('admin-ajax.php?action=PSP_framework_style'); $main_style_cached = $this->cfg['paths']['freamwork_dir_path'] . 'main-style.css'; if( is_file( $main_style_cached ) ) { if( (filemtime($main_style_cached) + $this->ss['css_cache_time']) > time() ) { $main_style = $this->cfg['paths']['freamwork_dir_url'] . 'main-style.css'; } } // !!! debug - please in the future, don't forget to comment it after you're finished with debugging //$main_style = admin_url('admin-ajax.php?action=PSP_framework_style'); wp_enqueue_style( $this->alias . '-main-style', $main_style, array( $this->alias . '-font-awesome' ) ); /*$style_url = $this->cfg['paths']['freamwork_dir_url'] . 'load-styles.php'; if ( is_file( $this->cfg['paths']['freamwork_dir_path'] . 'load-styles.css' ) ) { $style_url = str_replace('.php', '.css', $style_url); } wp_enqueue_style( 'psp-aa-framework-styles', $style_url );*/ if( in_array( 'jquery-ui-core', $javascript ) ) { $ui = $wp_scripts->query('jquery-ui-core'); if ($ui) { $uiBase = "//code.jquery.com/ui/{$ui->ver}/themes/smoothness"; wp_register_style('jquery-ui-core', "$uiBase/jquery-ui.css", FALSE, $ui->ver); wp_enqueue_style('jquery-ui-core'); } } if( in_array( 'thickbox', $javascript ) ) wp_enqueue_style('thickbox'); } /* * admin_load_scripts() * * Loads admin-facing CSS */ public function admin_get_scripts() { $javascript = array(); $current_url = isset($_SERVER["REQUEST_URI"]) ? $_SERVER["REQUEST_URI"] : ''; $current_url = explode("wp-admin/", $current_url); if( count($current_url) > 1 ){ $current_url = "/wp-admin/" . $current_url[1]; }else{ $current_url = "/wp-admin/" . $current_url[0]; } if ( isset($this->cfg['modules']) && is_array($this->cfg['modules']) && !empty($this->cfg['modules']) ) { foreach( $this->cfg['modules'] as $alias => $module ){ if( isset($module[$alias]["load_in"]['backend']) && is_array($module[$alias]["load_in"]['backend']) && count($module[$alias]["load_in"]['backend']) > 0 ){ // search into module for current module base on request uri foreach ( $module[$alias]["load_in"]['backend'] as $page ) { $delimiterFound = strpos($page, '#'); $page = substr($page, 0, ($delimiterFound!==false && $delimiterFound > 0 ? $delimiterFound : strlen($page)) ); $urlfound = preg_match("%^/wp-admin/".preg_quote($page)."%", $current_url); if( // $current_url == '/wp-admin/' . $page ( ( $page == '@all' ) || ( $current_url == '/wp-admin/admin.php?page=psp' ) || ( !empty($page) && $urlfound > 0 ) ) && isset($module[$alias]['javascript']) ) { $javascript = array_merge($javascript, $module[$alias]['javascript']); } } } } } // end if $this->jsFiles = $javascript; return $javascript; } public function admin_load_scripts() { // very defaults scripts (in wordpress defaults) wp_enqueue_script( 'jquery' ); $javascript = $this->admin_get_scripts(); if( count($javascript) > 0 ){ $javascript = @array_unique( $javascript ); if( in_array( 'jquery-ui-core', $javascript ) ) wp_enqueue_script( 'jquery-ui-core' ); if( in_array( 'jquery-ui-widget', $javascript ) ) wp_enqueue_script( 'jquery-ui-widget' ); if( in_array( 'jquery-ui-mouse', $javascript ) ) wp_enqueue_script( 'jquery-ui-mouse' ); if( in_array( 'jquery-ui-accordion', $javascript ) ) wp_enqueue_script( 'jquery-ui-accordion' ); if( in_array( 'jquery-ui-autocomplete', $javascript ) ) wp_enqueue_script( 'jquery-ui-autocomplete' ); if( in_array( 'jquery-ui-slider', $javascript ) ) wp_enqueue_script( 'jquery-ui-slider' ); if( in_array( 'jquery-ui-tabs', $javascript ) ) wp_enqueue_script( 'jquery-ui-tabs' ); if( in_array( 'jquery-ui-sortable', $javascript ) ) wp_enqueue_script( 'jquery-ui-sortable' ); if( in_array( 'jquery-ui-draggable', $javascript ) ) wp_enqueue_script( 'jquery-ui-draggable' ); if( in_array( 'jquery-ui-droppable', $javascript ) ) wp_enqueue_script( 'jquery-ui-droppable' ); if( in_array( 'jquery-ui-datepicker', $javascript ) ) wp_enqueue_script( 'jquery-ui-datepicker' ); if( in_array( 'jquery-ui-resize', $javascript ) ) wp_enqueue_script( 'jquery-ui-resize' ); if( in_array( 'jquery-ui-dialog', $javascript ) ) wp_enqueue_script( 'jquery-ui-dialog' ); if( in_array( 'jquery-ui-button', $javascript ) ) wp_enqueue_script( 'jquery-ui-button' ); if( in_array( 'thickbox', $javascript ) ) wp_enqueue_script( 'thickbox' ); // date & time picker if( !wp_script_is('jquery-timepicker') ) { if( in_array( 'jquery-timepicker', $javascript ) ) wp_enqueue_script( 'jquery-timepicker' , $this->cfg['paths']['freamwork_dir_url'] . 'js/jquery.timepicker.v1.1.1.min.js', array( 'jquery', 'jquery-ui-core', 'jquery-ui-datepicker', 'jquery-ui-slider' ) ); } // star rating - rateit if( !wp_script_is('jquery-rateit-js') ) { if( in_array( 'jquery-rateit-js', $javascript ) ) { if( !wp_style_is('jquery-rateit-css') ) wp_enqueue_style( 'jquery-rateit-css' , $this->cfg['paths']['freamwork_dir_url'] . 'js/rateit/rateit.css' ); wp_enqueue_script( 'jquery-rateit-js' , $this->cfg['paths']['freamwork_dir_url'] . 'js/rateit/jquery.rateit.min.js', array( 'jquery' ) ); } } } if( count($this->cfg['freamwork-js-files']) > 0 ){ foreach ($this->cfg['freamwork-js-files'] as $key => $value){ if( is_file($this->cfg['paths']['freamwork_dir_path'] . $value) ){ if( in_array( $key, $javascript ) ) wp_enqueue_script( $this->alias . '-' . $key, $this->cfg['paths']['freamwork_dir_url'] . $value . '?' . time() ); } else { $this->errors->add( 'warning', __('Invalid JS path to file: ' . $this->cfg['paths']['freamwork_dir_path'] . $value . ' . Call in:' . __FILE__ . ":" . __LINE__ , $this->localizationName) ); } } } } /* * Builds out the options panel. * * If we were using the Settings API as it was likely intended we would use * do_settings_sections here. But as we don't want the settings wrapped in a table, * we'll call our own custom wplanner_fields. See options-interface.php * for specifics on how each individual field is generated. * * Nonces are provided using the settings_fields() * * @param array $params * @param array $options (fields) * */ public function createDashboardPage () { if ( $this->capabilities_user_has_module('dashboard') ) { //if( $psp->can_manage('view_seo_dashboard') ){ add_menu_page( __( 'smartSEO - Dashboard', $this->localizationName ), __( 'smartSEO', $this->localizationName ), 'read', $this->alias, array( $this, 'manage_options_template' ), $this->cfg['paths']['plugin_dir_url'] . 'icon_16.png' ); //} } } public function display_index_page() { echo __FILE__ . ":" . __LINE__;die . PHP_EOL; } public function manage_options_template() { // Derive the current path and load up psp_aaInterfaceTemplates $plugin_path = dirname(__FILE__) . '/'; if(class_exists('psp_aaInterfaceTemplates') != true) { require_once($plugin_path . 'settings-template.class.php'); // Initalize the your psp_aaInterfaceTemplates $psp_aaInterfaceTemplates = new psp_aaInterfaceTemplates($this->cfg); // try to init the interface $psp_aaInterfaceTemplates->printBaseInterface(); } } /** * Getter function, plugin config * * @return array */ public function getCfg() { return $this->cfg; } /** * Getter function, plugin all settings * * @params $returnType * @return array */ public function getAllSettings( $returnType='array', $only_box='' ) { $allSettingsQuery = "SELECT * FROM " . $this->db->prefix . "options where 1=1 and option_name REGEXP '" . ( $this->alias) . "_([a-z_]*)$';"; // ORDER BY option_name asc if (trim($only_box) != "") { $allSettingsQuery = "SELECT option_value, option_name FROM " . $this->db->prefix . "options where option_name = '" . ( $this->alias . '_' . $only_box) . "'"; } $results = $this->db->get_results( $allSettingsQuery, ARRAY_A); // prepare the return $return = array(); if( count($results) > 0 ){ foreach ($results as $key => $value){ //special case - it's not double serialized! if ($value['option_name']=='psp_taxonomy_seo') { $return[$value['option_name']] = @unserialize($value['option_value']); continue 1; } if($value['option_value'] == 'true'){ $return[$value['option_name']] = true; }else{ //$return[$value['option_name']] = @unserialize(@unserialize($value['option_value'])); $return[$value['option_name']] = maybe_unserialize($value['option_value']); $return[$value['option_name']] = maybe_unserialize($return[$value['option_name']]); } } } if(trim($only_box) != "" && isset($return[$this->alias . '_' . $only_box])){ $return = $return[$this->alias . '_' . $only_box]; } if($returnType == 'serialize'){ return serialize($return); }else if( $returnType == 'array' ){ return $return; }else if( $returnType == 'json' ){ return json_encode($return); } return false; } /** * Getter function, all products * * @params $returnType * @return array */ public function getAllProductsMeta( $returnType='array', $key='' ) { $allSettingsQuery = "SELECT * FROM " . $this->db->prefix . "postmeta where 1=1 and meta_key='" . ( $key ) . "'"; $results = $this->db->get_results( $allSettingsQuery, ARRAY_A); // prepare the return $return = array(); if( count($results) > 0 ){ foreach ($results as $key => $value){ if(trim($value['meta_value']) != ""){ $return[] = $value['meta_value']; } } } if($returnType == 'serialize'){ return serialize($return); } else if( $returnType == 'text' ){ return implode("\n", $return); } else if( $returnType == 'array' ){ return $return; } else if( $returnType == 'json' ){ return json_encode($return); } return false; } /* * GET modules lists */ public function load_modules( $pluginPage='' ) { $folder_path = $this->cfg['paths']['plugin_dir_path'] . 'modules/'; $cfgFileName = 'config.php'; // static usage, modules menu order $menu_order = array(); $modules_list = glob($folder_path . '*/' . $cfgFileName); $nb_modules = count($modules_list); if ( $nb_modules > 0 ) { foreach ($modules_list as $key => $mod_path ) { $dashboard_isfound = preg_match("/modules\/dashboard\/config\.php$/", $mod_path); $depedencies_isfound = preg_match("/modules\/depedencies\/config\.php$/", $mod_path); if ( $pluginPage == 'depedencies' ) { if ( $depedencies_isfound!==false && $depedencies_isfound>0 ) ; else continue 1; } else { if ( $dashboard_isfound!==false && $dashboard_isfound>0 ) { unset($modules_list[$key]); $modules_list[$nb_modules] = $mod_path; } } } } foreach($modules_list as $module_config ){ $module_folder = str_replace($cfgFileName, '', $module_config); // Turn on output buffering ob_start(); if( is_file( $module_config ) ) { global $psp; //echo __FILE__ . ":" . __LINE__; require_once( $module_config ); } $settings = ob_get_clean(); //copy current buffer contents into $message variable and delete current output buffer //var_dump('
',$module_config,$settings,'
'); if(trim($settings) != "") { $settings = json_decode($settings, true); $__settings = array_keys($settings); // e-strict solve! $alias = (string)end($__settings); // create the module folder URI // fix for windows server $module_folder = str_replace( DIRECTORY_SEPARATOR, '/', $module_folder ); $__tmpUrlSplit = explode("/", $module_folder); $__tmpUrl = ''; $nrChunk = count($__tmpUrlSplit); if($nrChunk > 0) { foreach ($__tmpUrlSplit as $key => $value){ if( $key > ( $nrChunk - 4) && trim($value) != ""){ $__tmpUrl .= $value . "/"; } } } // get the module status. Check if it's activate or not $status = false; // default activate all core modules if ( $pluginPage == 'depedencies' ) { if ( $alias != 'depedencies' ) continue 1; else $status = true; } else { if ( $alias == 'depedencies' ) continue 1; if(in_array( $alias, $this->cfg['core-modules'] )) { $status = true; }else{ // activate the modules from DB status $db_alias = $this->alias . '_module_' . $alias; if(get_option($db_alias) == 'true'){ $status = true; } } } // push to modules array $this->cfg['modules'][$alias] = array_merge(array( 'folder_path' => $module_folder, 'folder_uri' => $this->cfg['paths']['plugin_dir_url'] . $__tmpUrl, 'db_alias' => $this->alias . '_' . $alias, 'alias' => $alias, 'status' => $status ), $settings ); // add to menu order array http://cc.aa-team.com/wp-plugins/smart-seo-v2/wp-admin/admin-ajax.php?action=pspLoadSection§ion=Social_Stats if(!isset($this->cfg['menu_order'][(int)$settings[$alias]['menu']['order']])){ $this->cfg['menu_order'][(int)$settings[$alias]['menu']['order']] = $alias; }else{ // add the menu to next free key $this->cfg['menu_order'][] = $alias; } // add module to activate modules array if($status == true){ $this->cfg['activate_modules'][$alias] = true; } // load the init of current loop module $time_start = microtime(true); $start_memory_usage = (memory_get_usage()); // in backend if( $this->is_admin === true && isset($settings[$alias]["load_in"]['backend']) ){ $need_to_load = false; if( is_array($settings[$alias]["load_in"]['backend']) && count($settings[$alias]["load_in"]['backend']) > 0 ){ $current_url = isset($_SERVER["REQUEST_URI"]) ? $_SERVER["REQUEST_URI"] : ''; $current_url = explode("wp-admin/", $current_url); if( count($current_url) > 1 ){ $current_url = "/wp-admin/" . $current_url[1]; }else{ $current_url = "/wp-admin/" . $current_url[0]; } foreach ( $settings[$alias]["load_in"]['backend'] as $page ) { $delimiterFound = strpos($page, '#'); $page = substr($page, 0, ($delimiterFound!==false && $delimiterFound > 0 ? $delimiterFound : strlen($page)) ); $urlfound = preg_match("%^/wp-admin/".preg_quote($page)."%", $current_url); $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : ''; $section = isset($_REQUEST['section']) ? $_REQUEST['section'] : ''; if( // $current_url == '/wp-admin/' . $page || ( ( $page == '@all' ) || ( $current_url == '/wp-admin/admin.php?page=psp' ) || ( !empty($page) && $urlfound > 0 ) ) || ( $action == 'pspLoadSection' && $section == $alias ) || substr($action, 0, 3) == 'psp' ){ $need_to_load = true; } } } if( $need_to_load == false ){ continue; } } if( $this->is_admin === false && isset($settings[$alias]["load_in"]['frontend']) ){ $need_to_load = false; if( $settings[$alias]["load_in"]['frontend'] === true ){ $need_to_load = true; } if( $need_to_load == false ){ continue; } } if( $status == true && isset( $settings[$alias]['module_init'] ) ){ if( is_file($module_folder . $settings[$alias]['module_init']) ){ //if( $this->is_admin ) { $current_module = array($alias => $this->cfg['modules'][$alias]); require_once( $module_folder . $settings[$alias]['module_init'] ); $time_end = microtime(true); $this->cfg['modules'][$alias]['loaded_in'] = $time_end - $time_start; $this->cfg['modules'][$alias]['memory_usage'] = (memory_get_usage() ) - $start_memory_usage; if( (float)$this->cfg['modules'][$alias]['memory_usage'] < 0 ){ $this->cfg['modules'][$alias]['memory_usage'] = 0.0; } //} } } } } // order menu_order ascendent ksort($this->cfg['menu_order']); } public function print_psp_usages() { $html = array(); $html[] = ''; $html[] = '

PSP: Benchmark performance

'; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; $total_time = 0; $total_size = 0; foreach ($this->cfg['modules'] as $key => $module ) { $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; $total_time = $total_time + $module['loaded_in']; $total_size = $total_size + $module['memory_usage']; } $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = '
ModuleLoading timeMemory usage
' . ( $key ) . '' . ( number_format($module['loaded_in'], 4) ) . '(seconds)' . ( $this->formatBytes($module['memory_usage']) ) . '
'; $html[] = 'Total time: ' . ( $total_time ) . '(seconds)
'; $html[] = 'Total Memory: ' . ( $this->formatBytes($total_size) ) . '
'; $html[] = '
'; //echo ''; echo implode("\n", $html ); } public function check_secure_connection () { $secure_connection = false; if(isset($_SERVER['HTTPS'])) { if ($_SERVER["HTTPS"] == "on") { $secure_connection = true; } } return $secure_connection; } /* helper function, image_resize // use timthumb */ public function image_resize ($src='', $w=100, $h=100, $zc=2) { // in no image source send, return no image if( trim($src) == "" ){ $src = $this->cfg['paths']['freamwork_dir_url'] . '/images/no-product-img.jpg'; } if( is_file($this->cfg['paths']['plugin_dir_path'] . 'timthumb.php') ) { return $this->cfg['paths']['plugin_dir_url'] . 'timthumb.php?src=' . $src . '&w=' . $w . '&h=' . $h . '&zc=' . $zc; } } /* helper function, upload_file */ public function upload_file () { $slider_options = ''; // Acts as the name $clickedID = $_POST['clickedID']; // Upload if ($_POST['type'] == 'upload') { $override['action'] = 'wp_handle_upload'; $override['test_form'] = false; $filename = $_FILES [$clickedID]; $uploaded_file = wp_handle_upload($filename, $override); if (!empty($uploaded_file['error'])) { echo json_encode(array("error" => "Upload Error: " . $uploaded_file['error'])); } else { die( json_encode(array( "url" => $uploaded_file['url'], "thumb" => $this->image_resize( $uploaded_file['url'], $_POST['thumb_w'], $_POST['thumb_h'], $_POST['thumb_zc'] ) ) ) ); } // Is the Response }else{ echo json_encode(array("error" => "Invalid action send" )); } die(); } public function wp_media_upload_image() { $image = wp_get_attachment_image_src( (int)$_REQUEST['att_id'], 'thumbnail' ); die(json_encode(array( 'status' => 'valid', 'thumb' => $image[0] ))); } /** * Getter function, shop config * * @params $returnType * @return array */ public function setConfig( $section='', $key='' ) { if( !is_array($this->app_settings) || empty($this->app_settings) ){ $this->app_settings = $this->getAllSettings(); } } public function getConfig( $section='', $key='', $returnAs='echo' ) { $this->setConfig( $section, $key ); if( isset($this->app_settings[$this->alias . "_" . $section])) { if( isset($this->app_settings[$this->alias . "_" . $section][$key])) { if( $returnAs == 'echo' ) echo $this->app_settings[$this->alias . "_" . $section][$key]; if( $returnAs == 'return' ) return $this->app_settings[$this->alias . "_" . $section][$key]; } } } public function download_image( $file_url='', $pid=0, $action='insert' ) { if(trim($file_url) != ""){ // Find Upload dir path $uploads = wp_upload_dir(); $uploads_path = $uploads['path'] . ''; $uploads_url = $uploads['url']; $fileExt = end(explode(".", $file_url)); $filename = uniqid() . "." . $fileExt; // Save image in uploads folder $response = wp_remote_get( $file_url ); if( !is_wp_error( $response ) ){ $image = $response['body']; file_put_contents( $uploads_path . '/' . $filename, $image ); $image_url = $uploads_url . '/' . $filename; // URL of the image on the disk $image_path = $uploads_path . '/' . $filename; // Path of the image on the disk // Add image in the media library - Step 3 $wp_filetype = wp_check_filetype( basename( $image_path ), null ); $attachment = array( 'post_mime_type' => $wp_filetype['type'], 'post_title' => preg_replace( '/\.[^.]+$/', '', basename( $image_path ) ), 'post_content' => '', 'post_status' => 'inherit' ); $attach_id = wp_insert_attachment( $attachment, $image_path, $pid ); require_once( ABSPATH . 'wp-admin/includes/image.php' ); $attach_data = wp_generate_attachment_metadata( $attach_id, $image_path ); wp_update_attachment_metadata( $attach_id, $attach_data ); return array( 'attach_id' => $attach_id, 'image_path' => $image_path ); } } } public function remove_gallery($content) { return str_replace('[gallery]', '', $content); } public function pspW3CValidate() { require_once( $this->cfg['modules']['W3C_HTMLValidator']['folder_path'] . 'app.class.php' ); $pspW3C_HTMLValidator = new pspW3C_HTMLValidator($this->cfg, $module); $pspW3C_HTMLValidator->validateLink(); } /** * HTML escape given string * * @param string $text * @return string */ public function escape($text) { $text = (string) $text; if ('' === $text) return ''; $result = @htmlspecialchars($text, ENT_COMPAT, 'UTF-8'); if (empty($result)) { $result = @htmlspecialchars(utf8_encode($text), ENT_COMPAT, 'UTF-8'); } return $result; } public function get_page_meta( $url='' ) { $data = array(); if( trim($url) != "" ){ // try to get page meta $response = wp_remote_get( $url, array( 'timeout' => 15 ) ); // If there's error if ( is_wp_error( $response ) ) return $data; $html_data = wp_remote_retrieve_body( $response ); if( trim($html_data) != "" ){ require_once( $this->cfg['paths']['scripts_dir_path'] . '/php-query/php-query.php' ); if ( !empty($this->charset) ) $doc = pspphpQuery::newDocument( $html_data, $this->charset ); else $doc = pspphpQuery::newDocument( $html_data ); // try to get the page title $data['page_title'] = $doc->find('title')->text(); // try to get the page meta description $data['page_meta_description'] = $doc->find('meta[name="description"]')->attr('content'); // try to get the page meta keywords $data['page_meta_keywords'] = $doc->find('meta[name="keywords"]')->attr('content'); } return $data; } } public function verify_module_status( $module='' ) { if ( empty($module) ) return false; $mod_active = get_option( 'psp_module_'.$module ); if ( $mod_active != 'true' ) return false; //module is inactive! return true; } public function edit_post_inline_data( $post_id, $seo=null, $tax=false, $post_content='empty' ) { if ( $this->__tax_istax( $tax ) ) { //taxonomy data! $post = $tax; $post_id = (int) $post->term_id; $post_title = $post->name; if( $post_content == 'empty' ){ $post_content = $this->getPageContent( $post, $post->description, true ); } if ( empty($post_content) ) { $post_content = $post->description; } $psp_current_taxseo = $this->__tax_get_post_meta( null, $post ); if ( is_null($psp_current_taxseo) || !is_array($psp_current_taxseo) ) $psp_current_taxseo = array(); $post_metas = $this->get_psp_meta( $post, $psp_current_taxseo ); } else { $post = get_post($post_id); if ( isset($post) && is_object($post) ) { $post_id = (int) $post->ID; $post_title = $post->post_title; if( $post_content == 'empty' ){ $post_content = $this->getPageContent( $post, $post->post_content ); } if ( empty($post_content) ) { $post_content = $post->post_content; } } else { $post_id = 0; $post_content = ''; $post_title = ''; } $post_metas = $this->get_psp_meta( $post_id ); if ( is_array($post_metas) && ! empty($post_metas) ) { $post_metas['sitemap_isincluded'] = get_post_meta( $post_id, 'psp_sitemap_isincluded', true ); } } $post_metas = array_merge(array( 'title' => '', 'description' => '', 'keywords' => '', 'focus_keyword' => '', 'canonical' => '', 'robots_index' => '', 'robots_follow' => '', 'priority' => '', 'sitemap_isincluded' => '', ), (array) $post_metas); if ( is_null($seo) || !is_object($seo) ) { //use to generate meta keywords, and description for your requested item require_once( $this->cfg['paths']['scripts_dir_path'] . '/seo-check-class/seo.class.php' ); $seo = pspSeoCheck::getInstance(); } // meta description $first_paragraph = $seo->get_first_paragraph( $post_content ); $get_meta_desc = $seo->get_meta_desc( $first_paragraph ); // meta keywords $get_meta_keywords = array(); // focus keyword add to keywords is implemented in js file! //if ( !empty($post_metas['focus_keyword']) ) { // $get_meta_keywords[] = $post_metas['focus_keyword']; //} $__tmp = $seo->get_meta_keywords( $post_content ); if ( !empty($__tmp) ) { //$get_meta_keywords[] = $__tmp; $get_meta_keywords[] = implode(", ", $__tmp ); } $get_meta_keywords = implode(', ', $get_meta_keywords); $post_metas['robots_index'] = isset($post_metas['robots_index']) && !empty($post_metas['robots_index']) ? $post_metas['robots_index'] : 'default' ; $post_metas['robots_follow'] = isset($post_metas['robots_follow']) && !empty($post_metas['robots_follow']) ? $post_metas['robots_follow'] : 'default'; $post_metas['priority'] = isset($post_metas['priority']) && !empty($post_metas['priority']) ? $post_metas['priority'] : '-' ; $post_metas['sitemap_isincluded'] = isset($post_metas['sitemap_isincluded']) && !empty($post_metas['sitemap_isincluded']) ? $post_metas['sitemap_isincluded'] : 'default'; $html = array(); $html[] = '
' . $post_title . '
'; $html[] = '
' . $get_meta_desc . '
'; $html[] = '
' . $get_meta_keywords . '
'; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = '
' . $post_metas['priority'] . '
'; $html[] = '
' . $post_metas['sitemap_isincluded'] . '
'; $fieldsParams = array( 'mfocus_keyword' => isset($post_metas['mfocus_keyword']) ? $post_metas['mfocus_keyword'] : '' ); $html[] = ''; // post default - placeholder $postDefault = $this->get_post_metatags( $post ); // add meta placeholder if ( ! empty($postDefault) ) { foreach ( $postDefault as $key => $val) { $html[] = '
' . $val . '
'; } } return implode(PHP_EOL, $html); } public function edit_post_inline_boxtpl() { // sitemap priority $sitemap_priority = array(); $__range = range(0, 1, 0.1); $__range2 = array(); for ($i=(count($__range)-1); $i>=0; $i--) { $__range2[] = $__range[ $i ]; } foreach ($__range2 as $kk => $vv) { $__priorityText = ''; $vv = (string) $vv; if ( $vv=='1' ) $__priorityText = ' - ' . __('Highest priority', 'psp'); else if ( $vv=='0.5' ) $__priorityText = ' - ' . __('Medium priority', 'psp'); else if ( $vv=='0.1' ) $__priorityText = ' - ' . __('Lowest priority', 'psp'); $sitemap_priority[] = ''; } $sitemap_priority = implode(PHP_EOL, $sitemap_priority); /*
Focus Keyword:
*/ $html = '
' . __('Meta Description', $this->localizationName) . ' ' . __('Meta Keywords', $this->localizationName) . '
' . __('Meta Title:', $this->localizationName) . '
' . __('Canonical URL:', $this->localizationName) . '
' . __('Meta Robots Index:', $this->localizationName) . '
' . __('Meta Robots Follow:', $this->localizationName) . '
' . __('Include in Sitemap:', $this->localizationName) . '
' . __('Sitemap Priority:', $this->localizationName) . '
'; return $html; } /** * Taxonomy meta box methods! */ // wp get_post_meta - for taxonomy public function __tax_get_post_meta( $post_meta=null, $post=null, $key='' ) { if ( !$this->__tax_istax( $post ) ) return null; $psp_taxonomy_seo = $post_meta; if ( is_null($post_meta) ) { $psp_taxonomy_seo = get_option( 'psp_taxonomy_seo' ); if ( $psp_taxonomy_seo===false ) return null; } if ( is_null($psp_taxonomy_seo) ) return null; if ( empty($psp_taxonomy_seo) ) return null; if ( is_null($post_meta) ) { if ( isset($psp_taxonomy_seo[ "{$post->taxonomy}" ], $psp_taxonomy_seo[ "{$post->taxonomy}" ][ "{$post->term_id}" ]) ) $psp_current_taxseo = $psp_taxonomy_seo[ "{$post->taxonomy}" ][ "{$post->term_id}" ]; else return null; } else $psp_current_taxseo = $post_meta; if ( !isset($psp_current_taxseo) || !is_array($psp_current_taxseo) ) return null; if ( $key=='' ) return $psp_current_taxseo; if ( isset($psp_current_taxseo[ "$key" ]) ) return $psp_current_taxseo[ "$key" ]; return null; } // wp update_post_meta - for taxonomy public function __tax_update_post_meta( $post=null, $keyval=array() ) { if ( !$this->__tax_istax( $post ) ) return false; $psp_taxonomy_seo = get_option( 'psp_taxonomy_seo' ); if ( $psp_taxonomy_seo===false ) $psp_taxonomy_seo = array(); if ( !is_array($keyval) || empty($keyval) ) // mandatory array of (key, value) pairs! return false; if ( empty($psp_taxonomy_seo) ) { $psp_taxonomy_seo = array(); } $psp_current_taxseo = array(); if ( isset($psp_taxonomy_seo[ "{$post->taxonomy}" ], $psp_taxonomy_seo[ "{$post->taxonomy}" ][ "{$post->term_id}" ]) ) { $psp_current_taxseo = $psp_taxonomy_seo[ "{$post->taxonomy}" ][ "{$post->term_id}" ]; } if ( !is_array($psp_current_taxseo) ) $psp_current_taxseo = array(); foreach ( $keyval as $key => $value ) { if ( isset($psp_current_taxseo[" $key "]) ) unset( $psp_current_taxseo[" $key "] ); $psp_current_taxseo[ "$key" ] = $value; } $psp_taxonomy_seo[ "{$post->taxonomy}" ][ "{$post->term_id}" ] = $psp_current_taxseo; update_option( 'psp_taxonomy_seo', $psp_taxonomy_seo ); } // wp get_post - for taxonomy public function __tax_get_post( $post=null, $output='OBJECT', $filter='raw' ) { if ( !$this->__tax_istax( $post ) ) return null; //$__post = get_term_by( 'id', $post->term_id, $post->taxonomy, $output, $filter ); $__post = get_term( $post->term_id, $post->taxonomy, $output, $filter ); return $__post!==false ? $__post : null; } // verify a taxonomy is used! public function __tax_istax( $post=null ) { $__istax = false; // default is post | page | custom post type edit page! if ( is_object($post) && count((array) $post)>=2 && isset($post->term_id) && isset($post->taxonomy) && $post->term_id > 0 && !empty($post->taxonomy) ) $__istax = true; // is category | tag | custom taxonomy edit page! return $__istax; } /** * remote_get - alternative to wp_remote_get by proxy! */ // return one random of the most common user agents public function fakeUserAgent() { $userAgents = array( 'Mozilla/5.0 (Windows; U; Win95; it; rv:1.8.1) Gecko/20061010 Firefox/2.0', 'Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-HK; rv:1.8.1.7) Gecko Firefox/2.0', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15', 'Mozilla/5.0 (Windows; U; Windows NT 6.1; es-AR; rv:1.9) Gecko/2008051206 Firefox/3.0', 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6 ; nl; rv:1.9) Gecko/2008051206 Firefox/3.0', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; es-AR; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11', 'Mozilla/5.0 (X11; U; Linux x86_64; cy; rv:1.9.1b3) Gecko/20090327 Fedora/3.1-0.11.beta3.fc11 Firefox/3.1b3', 'Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.2a1pre) Gecko/20090403 Firefox/3.6a1pre', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; Win64; x64; SV1)', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322)', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 1.1.4322; InfoPath.2; .NET CLR 3.5.21022)', 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET CLR 1.1.4322; Tablet PC 2.0; OfficeLiveConnector.1.3; OfficeLivePatch.1.3; MS-RTC LM 8; InfoPath.3)', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; FDM; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 1.1.4322)', 'Mozilla/4.0 (compatible; MSIE 6.0; Mac_PowerPC; en) Opera 9.00', 'Mozilla/5.0 (X11; Linux i686; U; en) Opera 9.00', 'Mozilla/4.0 (compatible; MSIE 6.0; Mac_PowerPC; en) Opera 9.00', 'Opera/9.00 (Nintindo Wii; U; ; 103858; Wii Shop Channel/1.0; en)', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 6.0; pt-br) Opera 9.25', 'Opera/9.50 (Macintosh; Intel Mac OS X; U; en)', 'Opera/9.61 (Windows NT 6.1; U; zh-cn) Presto/2.1.1', 'Mozilla/5.0 (Windows NT 5.0; U; en-GB; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.61', 'Opera/10.00 (X11; Linux i686; U; en) Presto/2.2.0', 'Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 10.00', 'Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686 ; en) Opera 10.00', 'Opera/9.80 (Windows NT 6.0; U; fi) Presto/2.2.0 Version/10.00', 'Mozilla/5.0 (Windows; U; Windows NT 6.1; da) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5', 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; ar) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.18', 'Mozilla/5.0 (Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0_1 like Mac OS X; hu-hu) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5G77 Safari/525.20', 'Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2_1 like Mac OS X; es-es) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5H11 Safari/525.20', 'Mozilla/5.0 (Windows; U; Windows NT 6.0; he-IL) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16', 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; zh-CN) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19' ); // rondomize user agents shuffle( $userAgents ); return $userAgents[0]; } // requestType : default | proxy | noproxy public function remote_get( $url, $requestType='default', $headers=array() ) { $ret = array( 'status' => 'invalid', 'body' => '', 'msg' => '' ); $err = ''; if ( $requestType == 'default' ) { if ( isset($headers) && !empty($headers) ) $resp = wp_remote_get( $url, $headers ); else $resp = wp_remote_get( $url ); if ( is_wp_error( $resp ) ) { // If there's error $body = false; $err = htmlspecialchars( implode(';', $resp->get_error_messages()) ); } else if ( //Unauthorized isset($resp['response'], $resp['response']['code']) && (401 == (int) $resp['response']['code']) ) { $body = false; //401 Unauthorized: the page you were trying to access cannot be loaded until you first log in with a valid user ID and password $err = '401 Unauthorized: also verify if your website requires .htpasswd authorization.'; } else { $body = wp_remote_retrieve_body( $resp ); } //$body = file_get_contents( $url ); } else if ( $requestType == 'noproxy' ) { // no Proxy! $args = array( 'user-agent' => $this->fakeUserAgent(), 'timeout' => 20 ); if ( isset($headers) && !empty($headers) ) { $args = array_merge($args, $headers); } $resp = wp_remote_get( $url, $args ); if ( is_wp_error( $resp ) ) { // If there's error $body = false; $err = htmlspecialchars( implode(';', $resp->get_error_messages()) ); } else { $body = wp_remote_retrieve_body( $resp ); } } if (is_null($body) || !$body || trim($body)=='') { //status is Invalid! $ret = array_merge($ret, array( 'msg' => trim($err) != '' ? $err : 'empty body response retrieved!' )); //couldn't retrive data! return $ret; } $ret = array_merge($ret, array( //status is valid! 'status' => 'valid', 'body' => $body )); return $ret; } // smushit public function smushit_show_sizes_msg_details( $meta=array(), $show_sizes=true ) { $ret = array(); // get only selected sizes! $selected_sizes = $this->smushit_tinify_option('image_sizes'); //if ( !isset($meta['psp_smushit']) || empty($meta['psp_smushit']) ) return $ret; // original file should be smushed if ( in_array('__original', $selected_sizes) ) { $ret[] = $meta['psp_smushit']['msg']; } if ( !$show_sizes ){ return $ret; } // no media sizes if ( !isset($meta['sizes']) || empty($meta['sizes']) ) { return $ret; } foreach ( $meta['sizes'] as $key => $val ) { // current size should be smushed if ( !in_array($key, $selected_sizes) ) continue 1; $ret[] = $val['psp_smushit']['msg']; } return $ret; } public function smushit_tinify_option($opt, $settings=array()) { if (empty($settings)) { $settings = (array) $this->get_theoption( 'psp_tiny_compress' ); } $ret = null; if (!empty($settings) && is_array($settings) && isset($settings["$opt"])) { $ret = $settings["$opt"]; } if ( $opt == 'image_sizes' ) { $ret = array_merge( array('__original' => '__original'), (array) $ret ); } return $ret; } // rich snippets public function loadRichSnippets( $section='init' ) { if ( !in_array($section, array('init', 'options')) ) return false; $folder_path = $this->cfg['paths']['plugin_dir_path'] . 'modules/rich_snippets/shortcodes/'; if ( $section=='options') { $cfgFileName = 'options.php'; $retOpt = array(); } else if ( $section=='init') { $cfgFileName = 'init.php'; } foreach(glob($folder_path . '*/' . $cfgFileName) as $module_config ){ $module_folder = str_replace($cfgFileName, '', $module_config); if ( $section=='init') { if( $this->verifyFileExists( $module_config ) ) { require_once( $module_config ); } } else if ( $section=='options') { if( $this->verifyFileExists( $module_config ) ) { // Turn on output buffering ob_start(); require( $module_config ); $options = ob_get_clean(); //copy current buffer contents into $message variable and delete current output buffer if(trim($options) != "") { $options = json_decode($options, true); if ( is_array($options) && !empty($options) > 0 ) { $retOpt = array_merge( $retOpt, $options[0] ); } } } } } // end foreach! if ( $section=='options') return array( $retOpt ); else if ( $section=='init') return true; } public function generateRandomString( $length = 10 ) { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $randomString = ''; for ($i = 0; $i < $length; $i++) { $randomString .= $characters[rand(0, strlen($characters) - 1)]; } return $randomString; } /** * User Roles - Capabilities */ public function capabilities_current_user_role() { // current user role $current_user = wp_get_current_user(); $roles = $current_user->roles; $user_role = array_shift($roles); return $user_role; } public function capabilities_user_has_module( $module='' ) { $user_role = $this->capabilities_current_user_role(); // super admin or admin => has Full access to modules! if ( in_array($user_role, array('super_admin', 'administrator')) ) { return true; } // verify user has module! $capabilitiesRoles = $this->get_theoption('psp_capabilities_roles'); if ( is_null($capabilitiesRoles) || !$capabilitiesRoles ) { // no capabilities for any user role defined! return true; } if ( isset($capabilitiesRoles["$user_role"]) && !is_null($capabilitiesRoles["$user_role"]) && is_array($capabilitiesRoles["$user_role"]) ) { $userModules = $capabilitiesRoles["$user_role"]; $module = strtolower($module); $userModules = array_map('strtolower', $userModules); if ( in_array($module, $userModules) ) return true; } return false; } /** * Cron Jobs - clean fix */ private function cronjobs_clean_fix() { $alreadyCleaned = get_option('psp_cronjobs_clean'); $doit = false; if ( !isset($alreadyCleaned) || is_null($alreadyCleaned) || $alreadyCleaned===false || $alreadyCleaned!='done') { $doit = true; } // clean cronjobs if ( $doit ) { $this->cronjobs_clear_all_crons('pspwplannerhourlyevent'); $this->cronjobs_clear_all_crons('psp_wplanner_hourly_event'); $this->cronjobs_clear_all_crons('psp_start_cron_serp_check'); update_option( 'psp_cronjobs_clean', 'done' ); } } public function cronjobs_clear_all_crons( $hook ) { $crons = _get_cron_array(); if ( empty( $crons ) ) { return; } foreach( $crons as $timestamp => $cron ) { if ( !empty( $cron[$hook] ) ) { unset( $crons[$timestamp][$hook] ); } if ( empty($crons[$timestamp]) ) { unset($crons[$timestamp]); } } _set_cron_array( $crons ); } /** * Backlink builder - links list fix */ private function fix_backlinkbuilder_linklist() { $alreadyCleaned = get_option('psp_fix_backlinkbuilder'); $doit = false; if ( !isset($alreadyCleaned) || is_null($alreadyCleaned) || $alreadyCleaned===false || $alreadyCleaned!='done') { $doit = true; } // clean cronjobs if ( $doit ) { global $wpdb; // delete record $table_name = $wpdb->prefix . "psp_web_directories"; $query_delete = "DELETE FROM " . ($table_name) . " where 1=1 and id in ('278');"; $__stat = $wpdb->query($query_delete); if ($__stat!== false) { } update_option( 'psp_fix_backlinkbuilder', 'done' ); } } private function setIniConfiguration() { if ( ($memory_limit = ini_get('memory_limit')) !== false ) { if ( (int) $memory_limit < 256) { ini_set('memory_limit', '512M'); } } } /** * Social Sharing */ public function admin_notice_details() { $isPremium = false; if ( $this->is_plugin_active( 'psp' ) ) { $__moduleIsActive = get_option('psp_module_Social_Stats'); $__submoduleSocialShare = get_option('psp_socialsharing'); if ( isset($__moduleIsActive) && $__moduleIsActive=='true' && isset($__submoduleSocialShare) && $__submoduleSocialShare!==false ) $isPremium = true; } if ( !$isPremium ) return false; if( !wp_style_is($this->alias . '-activation') ) { wp_enqueue_style( $this->alias . '-activation', $this->cfg['paths']['freamwork_dir_url'] . 'css/activation.css'); } add_action( 'admin_notices', array( $this, 'admin_notice_text' ) ); } public function admin_notice_text() { ?>

localizationName ); ?>

0 ) { foreach ($arr as $k => $v) { $newarr[ $v ] = $v; } } return $newarr; } //verify if file exists! public function verifyFileExists($file, $type='file') { clearstatcache(); if ($type=='file') { if (!file_exists($file) || !is_file($file) || !is_readable($file)) { return false; } return true; } else if ($type=='folder') { if (!is_dir($file) || !is_readable($file)) { return false; } return true; } // invalid type return 0; } // Return current Unix timestamp with microseconds // Simple function to replicate PHP 5 behaviour public function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } public function formatBytes($bytes, $precision = 2) { $units = array('B', 'KB', 'MB', 'GB', 'TB'); $bytes = max($bytes, 0); $pow = floor(($bytes ? log($bytes) : 0) / log(1024)); $pow = min($pow, count($units) - 1); // Uncomment one of the following alternatives // $bytes /= pow(1024, $pow); $bytes /= (1 << (10 * $pow)); return round($bytes, $precision) . ' ' . $units[$pow]; } public function prepareForInList($v) { return "'".$v."'"; } public function prepareForDbClean($v) { return trim($v); } public function print_module_error( $module=array(), $error_number, $title="" ) { $html = array(); if( count($module) == 0 ) return true; $html[] = '
'; $html[] = '
'; $html[] = '
'; $html[] = ''; $html[] = __( $title, $this->localizationName ); $html[] = ''; $html[] = '
'; $html[] = '
'; $error_msg = isset($module[$module['alias']]['errors'][$error_number]) ? $module[$module['alias']]['errors'][$error_number] : ''; $html[] = '
' . ( $error_msg ) . '
'; $html[] = '
'; $html[] = '
'; $html[] = '
'; return implode("\n", $html); } public function convert_to_button( $button_params=array() ) { $button = array(); $button[] = 'ID) && !is_null($post->ID) && $post->ID>0) $__post = $post; if (is_object($wp_query)) $__post = $wp_query->get_queried_object(); //get the post! $post_type = ''; if (is_object($__post) && isset($__post->post_type) && $__post->post_type != '') { $post_type = (string) $__post->post_type; } if (is_object($__post) && isset($__post->term_id) && isset($__post->taxonomy)) { $post_type = (string) $__post->taxonomy; } //var_dump('
',$post_type,$__post,'
'); $page_type = array( 'type' => '' ); // loop through all page types! if ( is_admin() ) { $page_type['type'] = 'admin'; } else if ( is_feed() ) { $page_type['type'] = 'feed'; } else if ( is_search() ) { $page_type['type'] = 'search'; } else if ( is_home() || is_front_page() ) { $page_type['type'] = 'home'; } // start is_singular() : is_singular tag is equivalent to ( is_page || is_attachment || is_single ) else if ( is_singular() ) { if ( is_single() ) { // it will check posts and any of your custom post types other then pages or attachments $page_type['type'] = 'post'; } else if ( is_page() ) { $page_type['type'] = 'page'; } else if ( is_attachment() ) { // treated like a page! $page_type['type'] = 'page'; } else { // default case $page_type['type'] = 'post'; } // custom post type if ( ( 'post' == $page_type['type'] ) && ! empty($post_type) && ! in_array($post_type, array('post', 'page', 'attachment')) ) { $page_type['type'] = 'posttype'; } } // end is_singular() else if ( is_category() ) { $page_type['type'] = 'category'; } else if ( is_tag() ) { $page_type['type'] = 'tag'; } else if ( is_tax() ) { $page_type['type'] = 'taxonomy'; } else if ( is_author() ) { // is_author must be called is_archive, because they are both for archives pages $page_type['type'] = 'author'; } else if ( is_archive() ) { $page_type['type'] = 'archive'; } else if ( is_404() ) { $page_type['type'] = '404'; } // woocommerce if ( $this->is_shop() ) { $page_type['type'] = 'page'; // archive } $page_type = $page_type['type']; return apply_filters( 'premiumseo_seo_pagetype', $page_type ); } public function get_wp_list_pagetypes() { $arr = array('home', 'post', 'page', 'posttype', 'category', 'tag', 'taxonomy', 'archive', 'author', 'search', '404'); return apply_filters( 'premiumseo_seo_list_pagetypes', $arr ); } /** * is woocommerce shop page? * Products / Display / Shop & Product Page / "Shop Page" option * wp_options / get_option('woocommerce_shop_page_id') */ public function is_shop() { //if ( class_exists('Woocommerce') ) { if ( function_exists('is_woocommerce') && function_exists('is_product') ) { if ( is_shop() ) { return true; } } return false; } public function get_wp_user_roles( $translate = false ) { global $wp_roles; if ( !isset( $wp_roles ) ) { $wp_roles = new WP_Roles(); } $roles = $wp_roles->get_names(); if ( $translate ) { foreach ($roles as $k => $v) { $roles[$k] = __($v, 'psp'); } asort($roles); // translation to be implemented! return $roles; } else { //$roles = array_keys($roles); foreach ($roles as $k => $v) { $roles[$k] = ucfirst($k); } asort($roles); return $roles; } } /** * Buddy Press */ public function is_buddypress() { if ( !defined( 'BP_VERSION' ) ){ return false; } global $bp; if( $bp->maintenance_mode == 'install' ){ if( $_GET['page'] == 'psp' ){ $this->errors = __( 'The Buddypress installation it\'s not finished!', $this->localizationName ); add_action( 'admin_notices', array($this, 'bp_warning_box'), 1 ); } return false; }else{ return true; } } public function is_buddypress_section() { if ( !$this->is_buddypress() ) return false; global $bp; $current_component = bp_current_component(); $current_action = bp_current_action(); $ret = array( 'component' => '', 'action' => '' ); if ( !empty($current_component) ) { $ret['component'] = $current_component; if ( !empty($current_action) ) { $ret['action'] = $current_action; } return $ret; } return false; } public function bp_warning_box(){ ?>

smartSEO | ', $this->localizationName ); ?>errors; ?>

'invalid', 'http_code' => 0, 'data' => ''); // build curl options $ipms = array_replace_recursive(array( 'userpwd' => false, 'htaccess' => false, 'post' => false, 'postfields' => array(), 'httpheader' => false, 'verbose' => false, 'ssl_verifypeer' => false, 'ssl_verifyhost' => false, 'httpauth' => false, 'failonerror' => false, 'returntransfer' => true, 'binarytransfer' => false, 'header' => false, 'cainfo' => false, 'useragent' => false, ), $input_params); extract($ipms); $opms = array_replace_recursive(array( 'resp_is_json' => false, 'resp_add_http_code' => false, 'parse_headers' => false, ), $output_params); extract($opms); //var_dump('
', $ipms, $opms, '
'); die('debug...'); // begin curl $url = trim($url); if (empty($url)) return (object) $ret; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); if ( !empty($userpwd) ) { curl_setopt($curl, CURLOPT_USERPWD, $userpwd); } if ( !empty($htaccess) ) { $url = preg_replace( "/http(|s):\/\//i", "http://" . $htaccess . "@", $url ); } if (!$post && !empty($postfields)) { $url = $url . "?" . http_build_query($postfields); } if ($post) { curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields); } if ( !empty($httpheader) ) { curl_setopt($curl, CURLOPT_HTTPHEADER, $httpheader); } curl_setopt($curl, CURLOPT_VERBOSE, $verbose); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, $ssl_verifypeer); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, $ssl_verifyhost); if ( $httpauth!== false ) curl_setopt($curl, CURLOPT_HTTPAUTH, $httpauth); curl_setopt($curl, CURLOPT_FAILONERROR, $failonerror); curl_setopt($curl, CURLOPT_RETURNTRANSFER, $returntransfer); curl_setopt($curl, CURLOPT_BINARYTRANSFER, $binarytransfer); curl_setopt($curl, CURLOPT_HEADER, $header); if ( $cainfo!== false ) curl_setopt($curl, CURLOPT_CAINFO, $cainfo); if ( $useragent!== false ) curl_setopt($curl, CURLOPT_USERAGENT, $useragent); if ( isset($timeout) && $timeout!== false ) curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); $data = curl_exec($curl); $http_code = (int) curl_getinfo($curl, CURLINFO_HTTP_CODE); $ret = array_merge($ret, array('http_code' => $http_code)); if ($debug) { $ret = array_merge($ret, array('debug_details' => curl_getinfo($curl))); } if ( $data === false || curl_errno($curl) ) { // error occurred $ret = array_merge($ret, array( 'data' => curl_errno($curl) . ' : ' . curl_error($curl) )); } else { // success if ( $parse_headers ) { $header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE); $headers = self::__parse_headers( substr($data, 0, $header_size) ); // response begin with the headers $data = substr($data, $header_size); $ret = array_merge($ret, array('headers' => $headers)); } // Add the status code to the json data, useful for error-checking if ( $resp_add_http_code && $resp_is_json ) { $data = preg_replace('/^{/', '{"http_code":'.$http_code.',', $data); } $ret = array_merge($ret, array( 'status' => 'valid', 'data' => $data )); } curl_close($curl); return $ret; } private static function __parse_headers($headers) { if (!is_array($headers)) { $headers = explode("\r\n", $headers); } $ret = array(); foreach ($headers as $header) { $header = explode(":", $header, 2); if (count($header) == 2) { $ret[$header[0]] = trim($header[1]); } } return $ret; } // php.net/manual/en/function.urlencode.php // urlencode function and rawurlencode are mostly based on RFC 1738. however, since 2005 the current RFC in use for URIs standard is RFC 3986. public function urlencode($string) { $entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D'); $replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]"); return str_replace($entities, $replacements, urlencode($string)); } /** * Utils */ public function is_gzip( $setting=false, $force=array()) { $ret = true; if ( $setting!==false ) { $ret = (string) $setting == 'yes' ? true : false; } // do gzip only if everything it's fine if( !$ret // compressing not activated yet || empty($_SERVER['HTTP_ACCEPT_ENCODING']) // no encoding support || ( // no gzip strpos($_SERVER['HTTP_ACCEPT_ENCODING'],'gzip') === false && strpos($_SERVER['HTTP_ACCEPT_ENCODING'],'x-gzip') === false ) || !function_exists("gzwrite") // no PHP gzip support || headers_sent() // headers already sent || ( ( !isset($force['ob_get_level']) || (isset($force['ob_get_level']) && $force['ob_get_level']) ) && ob_get_contents() ) // already some output... || in_array('ob_gzhandler', ob_list_handlers()) // other plugins (or PHP) is already using gzipp || $this->get_php_ini_bool(ini_get("zlib.output_compression")) // zlib compression in php.ini enabled || ( ( !isset($force['ob_get_level']) || (isset($force['ob_get_level']) && $force['ob_get_level']) ) && ( ob_get_level() > ( !$this->get_php_ini_bool(ini_get("output_buffering")) ? 0 : 1 ) ) ) // another output buffer is already active, beside the default one*/ ) { $ret = false; } return $ret; } /** * Client Utils */ public function get_client_ip() { $ipaddress = ''; if ($_SERVER['REMOTE_ADDR']) $ipaddress = $_SERVER['REMOTE_ADDR']; else if ($_SERVER['HTTP_CLIENT_IP']) $ipaddress = $_SERVER['HTTP_CLIENT_IP']; else if ($_SERVER['HTTP_X_FORWARDED']) $ipaddress = $_SERVER['HTTP_X_FORWARDED']; else if ($_SERVER['HTTP_FORWARDED_FOR']) $ipaddress = $_SERVER['HTTP_FORWARDED_FOR']; else if( $_SERVER['HTTP_FORWARDED']) $ipaddress = $_SERVER['HTTP_FORWARDED']; else if ($_SERVER['HTTP_X_FORWARDED_FOR']) $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR']; return $ipaddress; } public function get_current_page_url( $pms=array() ) { $pms = array_replace_recursive(array( 'exclude_request_uri' => false, // url will not include $_SERVER['REQUEST_URI'] 'force_include_port' => false, // always include port, independent of 'include_port' value 'include_port' => true, // will include port but not if: (NOT SSL & 80) | (SSL & 443) ), $pms); extract( $pms ); $s = $_SERVER; $ssl = $this->is_ssl(); $port = $this->get_port(); $sp = isset($s['SERVER_PROTOCOL']) ? strtolower( $s['SERVER_PROTOCOL'] ) : ''; $protocol = substr( $sp, 0, strpos( $sp, '/' ) ) . ( $ssl ? 's' : '' ); // include port? $inc_port = $force_include_port; if ( ! $force_include_port && $include_port ) { if ( ( ! $ssl && $port=='80' ) || ( $ssl && $port=='443' ) ) { $inc_port = false; } } // build url $url = array(); $url[] = $protocol . '://'; $url[] = $this->get_host( $inc_port ); if ( isset($_SERVER['REQUEST_URI']) && ! $exclude_request_uri ) { $url[] = $_SERVER['REQUEST_URI']; } $url = implode('', $url); return $url; } // verbose translation from Symfony public function get_host( $include_port=false ) { $possibleHostSources = array('HTTP_X_FORWARDED_HOST', 'HTTP_HOST', 'SERVER_NAME', 'SERVER_ADDR'); $sourceTransformations = array( // since PHP 4 >= 4.0.1, PHP 5, PHP 7 "HTTP_X_FORWARDED_HOST" => create_function('$value', '$elements = explode(",", $value); return trim(end($elements));'), // since PHP 5.3.0 (anonymous function) //"HTTP_X_FORWARDED_HOST" => function($value) { // $elements = explode(',', $value); // return trim(end($elements)); //}, ); $host = ''; foreach ($possibleHostSources as $source) { if (!empty($host)) break; if (!isset($_SERVER[$source]) || empty($_SERVER[$source])) continue; $host = $_SERVER[$source]; if (array_key_exists($source, $sourceTransformations)) { $host = $sourceTransformations[$source]($host); } } // end foreach $s = $_SERVER; $ssl = $this->is_ssl(); $port = $this->get_port(); // Remove port number from host if ( !$include_port ) { $host = preg_replace('/:\d+$/', '', $host); } // Include Port else { $found = preg_match('/:\d+$/', $host); if ( empty($found) && !empty($port) ) { $host .= ':'.$port; } } $host = trim($host); //$host = strtolower($host); return $host; } // get current port public function get_port() { // CHECK PROXY if ( isset($_SERVER['HTTP_X_FORWARDED_PORT']) ) { $port = (string) $_SERVER['HTTP_X_FORWARDED_PORT']; return $port; } if ( isset($_SERVER['HTTP_X_FORWARDED_PROTO']) ) { $port = (string) $_SERVER['HTTP_X_FORWARDED_PROTO']; if ( in_array(strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']), array('https')) ) { $port = '443'; return $port; } } // SERVER PORT $port = isset($s['SERVER_PORT']) ? $s['SERVER_PORT'] : ''; return $port; } // Determine if SSL is used. public function is_ssl() { // CHECK PROXY: HTTP_X_FORWARDED_PROTO: a de facto standard for identifying the originating protocol of an HTTP request, since a reverse proxy (load balancer) may communicate with a web server using HTTP even if the request to the reverse proxy is HTTPS if ( isset($_SERVER['HTTP_X_FORWARDED_PROTO']) ) { if ( in_array(strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']), array('on', '1', 'https', 'ssl')) ) return true; } if ( isset($_SERVER['HTTP_X_FORWARDED_SSL']) ) { if ( in_array(strtolower($_SERVER['HTTP_X_FORWARDED_SSL']), array('on', '1', 'https', 'ssl')) ) return true; } if ( isset($_SERVER['HTTPS']) ) { if ( in_array(strtolower($_SERVER['HTTPS']), array('on', '1', 'https', 'ssl')) ) return true; } else if ( isset($_SERVER['SERVER_PORT']) && ( '443' == $_SERVER['SERVER_PORT'] ) ) { return true; } return false; } public function get_client_country() { $get_user_location = wp_remote_get( 'http://api.hostip.info/get_json.php?ip=' . $this->get_client_ip() ); if ( is_wp_error( $get_user_location ) ) { // If there's error $body = false; // $err = htmlspecialchars( implode(';', $get_user_location->get_error_messages()) ); } else { $body = wp_remote_retrieve_body( $get_user_location ); } if (is_null($body) || !$body || trim($body)=='') { //status is Invalid! return false; } else { $body = json_decode($body); $user_country = array( 'name' => $body->country_name, 'code' => $body->country_code ); } return $user_country; } public function get_client_utils() { $utils = array(); $client_ip = $this->get_client_ip(); $current_url = $this->get_current_page_url(); // $current_date = $_SERVER['REQUEST_TIME']; // Available since PHP 5.1.0 $current_date = strtotime( date('Y-m-d H:i') ); //$get_current_country = $this->get_client_country(); //if ( !empty($get_current_country) && isset($get_current_country['name']) ) { // $current_country = $get_current_country['name']; // $current_country_code = $get_current_country['code']; //} else { // $current_country = ''; // $current_country_code = ''; //} $current_country = ''; $current_country_code = ''; $utils = compact('client_ip', 'current_url', 'current_date', 'current_country', 'current_country_code'); // mobile require_once( $this->cfg['paths']["scripts_dir_path"] . '/mobile-detect/Mobile_Detect.php' ); $mobileDetect = new aaMobile_Detect(); $utils['isMobile'] = $mobileDetect->isMobile(); $utils['device_type'] = $mobileDetect->type(); if ( $utils['device_type'] == 'tablet') $utils['device_type'] = 'mobile'; return $utils; } public function load_woocommerce_taxonomies() { if ( !$this->is_woocommerce_installed() ) return; if( class_exists( 'WooCommerce' ) ) { $wc_path = WC()->plugin_path(); $wc_path_full = $wc_path . '/includes/class-wc-post-types.php'; require_once( $wc_path_full ); WC_Post_types::register_taxonomies(); WC_Post_types::register_post_types(); } } /** * Plugin is ACTIVE */ // verify plugin is ACTIVE (the right way) public function is_plugin_active( $plugin_name, $pms=array() ) { $pms = array_replace_recursive(array( 'verify_active_for_network_only' => false, 'verify_network_only_plugin' => false, 'plugin_file' => array(), // verification is made by OR between items 'plugin_class' => array(), // verification is made by OR between items ), $pms); extract( $pms ); switch ( strtolower($plugin_name) ) { case 'woocommerce': $plugin_file = array( 'woocommerce/woocommerce.php', 'envato-wordpress-toolkit/woocommerce.php' ); $plugin_class = array( 'WooCommerce' ); break; case 'woozone': $plugin_file = array( 'woozone/plugin.php' ); $plugin_class = array( 'WooZone' ); break; case 'psp': $plugin_file = array( 'premium-seo-pack/plugin.php' ); $plugin_class = array( 'psp' ); break; default: break; } $is_active = array(); // verify plugin is active base on plugin main file if ( ! empty($plugin_file) ) { if ( ! is_array($plugin_file) ) $plugin_file = array( $plugin_file ); include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); $cc = false; foreach ($plugin_file as $_plugin_file) { // check if a plugin is site wide or network active only if ( $verify_active_for_network_only ) { if ( is_plugin_active_for_network( $_plugin_file ) ) $cc = true; } // check if a plugin is a Network-Only-Plugin else if ( $verify_network_only_plugin ) { if ( is_network_only_plugin( $_plugin_file ) ) $cc = true; } // check if a plugin is active (the right way) else { if ( is_plugin_active( $_plugin_file ) ) $cc = true; } } $is_active[] = $cc; } // verify plugin class exists! if ( ! empty($plugin_class) ) { if ( ! is_array($plugin_class) ) $plugin_class = array( $plugin_class ); $cc = false; foreach ($plugin_class as $_plugin_class) { if ( class_exists( $_plugin_class ) ) $cc = true; } $is_active[] = $cc; } // final verification if ( empty($is_active) ) return false; foreach ($is_active as $_is_active) { if ( ! $_is_active ) return false; } return true; } public function is_plugin_active_for_network_only( $plugin_name, $pms=array() ) { $pms = array_replace_recursive(array( 'verify_active_for_network_only' => true, ), $pms); return $this->is_plugin_active( $plugin_name, $pms ); } public function is_plugin_network_only_plugin( $plugin_name, $pms=array() ) { $pms = array_replace_recursive(array( 'verify_network_only_plugin' => true, ), $pms); return $this->is_plugin_active( $plugin_name, $pms ); } public function is_woocommerce_installed() { if ( in_array( 'envato-wordpress-toolkit/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) || in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) || is_multisite() ) { return true; } else { $active_plugins = apply_filters( 'active_plugins', get_option( 'active_plugins' ) ); if ( !empty($active_plugins) && is_array($active_plugins) ) { foreach ( $active_plugins as $key => $val ) { if ( ($status = preg_match('/^woocommerce[^\/]*\/woocommerce\.php$/imu', $val))!==false && $status > 0 ) { return true; } } } return false; } } /** * Plugin Version */ // latest code version public function version() { if ( defined('PSP_VERSION') ) { $this->version = (string) PSP_VERSION; return $this->version; } $path = $this->cfg['paths']['plugin_dir_path'] . 'plugin.php'; if ( function_exists('get_plugin_data') ) { $plugin_data = get_plugin_data( $path ); } else { $plugin_data = psp_get_plugin_data(); } $latest_version = '1.0'; if( isset($plugin_data) && is_array($plugin_data) && !empty($plugin_data) ){ if ( isset($plugin_data['Version']) ) { $latest_version = (string)$plugin_data['Version']; } else if ( isset($plugin_data['version']) ) { $latest_version = (string)$plugin_data['version']; } } $this->version = $latest_version; return $this->version; } private function check_if_table_exists( $force=false ) { $need_check_tables = $this->plugin_integrity_need_verification('check_tables'); if ( ! $need_check_tables['status'] && ! $force ) { return true; // don't need verification yet! } // default sql - tables & tables data! require_once( $this->cfg['paths']['plugin_dir_path'] . 'modules/setup_backup/default-sql.php' ); // retrieve all database tables & clean prefix $dbTables = $this->db->get_results( "show tables;", OBJECT_K ); $dbTables = array_keys( $dbTables ); if ( empty($dbTables) || ! is_array($dbTables) ) { $this->plugin_integrity_update_time('check_tables', array( 'status' => 'invalid', 'html' => __('Check plugin tables: error requesting tables list.', $this->localizationName), )); return false; //something was wrong! } $dbTables_ = array(); foreach ((array) $dbTables as $table) { $table_noprefix = str_replace($this->db->prefix, '', $table); $dbTables_[] = $table_noprefix; } // our plugin tables $dbTables_own = $this->plugin_tables; // did we find all our plugin tables? $dbTables_found = (array) array_intersect($dbTables_, $dbTables_own); $dbTables_missing = array_diff($dbTables_own, $dbTables_found); //var_dump('
', $dbTables_own, '
'); echo __FILE__ . ":" . __LINE__;die . PHP_EOL; if ( ! $dbTables_missing ) { $this->plugin_integrity_update_time('check_tables', array( 'timeout' => time(), 'status' => 'valid', 'html' => __('Check plugin tables: all installed ( ' . implode(', ', $dbTables_found) . ' ).', $this->localizationName), )); return true; // all is fine! } $this->plugin_integrity_update_time('check_tables', array( 'status' => 'invalid', 'html' => __('Check plugin tables: missing ( ' . implode(', ', $dbTables_missing) . ' ).', $this->localizationName), )); return false; //something was wrong! } private function update_db_version( $version=null ) { delete_option( 'psp_db_version' ); $version = empty($version) ? $this->version() : $version; add_option( 'psp_db_version', $version ); } public function update_db( $force=false ) { // current installed db version $current_db_version = get_option( 'psp_db_version' ); //$current_db_version = !empty($current_db_version) ? (string) $current_db_version : '1.0'; // default db structure - integrity verification is done in function $this->check_if_table_exists( $force ); $need_check_alter_tables = $this->plugin_integrity_need_verification('check_alter_tables'); // installed version less than 2.0.4 / ex. 2.0.3.8 //if ( version_compare( $current_db_version, '2.0.4', '<' ) ) { if (1) { // if need_check_alter_tables if ( $need_check_alter_tables['status'] || $force || ( ! empty($current_db_version) && version_compare( $current_db_version, '2.1.1', '<' ) ) ) { // installed version less than 2.1.1 / ex. 2.0.4 $table_name = $this->db->prefix . "psp_link_builder"; if ( $this->db->get_var("show tables like '$table_name'") == $table_name ) { $this->_update_db_tables(array( 'operation' => $table_name, 'table' => $table_name, 'queries' => array( 'attr_title' => array( 'main' => "ALTER TABLE " . $table_name . " %s COLUMN `attr_title` TEXT NULL;", 'verify' => "SHOW COLUMNS FROM " . $table_name . " LIKE 'attr_title';", 'field_name' => 'attr_title', 'field_type' => 'text', ), ), )); } $table_name = $this->db->prefix . "psp_link_redirect"; if ( $this->db->get_var("show tables like '$table_name'") == $table_name ) { $this->_update_db_tables(array( 'operation' => $table_name, 'table' => $table_name, 'queries' => array( // columns 'redirect_type' => array( 'main' => "ALTER TABLE " . $table_name . " %s COLUMN `redirect_type` VARCHAR(25) NULL DEFAULT '';", 'verify' => "SHOW COLUMNS FROM " . $table_name . " LIKE 'redirect_type';", 'field_name' => 'redirect_type', 'field_type' => 'varchar(25)', ), 'redirect_rule' => array( 'main' => "ALTER TABLE " . $table_name . " %s COLUMN `redirect_rule` VARCHAR(25) NULL DEFAULT 'custom_url';", 'verify' => "SHOW COLUMNS FROM " . $table_name . " LIKE 'redirect_rule';", 'field_name' => 'redirect_rule', 'field_type' => 'varchar(25)', ), 'target_status_code' => array( 'main' => "ALTER TABLE " . $table_name . " %s COLUMN `target_status_code` VARCHAR(25) NULL DEFAULT '';", 'verify' => "SHOW COLUMNS FROM " . $table_name . " LIKE 'target_status_code';", 'field_name' => 'target_status_code', 'field_type' => 'varchar(25)', ), 'target_status_details' => array( 'main' => "ALTER TABLE " . $table_name . " %s COLUMN `target_status_details` TEXT NULL;", 'verify' => "SHOW COLUMNS FROM " . $table_name . " LIKE 'target_status_details';", 'field_name' => 'target_status_details', 'field_type' => 'text', ), 'group_id' => array( 'main' => "ALTER TABLE " . $table_name . " %s COLUMN `group_id` INT(5) NULL DEFAULT '1';", 'verify' => "SHOW COLUMNS FROM " . $table_name . " LIKE 'group_id';", 'field_name' => 'group_id', 'field_type' => 'int(5)', ), 'post_id' => array( 'main' => "ALTER TABLE " . $table_name . " %s COLUMN `post_id` INT(10) NULL DEFAULT '0';", 'verify' => "SHOW COLUMNS FROM " . $table_name . " LIKE 'post_id';", 'field_name' => 'post_id', 'field_type' => 'int(10)', ), 'publish' => array( 'main' => "ALTER TABLE " . $table_name . " %s COLUMN `publish` CHAR(1) DEFAULT 'Y';", 'verify' => "SHOW COLUMNS FROM " . $table_name . " LIKE 'publish';", 'field_name' => 'publish', 'field_type' => 'char(1)', ), ), // !!!must be after queries to be sure that all columns exists! // index_name, index_type, index_cols: all are mandatory 'indexes' => array( 'url_redirect' => array( 'main' => "ALTER TABLE " . $table_name . " %s (`url_redirect`);", 'verify' => "SHOW INDEX FROM " . $table_name . " WHERE 1=1 and Key_name LIKE 'url_redirect';", 'index_name' => 'url_redirect', 'index_type' => 'key', 'index_cols' => array('url_redirect'), ), 'redirect_type' => array( 'main' => "ALTER TABLE " . $table_name . " %s (`redirect_type`);", 'verify' => "SHOW INDEX FROM " . $table_name . " WHERE 1=1 and Key_name LIKE 'redirect_type';", 'index_name' => 'redirect_type', 'index_type' => 'key', 'index_cols' => array('redirect_type'), ), 'redirect_rule' => array( 'main' => "ALTER TABLE " . $table_name . " %s (`redirect_rule`);", 'verify' => "SHOW INDEX FROM " . $table_name . " WHERE 1=1 and Key_name LIKE 'redirect_rule';", 'index_name' => 'redirect_rule', 'index_type' => 'key', 'index_cols' => array('redirect_rule'), ), 'target_status_code' => array( 'main' => "ALTER TABLE " . $table_name . " %s (`target_status_code`);", 'verify' => "SHOW INDEX FROM " . $table_name . " WHERE 1=1 and Key_name LIKE 'target_status_code';", 'index_name' => 'target_status_code', 'index_type' => 'key', 'index_cols' => array('target_status_code'), ), 'group_id' => array( 'main' => "ALTER TABLE " . $table_name . " %s (`group_id`);", 'verify' => "SHOW INDEX FROM " . $table_name . " WHERE 1=1 and Key_name LIKE 'group_id';", 'index_name' => 'group_id', 'index_type' => 'key', 'index_cols' => array('group_id'), ), 'post_id' => array( 'main' => "ALTER TABLE " . $table_name . " %s (`post_id`);", 'verify' => "SHOW INDEX FROM " . $table_name . " WHERE 1=1 and Key_name LIKE 'post_id';", 'index_name' => 'post_id', 'index_type' => 'key', 'index_cols' => array('post_id'), ), 'publish' => array( 'main' => "ALTER TABLE " . $table_name . " %s (`publish`);", 'verify' => "SHOW INDEX FROM " . $table_name . " WHERE 1=1 and Key_name LIKE 'publish';", 'index_name' => 'publish', 'index_type' => 'key', 'index_cols' => array('publish'), ), ), )); } } // end if need_check_alter_tables $this->update_db_version('2.0.4'); } // update installed version to latest $this->update_db_version(); return true; } public function _update_db_tables( $pms=array() ) { //require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); //$status = dbDelta($sql); extract( $pms ); global $wpdb; // queries columns foreach ( (array) $queries as $skey => $sql ) { if ( ! isset($sql['main']) ) continue 1; $do_main = 'add'; if ( isset($sql['verify']) ) { $status = $wpdb->get_row( $sql['verify'], ARRAY_A ); if ( ! empty($status) && isset($status['Field'], $status['Type']) ) { //'image_sizes' == strtolower($status['Field']) if ( isset($sql['field_type']) ) { if ( strtolower($sql['field_type']) == strtolower( $status['Type'] ) ) $do_main = false; else $do_main = 'modify'; } } } // end if verify if ( !empty($do_main) ) { $sql['main'] = sprintf( $sql['main'], strtoupper( $do_main ) ); $status = $wpdb->query( $sql['main'] ); //var_dump('
', $sql, $status, '
'); } } // end foreach // queries indexes //ADD KEY newkeyname | DROP KEY oldkeyname, ADD KEY newkeyname if ( isset($indexes) ) { foreach ( (array) $indexes as $skey => $sql ) { if ( ! isset($sql['main']) ) continue 1; $index_name = isset($sql['index_name']) ? $sql['index_name'] : $skey; $index_type = isset($sql['index_type']) ? $sql['index_type'] : 'key'; $index_cols = isset($sql['index_cols']) ? $sql['index_cols'] : array(); $do_main = 'add'; if ( isset($sql['verify']) ) { $status = $wpdb->get_results( $sql['verify'], ARRAY_A ); $cols = array(); if ( ! empty($status) ) { foreach ($status as $idxKey => $idxVal) { $cols[] = $idxVal['Column_name']; } $cols = array_unique( array_filter( $cols) ); $diff = array_diff($index_cols, $cols); if ( ! empty($diff) ) $do_main = 'modify'; else $do_main = false; } } // end if verify if ( !empty($do_main) ) { $do_main2 = array(); if ( 'modify' == $do_main ) { $do_main2[] = 'DROP ' . strtoupper($index_type) . ' ' . $index_name; } $do_main2[] = 'ADD ' . strtoupper($index_type) . ' ' . $index_name; $do_main = implode(', ', $do_main2); $sql['main'] = sprintf( $sql['main'], $do_main ); $status = $wpdb->query( $sql['main'] ); //var_dump('
', $sql, $status, '
'); } } } // end foreach & if //if ( $this->db->prefix . "psp_link_redirect" == $operation ) { // echo __FILE__ . ":" . __LINE__;die . PHP_EOL; //} $this->plugin_integrity_update_time('check_alter_tables', array( 'timeout' => time(), 'status' => 'valid', 'html' => __('Check plugin tables (alter): OK.', $this->localizationName), )); } /** * check plugin integrity: 2017-feb-28 */ // what: check_database (includes: check_tables, check_alter_tables) public function plugin_integrity_check( $what='all', $force=false ) { $what = ! is_array($what) ? array('check_database') : $what; if ( in_array('check_database', $what) ) { $this->update_db( $force ); } } public function plugin_integrity_get_last_status( $what ) { $ret = array( 'status' => true, 'html' => '', ); // verify plugin integrity $plugin_integrity = get_option( 'psp_integrity_check', array() ); $plugin_integrity = is_array($plugin_integrity) ? $plugin_integrity : array(); $_status = true; $_html = array(); if ( isset($plugin_integrity[ "$what" ]) && ! empty($plugin_integrity[ "$what" ]) ) { $__ = $plugin_integrity[ "$what" ]; $_status = isset($__['status']) && 'valid' == $__['status'] ? true : false; $_html[] = $__['html']; } else { if ( 'check_database' == $what ) { foreach ($plugin_integrity as $key => $val) { if ( ! in_array($key, array('check_tables', 'check_alter_tables')) ) { continue 1; } $_status = $_status && ( isset($val['status']) && 'valid' == $val['status'] ? true : false ); if ( ! empty($val['html']) ) { $_html[] = $val['html']; } } } } //$html = '
' . implode('
', $_html) . '
'; $html = implode('    ', $_html); $ret = array_merge( $ret, array('status' => $_status, 'html' => $html) ); return $ret; } // what: check_tables, check_alter_tables public function plugin_integrity_need_verification( $what ) { $ret = array( 'status' => false, 'data' => array(), ); // verify plugin integrity $plugin_integrity = get_option( 'psp_integrity_check', array() ); $plugin_integrity = is_array($plugin_integrity) ? $plugin_integrity : array(); $ret = array_merge( $ret, array('data' => $plugin_integrity) ); if ( isset($plugin_integrity[ "$what" ]) && ! empty($plugin_integrity[ "$what" ]) ) { if ( ( $plugin_integrity[ "$what" ]['timeout'] + $this->ss['check_integrity'][ "$what" ] ) > time() ) { $ret = array_merge( $ret, array('status' => false) ); // don't need verification yet! //var_dump('
',$ret,'
'); return $ret; } } $ret = array_merge( $ret, array('status' => true) ); return $ret; } public function plugin_integrity_update_time( $what, $data=array() ) { $plugin_integrity = get_option( 'psp_integrity_check', array() ); $plugin_integrity = is_array($plugin_integrity) ? $plugin_integrity : array(); $data = ! is_array($data) ? array() : $data; if ( ! isset($plugin_integrity[ "$what" ]) ) { $plugin_integrity[ "$what" ] = array( 'timeout' => time(), 'status' => 'invalid', 'html' => '', ); } $plugin_integrity[ "$what" ] = array_replace_recursive($plugin_integrity[ "$what" ], $data); update_option( 'psp_integrity_check', $plugin_integrity ); } /** * 2017 march - may */ public function get_post_metatags( $post ) { $postDefault = array( 'the_title' => '', 'the_meta_description' => '', 'the_meta_keywords' => '', ); if ( is_array($post) ) { $post = (object) $post; } if ( ! is_object($post) ) { return $postDefault; } $modStatus = $this->verify_module_status( 'title_meta_format' ); //module is inactive if ( $this->ss['add_meta_placeholder'] && $modStatus ) { require_once( $this->cfg['paths']['plugin_dir_path'] . 'modules/title_meta_format/init.php'); $info = new pspTitleMetaFormat(); $info->setPostInfo( $post ); $shareInfo = (object) array( 'info' => $info, //'infoFb' => isset($infoFb) ? $infoFb : array(), //'infoTw' => isset($infoTw) ? $infoTw : array() ); $postDefault = array( 'the_title' => $shareInfo->info->get_the_title(), 'the_meta_description' => $shareInfo->info->get_the_meta_description(), 'the_meta_keywords' => $shareInfo->info->get_the_meta_keywords(), ); } // end if //var_dump('
', $postDefault, '
'); echo __FILE__ . ":" . __LINE__;die . PHP_EOL; return $postDefault; } public function get_taxonomy_nice_name($categ_name) { $ret = $categ_name; //$special = array('DVD' => 'DVD', 'MP3Downloads' => 'MP3 Downloads', 'PCHardware' => 'PC Hardware', 'VHS' => 'VHS'); $special = array('MP3Downloads' => 'MP3 Downloads'); if ( ! in_array($categ_name, array_keys($special)) ) { //$ret = preg_replace('/([A-Z])/', ' $1', $categ_name); $ret = preg_replace('/([A-Z])(?:[^A-Z ])/', ' $0', $categ_name); } else { $ret = $special["$categ_name"]; } $ret = preg_replace('/\s\s+/i', ' ', $ret); $ret = trim($ret); return $ret; } public function get_content_analyzing_rules() { $ret = array( 'title' => 'SEO Title: verify the allowed number of characters and if seo title contains/begins with your focus keyword', 'title_enough_words' => 'SEO Title Words: verify seo title minimum number of words', 'page_title' => 'Page Title: verify the allowed number of characters and if seo title contains/begins with your focus keyword', 'meta_description' => 'Meta Description: verify the allowed number of characters and if meta description contains/begins with your focus keyword', 'meta_keywords' => 'Meta Keywords: verify if any exists and if meta keywords contains with your focus keyword', 'permalink' => 'Permalink: verify if post permalink contains your focus keyword', 'first_paragraph' => 'First Paragraph: verify if first paragraph of the page content contains with your focus keyword', 'embedded_content' => 'Embedded Content: verify if the page content contains frames, iframes, flash or video objects', 'enough_words' => 'Enought Words: verify the page content minimum number of words', 'images_alt' => 'Images: verify if the posts content has images and if they contains your focus keyword in alt attribute', 'html_bold' => 'Mark as Bold: verify if the page content has at least one bold element', 'html_italic' => 'Mark as Italic: verify if the page content has at least one italic element', 'html_underline' => 'Mark as Underline: verify if the page content has at least one underlined element', 'subheadings' => 'Subheading Tags: verify if the page content has any subheading tags (h1, h2, h3) and if they contains your focus keyword (also verify if h1 begins with your focus keyword)', 'first100words' => 'First 100 Words: verify if the page content contains your focus keyword in the first 100 words', 'last100words' => 'Last 100 Words: verify if the page content contains your focus keyword in the last 100 words', 'links_external' => 'External Links: verify if the page content has any external links (and if they have nofollow rel attribute)', 'links_internal' => 'Internal Links: verify if the page content has any internal links (and if they have nofollow rel attribute)', 'links_competing' => 'Competing Links: verify if the page content has any potential competing links (which contains your focus keyword)', 'kw_density' => 'Keyword density: verify the allowed number of focus keyword occurences in the content compared to the number of words in the content', ); return $ret; } public function get_content_analyzing_allowed_rules( $pms=array() ) { if ( ! isset($pms['settings']) || empty($pms['settings']) ) { $pms['settings'] = $this->get_theoption('psp_on_page_optimization'); } $pms = array_replace_recursive(array( 'settings' => array(), 'istax' => false, ), $pms); extract($pms); $what = 'post_allowed_rules'; if ( $istax ) { $what = 'category_allowed_rules'; } $rules_allowed = array_keys( $this->get_content_analyzing_rules() ); $allowed = isset($settings["$what"]) && ! empty($settings["$what"]) ? $settings["$what"] : array(); $allowed = array_filter( array_unique( $allowed ) ); if ( ! empty($allowed) ) { $rules_allowed = $allowed; } return $rules_allowed; } public function build_score_html_container( $score=0, $pms=array() ) { $pms = array_replace_recursive(array( 'show_score' => true, 'css_style' => '', ), $pms); extract( $pms ); $_css_style = ( '' != $css_style ? ' ' . $css_style : '' ); $size_class = 'size_'; if ( $score >= 20 && $score < 40 ) { $size_class .= '20_40'; } else if ( $score >= 40 && $score < 60 ) { $size_class .= '40_60'; } else if ( $score >= 60 && $score < 80 ) { $size_class .= '60_80'; } else if ( $score >= 80 && $score <= 100 ) { $size_class .= '80_100'; } else { $size_class .= '0_20'; } $html = array(); $html[] = '
'; $html[] = '
'; if ( $show_score ) { $html[] = '
' . ( $score ) . '%
'; } $html[] = '
'; return implode('', $html); } public function xml_entities($string, $encoding) { //return htmlspecialchars($string, ENT_QUOTES | ENT_XML1, $encoding); // only >= PHP 5.4 return htmlspecialchars($string, ENT_QUOTES, $encoding); return strtr( $string, array( "<" => "<", ">" => ">", '"' => """, "'" => "'", "&" => "&", ) ); } /** * FACEBOOK */ // Facebook: cronjob //public function facebook_wplanner_do_this_hourly() { // // Plugin cron class loading // require_once ( $this->cfg['paths']['plugin_dir_path'] . 'modules/facebook_planner/app.cron.class.php' ); //} // Facebook: save operation last status public function facebook_planner_last_status( $pms=array() ) { extract($pms); $fb_details = $this->getAllSettings('array', 'facebook_planner'); //var_dump('
', $fb_details , '
'); echo __FILE__ . ":" . __LINE__;die . PHP_EOL; if ( 'exception' == $status ) { $e = $msg; if (isset($e->faultcode)) { // error occured! $msg = $e->faultcode . ' : ' . (isset($e->faultstring) ? $e->faultstring : $e->getMessage()); } else { $msg = $e->getMessage(); } } else if ( in_array($status, array('success', 'error')) ) { if ( is_object($msg) ) { $msg = (array) $msg; } } $msg = serialize( $msg ); $last_status = array('last_status' => array( 'status' => $status, 'data' => date("Y-m-d H:i:s"), 'from_file' => $from_file, 'from_func' => $from_func, 'from_line' => $from_line, 'msg' => $msg, )); $this->save_theoption( $this->alias . '_facebook_planner_last_status', $last_status ); $extra_info = array(); if ( isset($msg) && is_array($msg) ) { if ( isset($msg['link'], $msg['name']) ) { $extra_info = array( 'auth_foruser_link' => $msg['link'], 'auth_foruser_name' => $msg['name'] ); } } $this->save_theoption( $this->alias . '_facebook_planner', array_merge( (array) $fb_details, $last_status, $extra_info ) ); return 'success' == $status ? 'valid' : 'invalid'; } // Facebook: load new SKD public function facebook_load_sdk() { if ( !defined('FACEBOOK_SDK_V4_SRC_DIR') ) { define( 'FACEBOOK_SDK_V4_SRC_DIR', $this->cfg['paths']['scripts_dir_path'] . '/facebook-v5-5.0.0/' ); } require_once( $this->cfg['paths']['scripts_dir_path'] . '/facebook-v5-5.0.0/autoload.php' ); } // Facebook: call default params public function facebook_call_default_params( $pms=array() ) { if ( ! isset($pms['fb_details']) || empty($pms['fb_details']) ) { $pms['fb_details'] = $this->getAllSettings('array', 'facebook_planner'); } if ( ! isset($pms['facebook']) || is_null($pms['facebook']) ) { $fb_details = $pms['fb_details']; if( (isset($fb_details['app_id']) && trim($fb_details['app_id']) != '') && ( isset($fb_details['app_secret']) && trim($fb_details['app_secret']) != '') ) { $fbInitParams = array_replace_recursive(array( 'app_id' => $fb_details['app_id'], 'app_secret' => $fb_details['app_secret'], ), $this->facebook_sdk_settings); $facebook = new Facebook\Facebook( $fbInitParams ); $pms['facebook'] = $facebook; } } return $pms; } public function facebook_call_plugin_default() { $def = array(); $def['plugin_url'] = admin_url('admin.php?page=psp#facebook_planner'); $def['plugin_url_'] = '' . __('Go Back to the plugin facebook planner module and try again.', $this->localizationName) . '
'; return $def; } // Facebook: get authorization url public function facebook_get_authorization_url( $pms=array() ) { $pms = $this->facebook_call_default_params($pms); $pms = array_merge(array( 'facebook' => null, 'fb_details' => array(), 'psp_redirect_url' => '', 'text' => __('Authorize app', $this->localizationName), ), $pms); extract($pms); $ret = array( 'html' => '', 'url' => '#something-is-wrong', ); if( isset($facebook) && ! is_null($facebook) ) { $fb_helper = $facebook->getRedirectLoginHelper(); $fb_permissions = ['email','publish_actions','manage_pages','publish_pages', 'user_managed_groups']; // optional $fb_loginUrl = admin_url('admin-ajax.php?action=psp_facebookAuth%s'); if ( $psp_redirect_url != '' ) { $fb_loginUrl = sprintf( $fb_loginUrl, '&psp_redirect_url='.$psp_redirect_url ); } else { $fb_loginUrl = sprintf( $fb_loginUrl, '' ); } $fb_loginUrl = $fb_helper->getLoginUrl($fb_loginUrl, $fb_permissions); $ret['url'] = $fb_loginUrl; } $ret['html'] = '' . $text . ''; return $ret; } // Facebook: Authorization STEP 1 - new SDK // used in /aa-framework/settings-template.class.php , option 'authorization_button_fbv4' // used in /modules/facebook_planner/init.php , method 'makeoAuthLogin_fbv4' // used also here in this file public function facebook_do_authorization( $pms=array() ) { $pms = $this->facebook_call_default_params($pms); $pms = array_merge(array( 'facebook' => null, 'fb_details' => array(), 'psp_redirect_url' => '', ), $pms); extract($pms); $validAuth = false; $html = array(); $user_profile = array(); $ret = array( 'validAuth' => $validAuth, 'html' => $html, 'user_profile' => $user_profile, ); // load the facebook SDK $this->facebook_load_sdk(); // :: Facebook Authorization STEP 1 - new SDK // see modules/facebook_planner/init.php , method 'fbAuth_fbv4' for step 2 if( isset($facebook) && ! is_null($facebook) ) { $dbToken = get_option('psp_fb_planner_token'); //var_dump('
', $dbToken, '
'); die('debug...'); $getAuthUrl = $this->facebook_get_authorization_url(array( 'facebook' => $facebook, 'fb_details' => $fb_details, 'psp_redirect_url' => $psp_redirect_url, 'text' => __('Authorize app', $this->localizationName), )); $fb_loginUrl = $getAuthUrl['url']; if ( !empty($dbToken) ) { $facebook->setDefaultAccessToken($dbToken); $fb_response = null; try { // Returns a `Facebook\FacebookResponse` object $fb_response = $facebook->get('/me?fields=id,name,link'); } catch(Facebook\Exceptions\FacebookResponseException $e) { $html[] = '

Graph returned an error: ' . $e->getMessage() . '

'; $this->facebook_planner_last_status(array( 'status' => 'exception', 'msg' => $e, 'from_file' => str_replace($this->cfg['paths']['plugin_dir_path'], '', __FILE__), 'from_func' => __FUNCTION__ != __METHOD__ ? __METHOD__ : __FUNCTION__, 'from_line' => __LINE__, )); } catch(Facebook\Exceptions\FacebookSDKException $e) { $html[] = '

Facebook SDK returned an error: ' . $e->getMessage() . '

'; $this->facebook_planner_last_status(array( 'status' => 'exception', 'msg' => $e, 'from_file' => str_replace($this->cfg['paths']['plugin_dir_path'], '', __FILE__), 'from_func' => __FUNCTION__ != __METHOD__ ? __METHOD__ : __FUNCTION__, 'from_line' => __LINE__, )); } if ( !empty($fb_response) ) { $user_profile = $fb_response->getGraphUser(); if (count($user_profile) > 0){ $validAuth = true; $html[] = '

This plugin is authorized for: ' . $user_profile['name'] . '

'; $html[] = ''. (__( 'Authorize this app again', $this->localizationName )) .''; $this->facebook_planner_last_status(array( 'status' => 'success', 'msg' => $user_profile, 'from_file' => str_replace($this->cfg['paths']['plugin_dir_path'], '', __FILE__), 'from_func' => __FUNCTION__ != __METHOD__ ? __METHOD__ : __FUNCTION__, 'from_line' => __LINE__, )); } else { $this->facebook_planner_last_status(array( 'status' => 'error', 'msg' => $user_profile, 'from_file' => str_replace($this->cfg['paths']['plugin_dir_path'], '', __FILE__), 'from_func' => __FUNCTION__ != __METHOD__ ? __METHOD__ : __FUNCTION__, 'from_line' => __LINE__, )); } } else { $this->facebook_planner_last_status(array( 'status' => 'error', 'msg' => 'empty response when /me?fields=id,name,link', 'from_file' => str_replace($this->cfg['paths']['plugin_dir_path'], '', __FILE__), 'from_func' => __FUNCTION__ != __METHOD__ ? __METHOD__ : __FUNCTION__, 'from_line' => __LINE__, )); } } if( $validAuth == false ) { $html[] = ''. (__( 'Authorizate app', $this->localizationName )) .''; } } $ret = array( 'validAuth' => $validAuth, 'html' => implode('', $html), 'user_profile' => $user_profile, ); return $ret; } // Facebook: Authorization STEP 2 - new SDK // used in /modules/facebook_planner/init.php , method 'fbAuth_fbv4' for step 2 public function facebook_do_login( $pms=array() ) { $def = $this->facebook_call_plugin_default(); $pms = $this->facebook_call_default_params($pms); $pms = array_merge(array( 'facebook' => null, 'fb_details' => array(), 'plugin_url' => $def['plugin_url'], 'plugin_url_' => $def['plugin_url_'], //'dbToken' => '', ), $pms); extract($pms); $ret = array( 'opStatus' => false, 'opMsg' => '', 'facebook' => null, 'accessToken' => '', ); if( isset($facebook) && ! is_null($facebook) ) { //if ( $dbToken != '' ) { // $facebook->setDefaultAccessToken($dbToken); //} $fb_helper = $facebook->getRedirectLoginHelper(); } else { $ret['opMsg'] = 'Invalid Facebook object!'; return $ret; } try { $accessToken = $fb_helper->getAccessToken(); } catch(Facebook\Exceptions\FacebookResponseException $e) { $this->facebook_planner_last_status(array( 'status' => 'exception', 'msg' => $e, 'from_file' => str_replace($this->cfg['paths']['plugin_dir_path'], '', __FILE__), 'from_func' => __FUNCTION__ != __METHOD__ ? __METHOD__ : __FUNCTION__, 'from_line' => __LINE__, )); // When Graph returns an error $ret['opMsg'] = $plugin_url_.'
' . 'Graph returned an error: ' . $e->getMessage(); return $ret; } catch(Facebook\Exceptions\FacebookSDKException $e) { $this->facebook_planner_last_status(array( 'status' => 'exception', 'msg' => $e, 'from_file' => str_replace($this->cfg['paths']['plugin_dir_path'], '', __FILE__), 'from_func' => __FUNCTION__ != __METHOD__ ? __METHOD__ : __FUNCTION__, 'from_line' => __LINE__, )); // When validation fails or other local issues $ret['opMsg'] = $plugin_url_.'
' . 'Facebook SDK returned an error: ' . $e->getMessage(); return $ret; } if ( !isset($accessToken) ) { $is_error = $fb_helper->getError() || $fb_helper->getErrorCode(); if ($is_error) { $error_details = array( 'error' => $fb_helper->getError(), 'error_code' => $fb_helper->getErrorCode(), 'error_reason' => $fb_helper->getErrorReason(), 'error_desc' => $fb_helper->getErrorDescription() || (isset($_GET['error_message']) ? $_GET['error_message'] : null), ); $error_details = array_filter($error_details); $this->facebook_planner_last_status(array( 'status' => 'error', 'msg' => $error_details, 'from_file' => str_replace($this->cfg['paths']['plugin_dir_path'], '', __FILE__), 'from_func' => __FUNCTION__ != __METHOD__ ? __METHOD__ : __FUNCTION__, 'from_line' => __LINE__, )); //header('HTTP/1.0 401 Unauthorized'); $ret['opMsg'] = $plugin_url_.'
' . 'HTTP/1.0 401 Unauthorized'; return $ret; } else { $this->facebook_planner_last_status(array( 'status' => 'error', 'msg' => 'Bad request', 'from_file' => str_replace($this->cfg['paths']['plugin_dir_path'], '', __FILE__), 'from_func' => __FUNCTION__ != __METHOD__ ? __METHOD__ : __FUNCTION__, 'from_line' => __LINE__, )); //header('HTTP/1.0 400 Bad Request'); $ret['opMsg'] = $plugin_url_.'
' . 'HTTP/1.0 400 Bad Request'; return $ret; } } // Logged in //echo '

Access Token

'; //var_dump($accessToken->getValue()); // The OAuth 2.0 client handler helps us manage access tokens $oAuth2Client = $facebook->getOAuth2Client(); // Get the access token metadata from /debug_token $tokenMetadata = $oAuth2Client->debugToken( $accessToken ); //echo '

Metadata

'; //var_dump('
',$accessToken,$tokenMetadata,'
'); // Validation (these will throw FacebookSDKException's when they fail) $tokenMetadata->validateAppId( $fb_details['app_id']); // If you know the user ID this access token belongs to, you can validate it here //$tokenMetadata->validateUserId('123'); //$tokenMetadata->validateExpiration(); if ( !$accessToken->isLongLived() ) { // Exchanges a short-lived access token for a long-lived one try { $accessToken = $oAuth2Client->getLongLivedAccessToken( $accessToken ); } catch (Facebook\Exceptions\FacebookSDKException $e) { $this->facebook_planner_last_status(array( 'status' => 'exception', 'msg' => $e, 'from_file' => str_replace($this->cfg['paths']['plugin_dir_path'], '', __FILE__), 'from_func' => __FUNCTION__ != __METHOD__ ? __METHOD__ : __FUNCTION__, 'from_line' => __LINE__, )); $ret['opMsg'] = $plugin_url_.'
' . 'Error getting long-lived access token: ' . $e->getMessage(); return $ret; } //echo '

Long-lived

'; //var_dump($accessToken->getValue()); } // SUCCESS // User is logged in with a long-lived access token. // You can redirect them to a members-only page. $this->facebook_planner_last_status(array( 'status' => 'success', 'msg' => 'Successfull login.', 'from_file' => str_replace($this->cfg['paths']['plugin_dir_path'], '', __FILE__), 'from_func' => __FUNCTION__ != __METHOD__ ? __METHOD__ : __FUNCTION__, 'from_line' => __LINE__, )); // saving offline session into DB update_option('psp_fb_planner_token', $accessToken); $facebook->setDefaultAccessToken($accessToken); $ret['opMsg'] = 'Successfull login.'; $ret['opStatus'] = true; $ret['facebook'] = $facebook; $ret['accessToken'] = $accessToken; return $ret; } // Facebook: is user loggedin? if not, you need re-authorization public function facebook_is_loggedin( $pms=array() ) { $fbAuth = $this->facebook_do_authorization($pms); $validAuth = $fbAuth['validAuth']; return isset($validAuth) && $validAuth ? true : false; } // Facebook: get user profile public function facebook_get_user_profile( $pms=array() ) { $result = array(); $ret = array( 'opStatus' => false, 'opMsg' => '', 'result' => $result, ); $fbAuth = $this->facebook_do_authorization($pms); $validAuth = $fbAuth['validAuth']; $is_loggedin = isset($validAuth) && $validAuth ? true : false; $ret['opStatus'] = $fbAuth['validAuth']; $ret['opMsg'] = $fbAuth['html']; $ret['result'] = $fbAuth['user_profile']; if ( ! $is_loggedin ) { //$ret['opMsg'] = 'User is not loggedin or app authorized yet.'; } return $ret; } // Facebook: get user pages / groups public function facebook_get_user_pages( $pms=array() ) { $def = $this->facebook_call_plugin_default(); $pms = $this->facebook_call_default_params($pms); $pms = array_merge(array( 'facebook' => null, 'fb_details' => array(), 'plugin_url' => $def['plugin_url'], 'plugin_url_' => $def['plugin_url_'], 'do_authorize' => false, 'what' => 'pages' // pages | groups ), $pms); extract($pms); $result = array(); $ret = array( 'opStatus' => false, 'opMsg' => '', 'result' => $result, ); if ( $do_authorize ) { $is_loggedin = $this->facebook_is_loggedin($pms); if ( ! $is_loggedin ) { $ret['opMsg'] = 'User is not loggedin or app authorized yet.'; return $ret; } } $fbReq = ''; $logMsg = ''; switch( $what ) { case 'pages': $fbReq = '/me/accounts'; $logMsg = 'User Pages - '; break; case 'groups': $fbReq = '/me/groups'; $logMsg = 'User Groups - '; break; } if (1) { try { // Returns a `Facebook\FacebookResponse` object $response = $facebook->get( $fbReq ); } catch(Facebook\Exceptions\FacebookResponseException $e) { $this->the_plugin->facebook_planner_last_status(array( 'status' => 'exception', 'msg' => $e, 'from_file' => str_replace($this->cfg['paths']['plugin_dir_path'], '', __FILE__), 'from_func' => __FUNCTION__ != __METHOD__ ? __METHOD__ : __FUNCTION__, 'from_line' => __LINE__, )); $ret['opMsg'] = $plugin_url_.'
' . $logMsg.'Graph returned an error: ' . $e->getMessage(); return $ret; } catch(Facebook\Exceptions\FacebookSDKException $e) { $this->the_plugin->facebook_planner_last_status(array( 'status' => 'exception', 'msg' => $e, 'from_file' => str_replace($this->cfg['paths']['plugin_dir_path'], '', __FILE__), 'from_func' => __FUNCTION__ != __METHOD__ ? __METHOD__ : __FUNCTION__, 'from_line' => __LINE__, )); $ret['opMsg'] = $plugin_url_.'
' . $logMsg.'Facebook SDK returned an error: ' . $e->getMessage(); return $ret; } $feedEdge = $response->getGraphEdge(); // Page 1 $cc = 0; do { foreach ($feedEdge as $status) { $status = $status->asArray(); $cond = 1; if ( 'pages' == $what ) { $cond = 1//'app page' == strtolower($status['category']) && (isset($status['perms']) && in_array('CREATE_CONTENT', $status['perms']); } if ( $cond ) { $result[] = $status; } } // end foreach $feedEdge = $facebook->next($feedEdge); // Next Page $cc++; } while( $feedEdge ); } $this->facebook_planner_last_status(array( 'status' => 'success', 'msg' => 'Successfull operation.', 'from_file' => str_replace($this->cfg['paths']['plugin_dir_path'], '', __FILE__), 'from_func' => __FUNCTION__ != __METHOD__ ? __METHOD__ : __FUNCTION__, 'from_line' => __LINE__, )); $ret['opMsg'] = 'Successfull operation.'; $ret['opStatus'] = true; $ret['result'] = $result; return $ret; } // Facebook: publish to wall (pages, groups, profile) public function facebook_publish( $pms=array() ) { $def = $this->facebook_call_plugin_default(); $pms = $this->facebook_call_default_params($pms); $pms = array_merge(array( 'facebook' => null, 'fb_details' => array(), 'plugin_url' => $def['plugin_url'], 'plugin_url_' => $def['plugin_url_'], 'do_authorize' => false, 'wall' => '', 'fields' => array(), ), $pms); extract($pms); $result = array(); $ret = array( 'opStatus' => false, 'opMsg' => '', 'result' => $result, ); if ( $do_authorize ) { $is_loggedin = $this->facebook_is_loggedin($pms); if ( ! $is_loggedin ) { $ret['opMsg'] = 'User is not loggedin or app authorized yet.'; return $ret; } } // access token - if you want to post on a page as it's owner/admin - messager are in the page center as on the all // othewise they are displaye in a bottom right box named "visitors posts" $access_token = ''; if ( isset($fields['access_token']) && ('' != $fields['access_token']) ) { $access_token = $fields['access_token']; unset( $fields['access_token'] ); } if (1) { try { // Returns a `Facebook\FacebookResponse` object if ( '' != $access_token ) { $response = $facebook->post( $wall, $fields, $access_token ); } else { $response = $facebook->post( $wall, $fields ); } } catch(Facebook\Exceptions\FacebookResponseException $e) { $this->facebook_planner_last_status(array( 'status' => 'exception', 'msg' => $e, 'from_file' => str_replace($this->cfg['paths']['plugin_dir_path'], '', __FILE__), 'from_func' => __FUNCTION__ != __METHOD__ ? __METHOD__ : __FUNCTION__, 'from_line' => __LINE__, )); $ret['opMsg'] = $plugin_url_.'
' . 'Graph returned an error: ' . $e->getMessage(); return $ret; } catch(Facebook\Exceptions\FacebookSDKException $e) { $this->facebook_planner_last_status(array( 'status' => 'exception', 'msg' => $e, 'from_file' => str_replace($this->cfg['paths']['plugin_dir_path'], '', __FILE__), 'from_func' => __FUNCTION__ != __METHOD__ ? __METHOD__ : __FUNCTION__, 'from_line' => __LINE__, )); $ret['opMsg'] = $plugin_url_.'
' . 'Facebook SDK returned an error: ' . $e->getMessage(); return $ret; } } $graphNode = $response->getGraphNode(); $this->facebook_planner_last_status(array( 'status' => 'success', 'msg' => 'Posted successfull with id: ' . $graphNode['id'], 'from_file' => str_replace($this->cfg['paths']['plugin_dir_path'], '', __FILE__), 'from_func' => __FUNCTION__ != __METHOD__ ? __METHOD__ : __FUNCTION__, 'from_line' => __LINE__, )); $ret['opMsg'] = 'Posted successfull with id: ' . $graphNode['id']; $ret['opStatus'] = true; $ret['result'] = $graphNode['id']; return $ret; } /** * Multi Keywords */ public function mkw_get_keywords( $str ) { if ( is_array($str) ) { return $str; } $str = trim($str); if ( '' == $str ) { return array(); } $__ = explode("\n", $str); if ( is_array($__) ) { $__ = array_map('trim', $__); $__ = array_map('strtolower', $__); $__ = array_map('strip_tags', $__); $__ = array_map('stripslashes', $__); $__ = array_filter($__); $__ = array_unique($__); return $__; } return array(); } public function mkw_get_main_keyword( $str ) { $__ = $this->mkw_get_keywords( $str ); if ( empty($__) || ! is_array($__) ) { return ''; } return $__[0]; } public function get_psp_meta_default( $psp_meta=array() ) { if ( ! is_array($psp_meta) ) { $psp_meta = array(); } if ( ! isset($psp_meta['mfocus_keyword']) || empty($psp_meta['mfocus_keyword']) ) { $psp_meta['mfocus_keyword'] = ''; if ( isset($psp_meta['focus_keyword']) ) { // || empty($psp_meta['mfocus_keyword']) $psp_meta['mfocus_keyword'] = $psp_meta['focus_keyword']; //$focus_kw } } return $psp_meta; } public function get_psp_meta( $post, $current_taxseo=array() ) { if ( $this->__tax_istax($post) ) { $psp_meta = $this->__tax_get_post_meta( $current_taxseo, $post, 'psp_meta' ); } else { $psp_meta = get_post_meta( $post, 'psp_meta', true); } $psp_meta = $this->get_psp_meta_default( $psp_meta ); return $psp_meta; } public function fk_missing_message( $str, $type='short', $markup=true ) { $str = trim($str); if ( '' == $str ) { if ( 'short' == $type ) { $str = __('missing focus keyword', $this->localizationName); } else { $str = __('missing focus keyword - you must create one...', $this->localizationName); } if ( $markup) { $str = '' . $str . ''; } } return $str; } /** * Social Stats | Providers */ public function social_get_providers( $pms=array() ) { $pms = array_replace_recursive(array(), $pms); extract( $pms ); $prv = array( // title, color, items_label : mandatory for all providers 'facebook' => array( 'title' => __('Facebook', 'psp'), 'color' => '#3c5b9b', 'items_label' => __('shares', 'psp'), 'counts' => array( 'share_count' => array( 'items_label' => __("shares", 'psp'), 'icon' => 'facebook-icon.png', ), 'like_count' => array( 'items_label' => __("likes", 'psp'), 'icon' => 'facebook-like-icon.png', ), 'comment_count' => array( 'items_label' => __("comments", 'psp'), 'icon' => 'facebook-comments-icon.png', ), //'click_count' => array( // 'items_label' => __("clicks", 'psp'), // 'icon' => 'facebook-icon.png', //), ), ), 'twitter' => array( 'title' => __('Twitter', 'psp'), 'color' => '#00aced', 'items_label' => __('retweets', 'psp'), ), 'google' => array( 'title' => __('Google +1', 'psp'), 'color' => '#d23e2b', 'items_label' => __('shares', 'psp'), ), 'pinterest' => array( 'title' => __('Pinterest', 'psp'), 'color' => '#ca4638', 'items_label' => __('pins', 'psp'), ), 'stumbleupon' => array( 'title' => __('Stumbleupon', 'psp'), 'color' => '#3fbd46', 'items_label' => __('views', 'psp'), ), 'linkedin' => array( 'title' => __('Linkedin', 'psp'), 'color' => '#007ab9', 'items_label' => __('backlinks', 'psp'), ), 'delicious' => array( 'title' => __('Delicious', 'psp'), 'color' => '#2c2c2c', 'items_label' => __('posts', 'psp'), ), 'buffer' => array( 'title' => __('Buffer', 'psp'), 'color' => '#2c2c2c', 'items_label' => __('posts', 'psp'), ), 'reddit' => array( 'title' => __('Reddit', 'psp'), 'color' => '#2c2c2c', 'items_label' => __('posts', 'psp'), ), 'flattr' => array( 'title' => __('Flattr', 'psp'), 'color' => '#2c2c2c', 'items_label' => __('posts', 'psp'), ), ); return $prv; } public function social_get_allowed_providers( $pms=array() ) { $pms = array_replace_recursive(array(), $pms); extract( $pms ); //2017-june not working anymore: 'twitter', 'delicious', 'digg', 'flattr', 'reddit' $def = array('facebook', 'google', 'pinterest', 'stumbleupon', 'linkedin', 'buffer'); $prv = $this->social_get_providers(); $selected = $this->get_theoption( $this->alias . '_social', true ); $selected = is_array($selected) && isset($selected['services']) && is_array($selected['services']) ? $selected['services'] : $def; $selected = array_unique( array_filter( $selected ) ); $final = array_intersect_key($prv, array_flip($selected)); foreach (array('twitter', 'delicious', 'digg', 'flattr', 'reddit') as $service) { if ( isset($final["$service"]) ) { unset( $final["$service"] ); } } return $final; } public function social_get_stats( $pms=array() ) { $def = array_keys( $this->social_get_allowed_providers() ); $pms = array_replace_recursive(array( 'providers' => $def, 'from' => 'listing', 'cache_force_refresh' => false, 'cache_life_time' => 600, // in seconds 'website_url' => '', 'postid' => 0, ), $pms); extract( $pms ); //:: DEBUG /* $__ = array( 'https://www.instagram.com/', 'http://facebook.com', 'http://mashable.com', 'http://themeforest.net', 'http://www.stackoverflow.com', ); shuffle($__); $website_url = $__[0]; */ $the_db_cache = array(); if ( 'dashboard' == $from ) { $the_db_cache = $this->get_theoption( "psp_dashboard_social_statistics" ); } else if ( 'listing' == $from ) { $the_db_cache = get_post_meta( $postid, '_psp_social_stats', true ); } else if ( 'toolbar' == $from ) { $the_db_cache = get_post_meta( $postid, 'psp_socialsharing_count', true ); } // check if cache NOT expires if ( isset($the_db_cache['_cache_date']) && ( time() <= ( $the_db_cache['_cache_date'] + $cache_life_time ) ) && $cache_force_refresh == false ) { if ( in_array($from, array('listing', 'toolbar')) ) { if ( isset($the_db_cache['facebook']['share_count']) ) { $the_db_cache['facebook'] = $the_db_cache['facebook']['share_count']; } if ( isset($the_db_cache['google']) ) { $the_db_cache['plusone'] = $the_db_cache['google']; } } return $the_db_cache; } $db_cache = array(); $db_cache['_cache_date'] = time(); //:: Alexa rank if ( 'dashboard' == $from ) { $apiQuery = 'http://data.alexa.com/data?cli=10&dat=snbamz&url='. $website_url; $alexa_data = $this->social_get_remote( $apiQuery, false ); $xml = simplexml_load_string($alexa_data); $json = json_encode($xml); $array = json_decode($json,TRUE); $db_cache['alexa'] = isset($array['SD'][1]['POPULARITY']["@attributes"]['TEXT']) ? $array['SD'][1]['POPULARITY']["@attributes"]['TEXT'] : 0; } //:: Facebook if ( in_array('facebook', $providers) ) { // deactivated //$fql = "SELECT url, normalized_url, share_count, like_count, comment_count, "; //$fql .= "total_count, commentsbox_count, comments_fbid, click_count FROM "; //$fql .= "link_stat WHERE url = '{$website_url}'"; //$apiQuery = "https://api.facebook.com/method/fql.query?format=json&query=" . urlencode($fql); //$fb_data = $this->social_get_remote( $apiQuery ); //$fb_data = isset($fb_data[0]) ? $fb_data[0] : array(); // 2017-june new method $apiQuery = "http://graph.facebook.com/?fields=id,share,og_object{engagement{count},likes.summary(true).limit(0),comments.limit(0).summary(true)}&id=" . urlencode($website_url); $fb_data = $this->social_get_remote( $apiQuery ); $share_count = isset($fb_data['share'], $fb_data['share']['share_count']) ? (int) $fb_data['share']['share_count'] : 0; $comment_count = isset($fb_data['share'], $fb_data['share']['comment_count']) ? (int) $fb_data['share']['comment_count'] : 0; $like_count = 0; if ( isset($fb_data['og_object']) ) { if ( empty($share_count) ) { $share_count = isset($fb_data['og_object']['engagement']['count']) ? (int) $fb_data['og_object']['engagement']['count'] : 0; } if ( empty($comment_count) ) { $comment_count = isset($fb_data['og_object']['comments']['summary']['total_count']) ? (int) $fb_data['og_object']['comments']['summary']['total_count'] : 0; } if ( empty($like_count) ) { $like_count = isset($fb_data['og_object']['likes']['summary']['total_count']) ? (int) $fb_data['og_object']['likes']['summary']['total_count'] : 0; } } $share_count_ = (int) ( $share_count - $like_count - $comment_count ); $share_count_ = $share_count_ > 0 ? $share_count_ : 0; $db_cache['facebook'] = array( 'share_count' => $share_count_, 'comment_count' => $comment_count, 'like_count' => $like_count, 'click_count' => 0 ); } //:: Twitter - 2017-june not working anymore - needs an api key! //if ( in_array('twitter', $providers) ) { // $apiQuery = "http://urls.api.twitter.com/1/urls/count.json?url=" . $website_url; // $apiQuery = "https://api.twitter.com/1.1/search/tweets.json?q=" . urlencode($website_url); // $tw_data = (array) $this->social_get_remote( $apiQuery ); // $db_cache['twitter'] = isset($tw_data['count']) ? $tw_data['count'] : 0; //} //:: Google Plus if ( in_array('google', $providers) ) { $apiQuery = "https://plusone.google.com/_/+1/fastbutton?bsv&size=tall&hl=it&url=" . $website_url; $go_data = $this->social_get_remote( $apiQuery, false ); require_once( $this->cfg['paths']['scripts_dir_path'] . '/php-query/php-query.php' ); if ( !empty($this->charset) ) { $html = pspphpQuery::newDocumentHTML( $go_data, $this->charset ); } else { $html = pspphpQuery::newDocumentHTML( $go_data ); } $go_data = $html->find("#aggregateCount")->text(); $db_cache['google'] = $go_data; } //:: Pinterest if ( in_array('pinterest', $providers) ) { $apiQuery = "http://api.pinterest.com/v1/urls/count.json?callback=receiveCount&url=" . $website_url; $pn_data = (array) $this->social_get_remote( $apiQuery ); $db_cache['pinterest'] = isset($pn_data['count']) ? $pn_data['count'] : 0; } //:: StumbledUpon if ( in_array('stumbleupon', $providers) ) { $apiQuery = "http://www.stumbleupon.com/services/1.01/badge.getinfo?url=" . $website_url; $st_data = (array) $this->social_get_remote( $apiQuery ); $db_cache['stumbleupon'] = isset($st_data['result']['views']) ? $st_data['result']['views'] : 0; } //:: LinkedIn if ( in_array('linkedin', $providers) ) { $apiQuery = "http://www.linkedin.com/countserv/count/share?format=json&url=" . $website_url; $ln_data = (array) $this->social_get_remote( $apiQuery ); $db_cache['linkedin'] = isset($ln_data['count']) ? $ln_data['count'] : 0; } //:: Delicious - 2017-june not working anymore //if ( in_array('delicious', $providers) ) { // $apiQuery = "http://feeds.delicious.com/v2/json/urlinfo/data?url=" . $website_url; // $de_data = $this->social_get_remote( $apiQuery ); // $de_data = isset($de_data[0]) ? $de_data[0] : array(); // $db_cache['delicious'] = isset($de_data['total_posts']) ? $de_data['total_posts'] : 0; //} // Tumblr // api: http://www.tumblr.com/docs/en/api/v2#blog-likes // @info: needs an api key! // Digg // @info: no valid api found! // Xing // api: https://dev.xing.com/docs // @info: needs an api key! - can't find the number of likes/bookmarks! // Buffer if ( in_array('buffer', $providers) ) { $apiQuery = "https://api.bufferapp.com/1/links/shares.json?url=" . $website_url; $buffer_data = $this->social_get_remote( $apiQuery ); $db_cache['buffer'] = isset($buffer_data['shares']) ? $buffer_data['shares'] : 0; } // Reddit - 2017-june not working anymore: seems to return invalid info! //if ( in_array('reddit', $providers) ) { // $apiQuery = "http://www.reddit.com/api/info.json?url=" . $website_url; // $reddit_data = $this->social_get_remote( $apiQuery ); // if ( isset($reddit_data['data']['children'][0]['data']) ) { // $reddit_data = $reddit_data['data']['children'][0]['data']; // } // else { // $reddit_data = array('score' => 0); // } // $db_cache['reddit'] = isset($reddit_data['score']) ? $reddit_data['score'] : 0; //} // Flattr - 2017-june not working anymore //if ( in_array('flattr', $providers) ) { // $apiQuery = "https://api.flattr.com/rest/v2/things/lookup/?url=" . $website_url; // $flattr_data = $this->social_get_remote( $apiQuery ); // if ( isset($flattr_data['message']) && $flattr_data['message'] != 'found' ) { // $flattr_data['flattrs'] = 0; // } // $db_cache['flattr'] = isset($flattr_data['flattrs']) ? $flattr_data['flattrs'] : 0; //} //var_dump('
', $db_cache , '
'); echo __FILE__ . ":" . __LINE__;die . PHP_EOL; if ( !empty($db_cache) ) { foreach ($db_cache as $k => $v) { if ( $k == 'plusone' ) ; else if ( $k == 'facebook') { foreach ($v as $key => $value) { $db_cache["$k"]["$key"] = (int) $value; } } else { $db_cache["$k"] = (int) $v; } } } // create a DB cache of this if ( 'dashboard' == $from ) { $this->save_theoption( 'psp_dashboard_social_statistics', $db_cache ); } else if ( 'listing' == $from ) { update_post_meta( $postid, '_psp_social_stats', $db_cache ); } else if ( 'toolbar' == $from ) { update_post_meta( $postid, 'psp_socialsharing_count', $db_cache ); } if ( in_array($from, array('listing', 'toolbar')) ) { if ( isset($db_cache['facebook']['share_count']) ) { $db_cache['facebook'] = $db_cache['facebook']['share_count']; } if ( isset($db_cache['google']) ) { $db_cache['plusone'] = $db_cache['google']; } } return $db_cache; } public function social_get_remote( $the_url, $parse_as_json=true ) { $response = wp_remote_get($the_url, array( 'user-agent' => "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0", 'timeout' => 10 )); if ( is_wp_error( $response ) ) { return array( 'status' => 'invalid' ); } $body = wp_remote_retrieve_body( $response ); if ( $parse_as_json == true ) { // trick for pinterest if( preg_match('/receiveCount/i', $body)){ $body = str_replace("receiveCount(", "", $body); $body = str_replace(")", "", $body); } return json_decode( $body, true ); } return $body; } public function social_get_htmlbox( $pms=array() ) { $pms = array_replace_recursive(array( 'from' => 'listing', 'img_src' => '', 'ssKey' => '', 'ssVal' => array(), 'socialData' => array(), 'postid' => 0, 'only_counts' => array(), //facebook ), $pms); extract( $pms ); $ssValCounts = isset($ssVal['counts']) && is_array($ssVal['counts']) ? $ssVal['counts'] : array('_count_' => $ssVal); if ( ! empty($only_counts) && is_array($only_counts) ) { if ( in_array($ssKey, $only_counts) ) { $ssValCounts = array('_count_' => $ssVal); } } foreach ($ssValCounts as $ssKey2 => $ssVal2) { $ssAlias = isset($ssVal['alias']) && ! empty($ssVal['alias']) ? $ssVal['alias'] : $ssKey; $ssItems = isset($socialData["$ssAlias"]) ? $socialData["$ssAlias"] : 0; $ssItems = isset($ssItems["$ssKey2"]) ? $ssItems["$ssKey2"] : $ssItems; $ssItems = (int) $ssItems; $ssItems = isset($socialData["$ssAlias"]) ? number_format($ssItems, 0) : '–'; $ssColor = $ssVal['color']; $ssColor = isset($ssVal2["color"]) ? $ssVal2["color"] : $ssColor; $ssLabel = $ssVal['items_label']; $ssLabel = isset($ssVal2["items_label"]) ? $ssVal2["items_label"] : $ssLabel; $ssIcon = $ssAlias . '-icon.png'; $ssIcon = isset($ssVal2["icon"]) ? $ssVal2["icon"] : $ssIcon; if ( 'listing' == $from ) { $html[] = '
'; $html[] = ''; $html[] = ''; $html[] = '' . $ssItems . ''; $html[] = '
'; } else { $html[] = '
  • '; $html[] = ''; $html[] = '' . $ssItems . ''; $html[] = ''; $html[] = '
  • '; } } // end foreach return implode('', $html); } /** * Redirect Types */ public function escape_mysql_regexp( $str ) { $str = preg_quote($str); $str = str_replace('\\', '\\\\', $str); //$str = str_replace('?', '\\?', $str); //$str = str_replace('\:', ':', $str); return $str; } public function get_redirect_types() { $redirect_type = array( 301 => '301 Moved Permanently', 302 => '302 Found (was: Moved Temporarily)', 303 => '303 See Other', 307 => '307 Temporary Redirect', //308 => 'Permanent Redirect', 403 => '403 Forbidden', 404 => '404 Page Not Found', 410 => '410 Gone - Content Deleted', 451 => '451 Content Unavailable For Legal Reasons', ); return $redirect_type; } public function get_redirect_status_codes() { /*$redirect_status = array( 'is_ok' => 'status: Valid 200 OK http code', 'invalid_string' => 'status: url string is invalid', 'unable_to_resolve' => 'status: unable to resolve request', 'is_temporary' => 'status: temporary http code', 'is_error' => 'status: error http code', 'is_301' => 'status: 301 http code', 'is_not_ok' => 'status: not 200 OK http code', );*/ $redirect_status = array( 'valid' => 'Valid Status', 'invalid' => 'Invalid Status', ); return $redirect_status; } public function get_redirect_groups() { $redirect_groups = array( '1' => 'Default', '2' => 'Posts - Slug Modified', '3' => 'Terms - Slug Modified', ); return $redirect_groups; } public function get_redirect_type( $pms=array() ) { $def = array(); if ( ! isset($pms['settings']) || empty($pms['settings']) || ! is_array($pms['settings']) ) { $def = $this->get_theoption( $this->alias . '_Link_Redirect', true ); } $pms = array_replace_recursive(array( 'settings' => $def, 'row' => array(), ), $pms); extract( $pms ); $all = $this->get_redirect_types(); $is_specific = false; $rd = isset($def['redirect_type']) && ! empty($def['redirect_type']) ? $def['redirect_type'] : '301'; if ( isset($row['redirect_type']) && ! empty($row['redirect_type']) ) { $rd = $row['redirect_type']; $is_specific = true; } $title = isset($all["$rd"]) ? $all["$rd"] : $rd; if ( ! $is_specific ) { $title = '* ' . $title; } return array( 'key' => $rd, 'title' => $title, 'is_specific' => $is_specific, ); } public function is_valid_url( $url ) { //$url = filter_var($url, FILTER_SANITIZE_URL); $url = trim( $url ); if ( '' == $url ) { return false; } $is_valid = filter_var($url, FILTER_VALIDATE_URL) === false ? false : true; return $is_valid; } public function get_clean_url( $url ) { //$url = filter_var($url, FILTER_SANITIZE_URL); //$url = preg_replace('/\+{2,}/imu', '+', $url); $url = trim( $url ); if ( '' != $url ) { $url = rawurldecode( $url ); } return $url; } public function is_404_valid() { if ( ! is_404() ) { return false; } //:: we are in a 404 error page, but we must be sure it's valid // Request URI $visitor_request_uri = $this->get_current_page_url(array()); // escape if it's the cron! $is_valid_404 = preg_match('/doing_wp_cron/i', $visitor_request_uri) == false; if ( $is_valid_404 ) { return true; } return false; } public function is_all_404_redirect( $pms=array() ) { $def = array(); if ( ! isset($pms['settings']) || empty($pms['settings']) || ! is_array($pms['settings']) ) { $def = $this->get_theoption( $this->alias . '_Link_Redirect', true ); } $pms = array_replace_recursive(array( 'settings' => $def, ), $pms); extract( $pms ); $selected = isset($settings['all_404_pages_to']) ? $settings['all_404_pages_to'] : ''; $is_valid = in_array($selected, array('homepage', 'custom_url')) ? true : false; if ( $is_valid && ( 'custom_url' == $selected ) ) { $custom_url = isset($settings['all_404_pages_to_custom']) ? $settings['all_404_pages_to_custom'] : ''; $custom_url = $this->get_clean_url( $custom_url ); if ( ! $this->is_valid_url( $custom_url ) ) { $is_valid = false; } } if ( ! $is_valid ) { return false; } $redirect_to = false; if ( 'homepage' == $selected ) { $redirect_to = trailingslashit( get_home_url() ); $redirect_to = $this->get_clean_url( $redirect_to ); } else if ( 'custom_url' == $selected ) { $redirect_to = $custom_url; } return $redirect_to; } public function store_new_404_log() { if ( $this->is_admin === true ) { return false; } //module is inactive if ( ! $this->verify_module_status( 'monitor_404' ) ) { return false; } if ( ! $this->is_404_valid() ) { return false; } global $wpdb; //:: collect data for insert into DB // Request URI $visitor_request_uri = $this->get_current_page_url(array()); // Referer $visitor_referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; // user agent $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; if (1) { $table_name = $wpdb->prefix . "psp_monitor_404"; // old ways of prepare: mysql_real_escape_string | $wpdb->_real_escape $query = $wpdb->prepare( "INSERT IGNORE INTO $table_name (url, referrers, user_agents) VALUES (%s, %s, %s)", $visitor_request_uri, $visitor_referer, $user_agent ); if ( $wpdb->query($query) == 0 ) { // record already exist, update hits $query_update = "UPDATE $table_name SET hits = hits+1, referrers = CONCAT(referrers, '\n$visitor_referer'), user_agents = CONCAT(user_agents, '\n$user_agent') WHERE url = '$visitor_request_uri';"; $wpdb->query($query_update); } return true; } return false; } } } // __DIR__ - uses PHP 5.3 or higher // require_once( __DIR__ . '/functions.php'); require_once( dirname(__FILE__) . '/functions.php');] >A  \)#smartSEO/aa-framework/functions.php ob $value) { $___ = explode(": ", $value); if( count($___) == 2 ){ $data[trim(strtolower(str_replace(" ", '_', $___[0])))] = trim($___[1]); } } } // For another way to implement it: // see wp-admin/includes/update.php function get_plugin_data // see wp-includes/functions.php function get_file_data return $data; } }#H ¡¡(smartSEO/aa-framework/images/16_code.png obPNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-E iTXtXML:com.adobe.xmp Adobe Photoshop CC (Windows) 2013-11-07T11:20:16+02:00 2013-11-11T17:11:09+02:00 2013-11-11T17:11:09+02:00 image/png xmp.iid:4afa4a5c-9eaa-f444-9e28-9298ad73feae xmp.did:30faefe1-432a-0e4a-b0df-1bef9711bf3d xmp.did:2f5e891f-9592-504b-9468-f61145101583 created xmp.iid:2f5e891f-9592-504b-9468-f61145101583 2013-11-07T11:20:16+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:6c17ff4b-8fe6-644e-86e4-32b95baaf4ec 2013-11-07T12:45:49+02:00 Adobe Photoshop CC (Windows) / saved xmp.iid:949b112e-758b-9e4f-bd35-5dee9822c5e1 2013-11-11T17:11:09+02:00 Adobe Photoshop CC (Windows) / converted from application/vnd.adobe.photoshop to image/png derived converted from application/vnd.adobe.photoshop to image/png saved xmp.iid:4afa4a5c-9eaa-f444-9e28-9298ad73feae 2013-11-11T17:11:09+02:00 Adobe Photoshop CC (Windows) / xmp.iid:949b112e-758b-9e4f-bd35-5dee9822c5e1 xmp.did:30faefe1-432a-0e4a-b0df-1bef9711bf3d xmp.did:2f5e891f-9592-504b-9468-f61145101583 3 sRGB IEC61966-2.1 404 404 < < < < xmp.did:4e55d131-4156-ef47-9231-b3ac27fa2863 xmp.did:57BCD4A3F738E3119802BE982B1502BD 1 720000/10000 720000/10000 2 1 16 16 , cHRMz%u0`:o_FIDATxڤ/05np ,3GOc =At˲={OP5cB02n~S @;Vb8gXdw1EV*J-D@VѭLFKDgnxy[N!|H `$ < H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-CpiTXtXML:com.adobe.xmp Adobe Photoshop CC (Windows) 2013-11-07T11:20:16+02:00 2013-11-07T14:37:08+02:00 2013-11-07T14:37:08+02:00 image/png xmp.iid:9ff846c1-fbf3-114b-97cc-970a5533a846 xmp.did:2f5e891f-9592-504b-9468-f61145101583 xmp.did:2f5e891f-9592-504b-9468-f61145101583 created xmp.iid:2f5e891f-9592-504b-9468-f61145101583 2013-11-07T11:20:16+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:6c17ff4b-8fe6-644e-86e4-32b95baaf4ec 2013-11-07T12:45:49+02:00 Adobe Photoshop CC (Windows) / saved xmp.iid:293b2040-2ca4-7a43-bd88-5c6e3c1427f2 2013-11-07T14:37:08+02:00 Adobe Photoshop CC (Windows) / converted from application/vnd.adobe.photoshop to image/png derived converted from application/vnd.adobe.photoshop to image/png saved xmp.iid:9ff846c1-fbf3-114b-97cc-970a5533a846 2013-11-07T14:37:08+02:00 Adobe Photoshop CC (Windows) / xmp.iid:293b2040-2ca4-7a43-bd88-5c6e3c1427f2 xmp.did:2f5e891f-9592-504b-9468-f61145101583 xmp.did:2f5e891f-9592-504b-9468-f61145101583 404 404 xmp.did:4e55d131-4156-ef47-9231-b3ac27fa2863 xmp.did:57BCD4A3F738E3119802BE982B1502BD 3 sRGB IEC61966-2.1 1 720000/10000 720000/10000 2 1 16 16 3 cHRMz%u0`:o_FIDATxڬ=J@_jkOC.x-RЫ(M6Bffg̼dMӲV+׋lW8V-gU1?fH3i 7`SEw>PLOc^j{v5Σ ߛ_D;lPѫ * y;B_lY+rOIENDB``?!M Ѝ Ѝ "߁-smartSEO/aa-framework/images/16_fbplanner.png obPNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-iTXtXML:com.adobe.xmp Adobe Photoshop CC (Windows) 2013-11-08T16:43:11+02:00 2013-11-20T19:17:53+02:00 2013-11-20T19:17:53+02:00 image/png xmp.iid:d74c9304-b016-c047-8ba4-0080e104fd10 xmp.did:a1b7f11a-6a80-d94b-9178-6889a46247e9 xmp.did:a1b7f11a-6a80-d94b-9178-6889a46247e9 created xmp.iid:a1b7f11a-6a80-d94b-9178-6889a46247e9 2013-11-08T16:43:11+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:c7691dc6-da2e-2740-89f2-74445cfd7597 2013-11-08T16:44:37+02:00 Adobe Photoshop CC (Windows) / saved xmp.iid:7c94431c-f353-eb41-a944-4488500814fc 2013-11-20T19:17:53+02:00 Adobe Photoshop CC (Windows) / converted from application/vnd.adobe.photoshop to image/png derived converted from application/vnd.adobe.photoshop to image/png saved xmp.iid:d74c9304-b016-c047-8ba4-0080e104fd10 2013-11-20T19:17:53+02:00 Adobe Photoshop CC (Windows) / xmp.iid:7c94431c-f353-eb41-a944-4488500814fc xmp.did:a1b7f11a-6a80-d94b-9178-6889a46247e9 xmp.did:a1b7f11a-6a80-d94b-9178-6889a46247e9 3 sRGB IEC61966-2.1 PSP PSP 001B33365342ABDF451F50498FEED06E 01572CA43F1E3A8160018073B8740742 024F796E6EB19108F58B6C5CBC92BFAB 02AD8C32EFDA8FFDA17773883C5AAC94 040E3F4A7214F10F41DC49C321E07AAA 04E34BBFCF2C02305EF7709EA12FF210 07915DA1719E56F9E1595BFEF0D147E5 08BB5329D93CC641BE97A023BD1CAEB1 0B577B6A134B449EDAAABC0EDC0F8E23 0DB86355BAE9C8D9FF29AD49F4EF95C4 0DE2B43C2EF2B1667F89945B3BCBD42D 0F1DEC0F2359079A7896919144725A0C 104107DEE7473480BC36240B15D0828F 11A01A357438223E32B67CB5F38E57EB 13278B9B45DF8A0EAA7911FFA3903E47 142315D3D5F08AD07BD100AE3E9D6023 1610053E513CC5334FF0A59905AC0A57 1714ECF6377C9917030809F64A308037 18723AD0ADE34A22A40CC03EA1791DD0 18B63A67EBFE551BF9FC732704EC9191 198856AF49447086D0FF6DDC41DFF434 1A944A9CFCCEEA6B6950A8E1418A2E26 1C25F867AA58C5CAD2EBE6E181A246BA 1E6837B362969D2955DD60FD93D4BD2F 1F318427C4B9D75A9A326FF8C0EB8208 2060245C617D273175534EAA5AA26A21 20DA58E2790F7350DDD31C0E47118966 223262261F060813CF672BBA0B0D9F82 297F279C86BBFDF97439F238EC8A341E 2BAC96F93029B8409AAA9A83C6C8E0B6 2CC3277F2AF0BC423F255627CCDC64D9 2D32A95D2A9C3A07DEE58C774746A044 2E5E625D41787229A42EA78743DFED92 2F55003759903C4B5173907EBA368FC4 301054D5B78CB4DFCC4226272C6478FE 30962B52603565D6F8BD7A1C4CBC195D 30F195B254AE4EA3732AAED75E48F021 30FD1BAD28EBA7CE28747B0B3684856B 30FD7014F0010758A00CB2926060AB52 36B6D78BD578DB7B07313245DE402D31 385E953D218220092A50958205707CDF 3CEF098BEEE207B2D28713FA41A91F99 3CF6886BB569D09259AD3DC8679AC153 40B5F8BA55F7973E079C78F69494E380 41EDA4468139D2A335F7C650EB891357 445BD608B87ECF51070CE97900EBAEBE 447A83FE9F059FAE0B1EB5BA19B45A39 44E94BA6702D653A497047B5D977A47E 45B28DF8F723C86DA8547E2747556FA0 49C1213A588E905033650CD260C1CB5E 4A64588F74F050EB1E63F287CC177CF3 4B8386D047322AB5320089127256333A 4DECD3C733779F33EC6BD8AB661ECC57 4FE9DB0E928E52EB8CE243BBFAC4A557 52CF9CE89C4568DE07E1FA43F92EB738 55B758C43A57A264DA9E3354837F022E 55BCF7BD2E918CDD1CC761C55F4717DC 59915499FA710491164A9193F709C898 599FD634435DF0632FDA16ED3F1D0557 59F2D561D6B867AFEFB9952A2D5FF38D 5A40D7EED8A45A497C37F7CC0A493C3C 5B8E4672075131A36CBD61CE4CA6587E 5B9FFB4D4C39CDF7628A1FC3BE81C042 617FA99AD0EBF0A549AAF8E6C2ED496C 619BD56CC4FEA59FFD2C2AD6CAAA69E3 61EC17A94173219E077F2AD408E26A2D 698D9CBB1EF760354B97CE1674900626 69A8520DB0FCA4467E1988D385894A1A 6B94A4DEE544FBF70D6B1AAD2C33ADE9 6D3C08BCAE082F0D60A5663DFFD22B5D 6D53D91C2C46D082091925E2F0EEF337 6EEBFFAB2567F37C418A22190A9B87B4 6F0535DF0BC6A696263219F409C3E95D 70B686BEF762C0A455A6D4B98E75EAC4 70E1AE2C2ABB055C2C3F7C470A1916E5 710114189DC07FAE76958215E8AFBD54 72851A3B0ED9FDE61D53DE9DF3F7F23B 731B8B4A66A2A5D2AF5165F598EF516F 76C513B5F60DA9EEEFCD69BF9AD32158 787BECB52DF26EE52506EBDAB98E4FDC 793ECAB3CC4289656F3A4ACC668ABD94 7C7A41F2E68CA02E66C6ABD3E574CE3F 804D975DEC1F7DE6771895894E59B5F5 82E45C4F2E3BB5026FEB55788E8B46D2 839275F1C0E530DC4BD905428784BC05 83C25B812DF8753C4A25799E51016FAC 83F84CEE57D174FB62657681F4A88BBE 848F1C0D914C6BA6013F6BF9884A5BA7 850013A8AD362B7565D1640BC8AFBF6B 85ABA8E2B996BE2D29AB96E388536D02 88ED505948DA46CB5F5B67F4B2B4341C 8D1A0ADD2E8D10B1FE65CC7C43EEC95A 8F2CD04DEFBE17609451FBD9DB0190C2 8F48DC0F12C6E4CE5E0F05473CE8F6F1 911E18E4607F128D22B5F2D90823C1F6 946AD6422484AAF697DCBB25BB6642A3 94EDF02BDC86137EDCEEF63C025919C8 94F1EFA64665074B962ED6FDD165B67A 9582079AA99CB0FF87B7A6C20E018B98 967F5BE44879735528005CCD207B115D 9688F98001B07EDAF92CFA6DD0F17907 96FE6E41D885B85D68E61140B3BCE31D 973F8B91961F8C19F42B5993ED1174B0 98B57FE62DD6C034AB8B63F37F190EC5 99CE1174BC07BDA0C4ECE2896D1634F6 9A1D38D552531A940F9810EDE9F924EE 9C239BDC71753AFB5A0D130978F23EA2 9D80DA8B7F04316654BF1E09260F7F70 9DF36BCAB9CEEF7DBA5BC19F10301810 A070480DD31B1F61AE54F93AF6B47601 A1401CCA5E96AD523B0C97616A5E8F1D A1D16162D80934986806426F7AE2765F A2728D35B6D0600A8CBA7209A1B65F8B A35C0AE62B6798B5AE9272739C52A4C6 A7333906666E22339AC8A96861E6B2A5 A7EC83513A56CDB21081A5B609BFB340 A817B93E5B081279397B59795F66434B A877663A2D8B3F97673B09D039393F2F AF23F48C8F4445EAD8CFD80592A82DCA B192FA8F1E5BB1C1A649438DAFA2C9A5 B1AAF32F53485EC5DD0AEBDBC01EB8BE B2D5BC495B9ECBF100E0E487045E6734 B674820F94AEDE7A95FCAEB5256374AB B97F5F048A4CBB453498E1FB2C6AC623 BC2B829F2BD2918A42FF6AA6D4C68CAA BC781B6C21F8DB059D1015046BF394F2 BC8BCF8B8524F580157F3784611EE964 BED2401C96EC4268B153EC448CEA9737 BF9CBA2CD1645C2D095C77F5235D3D55 C17F1D9616707747273B31C3FABF2C34 C27A6EE216DEDDF452B9D9321E056730 C443F46F0DE7F3333FEC3C5DB0E577DA C57932800D0CB1802D6A36C5A10A4EC8 C6A3CB15A0560F4CB33FE124D37303D5 C8A4588815AABA6DEDC876FBCA06B4D8 C8FB4B3C1BEFC4F311425B8E38F0CA12 C9CCFFEDEA085FC33F364A8573547679 CA0B7F517CE95647614C9DE40D9E00EF CA5807CCEF648E544971ACBF4DCB7C48 CB563E1C6CD1842C15B7A3FBABBF1CDE CCB6AD69ADECF3D893C6F8E27F296103 CECFC0BB54D6A1E6E23270BD35E19DEF CF38E47788C68A47F6B689A750211D60 CF7C46B18733C648EFC5E51D96B561D2 CFFD320A6E572E547FEEB92BEC8D8923 D029A3E52F535EA9EA5BE6D3053B7E21 D18EF492BA4D46AE013F54F8C005E346 D1BC1AA06226860620B4E8A0A59FED28 D207B4F211B771CB2F0742ABFD3059D2 D43B841A250F59FC7D7EABCCD3BEC3AD D57FF935FC6296F4B497F097CDCD4F5C D5B8A8CBD2AD026975BE20673203E406 D67C0825A8B7FD496D2B75309A224B65 D6E6053232371882D9CE98FD29881FF7 DB444FB95A66368C114BA16DE371FBEF DC9C39A0B61877096E8836FAEB314776 DD32E4622236437612F791A5AF6EB434 DD5261F940A24637A882A34028C4EF0F DE3D5C2FA21C3B2DC3D99ACD426DB751 DF698680E0ACAC53A262DE2F9A38C895 E07EE7342C600FFBAFE203EBC6C2A5AA E0F7D6C3F965391FE11C7D3C071CF243 E12069AF8AB1A973588A5E09069997D6 E27D491CFE73849F282FDBB0245325E5 E550EA09C202F953CD51A5FF20BEF7F2 E795B782469DEF7079ED781318CB4B9E E7D7F49ADF8A9D50C80181F8156B7F6D E9B34685FE9E28D3BDEE9A1F9BC51CE2 EB8AA71B976DECE1343AD837816A0E54 EC1BD639AEA2E8D9B2E7CA99C32F8AFE ED3547DA3B2ECEAFDE751D5373E88343 EE705C74D86BA4F86801A2E4D2E8B83D EF9F52E39C5E375D5250630B1C2C4AC9 EFBCA7F452AD034564040DA2B7758F69 EFD2B8B01150207F8F3B69D7259D80DF F0CDBE86158BA39A954327D634ECFA82 F0EC9515ED2D8F02ECAEE1EF9688D612 F18DB6F62A6A80F54EBF9782BED1CD6C F28A3845BF68E228D355B96970B91CD8 F4C355944E66DA18402A86B197C21425 F5636988C6D644712543CD4899D46213 F682C68BDCC29D5F6B889ED1A22617CF F7B060451B69AC085D12D51E8D133BED FA8CD7EAB5D939145BE099E13E1FE499 FD2ED6F5234742D5BCA7C71D23EF3962 FE3F37267F5BB3E372078DF9101450DE FEB7785DC8D2B6A6EC54146D79F17AE6 adobe:docid:imageready:71b72c00-06cd-11dd-96d5-b9d1971c2299 adobe:docid:indd:d9e95eeb-b763-11df-82eb-83f8ca83d6f5 adobe:docid:photoshop:01f145c4-1bf9-11db-af76-84f2f5b3e193 adobe:docid:photoshop:0629df6d-a412-11da-9dde-c8a00c7693e5 adobe:docid:photoshop:067f015c-6500-11dd-8c0e-da03867eaa6f adobe:docid:photoshop:0cc9b3f9-0481-11de-9954-c65a624f0359 adobe:docid:photoshop:0d69849f-1468-11dd-b4d5-a76ee511c599 adobe:docid:photoshop:0fc79f20-d232-11db-b1bb-aeba6ac5ef65 adobe:docid:photoshop:1095d5e7-5bc7-11d8-b5c4-ad94fedcbdf3 adobe:docid:photoshop:112ff759-2eb4-11d8-a7a3-d143df8e175d adobe:docid:photoshop:162f56b4-a07b-11db-9b6d-e4600e41f893 adobe:docid:photoshop:1634635d-b6aa-11d9-9d93-8f8f4ce80942 adobe:docid:photoshop:179a5fc6-d465-11da-b675-db28fe4a73f8 adobe:docid:photoshop:17f5aa33-b3be-11dc-9058-b94aaeb221d7 adobe:docid:photoshop:1bca738d-4d28-11df-ae11-88a6b11ac6d3 adobe:docid:photoshop:1eff0a7c-bb0e-11db-af40-c3e7cd681b24 adobe:docid:photoshop:21672e49-0a8b-11dd-baf7-d52def3e1b33 adobe:docid:photoshop:2176cf16-4d4f-11df-ae11-88a6b11ac6d3 adobe:docid:photoshop:29340be7-17f4-11dd-8148-fbe7f0bac890 adobe:docid:photoshop:296d44c8-fcb3-11de-8115-9f7e92accdc8 adobe:docid:photoshop:2e53065c-a7db-11db-a30c-aa3f32f49aef adobe:docid:photoshop:338a0b29-b45f-11dc-a093-e617abbc94ed adobe:docid:photoshop:3986dd71-8144-11da-af47-f98ca342a16a adobe:docid:photoshop:3b4ad281-f1a5-11db-8922-d70353ace9b0 adobe:docid:photoshop:3c7f34b5-ee6a-11df-a62c-9e4dd8a323b9 adobe:docid:photoshop:3d30f4c2-769a-11d9-87f1-a1f4bd4b2860 adobe:docid:photoshop:3eb9d5d0-7612-11dc-9872-87d859ee3843 adobe:docid:photoshop:4296683b-cf26-11db-b1b5-fcf0cb251532 adobe:docid:photoshop:42b55d04-ca65-11da-ac60-99df23f712b8 adobe:docid:photoshop:441aac6e-94a2-11da-a976-ddfa5322c051 adobe:docid:photoshop:493c92f3-3dde-11e0-a6b1-cafbe7a16662 adobe:docid:photoshop:49703922-ec28-11db-9998-ab71df72ca88 adobe:docid:photoshop:4a96218b-66b9-11de-a83a-bde54db9690a adobe:docid:photoshop:4f6997ab-913d-11dc-a3e7-c094cbb267fd adobe:docid:photoshop:530bb545-385e-11df-b714-dc4d020f611a adobe:docid:photoshop:5799b84a-f22d-11dd-95e6-d94ef15f0b29 adobe:docid:photoshop:5b4c00b2-5b4c-11de-aff6-e755350aa3ae adobe:docid:photoshop:5c20b5c3-8d17-11da-b4cc-aac22df0990d adobe:docid:photoshop:5cde0566-e15d-11df-ba2b-fe8a28cf5a45 adobe:docid:photoshop:5d55d682-fcb5-11df-8232-c2c89e4ac8d9 adobe:docid:photoshop:5f5b7de0-4a43-11df-bc05-e64777e8bef8 adobe:docid:photoshop:60d53d84-f875-11db-831e-c5f511e4f2eb adobe:docid:photoshop:631a4c2e-9104-11df-9ace-8e345b1a4685 adobe:docid:photoshop:67825bcd-c497-11d9-9b79-b43e3425d820 adobe:docid:photoshop:680b500c-af7d-11db-9531-ccfb979a170c adobe:docid:photoshop:68e80938-a2b3-11d8-9091-acb31a8f6422 adobe:docid:photoshop:68e80939-a2b3-11d8-9091-acb31a8f6422 adobe:docid:photoshop:68e8093a-a2b3-11d8-9091-acb31a8f6422 adobe:docid:photoshop:6aeaa901-a256-11dd-88a5-f4fa96375813 adobe:docid:photoshop:6b187a4d-21ac-11df-8763-f7b32115d1d8 adobe:docid:photoshop:6cc72dd4-c122-11da-9ea0-b410217bc604 adobe:docid:photoshop:72ee0624-feb0-11df-95f8-fbdf23b3ba38 adobe:docid:photoshop:76c7207c-5eda-11da-8dd2-e400fd2b8985 adobe:docid:photoshop:792c94d2-0b72-11dd-8a8e-b94e9ce47b14 adobe:docid:photoshop:81d080ca-4d3d-11e0-b91e-8e95c9e5f27c adobe:docid:photoshop:856033d5-fa47-11dc-9057-ac5d3de3713a adobe:docid:photoshop:868029fd-2276-11dd-9239-c1a598344559 adobe:docid:photoshop:8d293722-0529-11da-8d9f-87e9dc8d9ac6 adobe:docid:photoshop:8f80b457-3a61-11df-88fe-f9b9e462b5c5 adobe:docid:photoshop:8ff9d64c-4418-11da-b7e6-d902366ee3d9 adobe:docid:photoshop:91fd7821-74f2-11dd-b9bd-91275cd94b84 adobe:docid:photoshop:923f0e52-3389-11dd-950c-a80d9ad4456c adobe:docid:photoshop:9292eb5e-6ce8-11df-8d9d-d0d5522d8976 adobe:docid:photoshop:96bd365a-ca87-11dd-a0a2-89ff83774eec adobe:docid:photoshop:97c3b72d-4db2-11d9-9000-c6cf0216aa2e adobe:docid:photoshop:9855e9b7-1a77-11e0-a056-a14635721b97 adobe:docid:photoshop:98f1a89c-325d-11dc-8fc3-b9698acf6fce adobe:docid:photoshop:9d09ed44-1a77-11e0-a056-a14635721b97 adobe:docid:photoshop:a02e243d-7d2f-11db-95da-9323d7f297b0 adobe:docid:photoshop:a8f63b8c-cf8e-11d9-8f38-ea3e2d6c58a2 adobe:docid:photoshop:ab3bf953-b3ce-11df-889a-804e00b2331c adobe:docid:photoshop:b139775b-76ef-11db-b872-fa9e22b73d6e adobe:docid:photoshop:badec3b0-8d9f-11dc-aa6d-fd72ed461365 adobe:docid:photoshop:bb885d59-f165-11dd-b2e7-b55f0ff3594b adobe:docid:photoshop:bcf84d43-1a75-11e0-a056-a14635721b97 adobe:docid:photoshop:c1422350-a306-11d7-ad63-9fa59f868483 adobe:docid:photoshop:c1b701b5-db72-11db-ab1f-df74d7423f7a adobe:docid:photoshop:c4df783a-4b7b-11dc-a30a-e5c2aae6ba21 adobe:docid:photoshop:c5063482-0f94-11db-a9d4-b21f0f974623 adobe:docid:photoshop:c6f96f3b-5231-11dd-b295-c1ce63d1952b adobe:docid:photoshop:cd0c78a0-4851-11dd-8896-8e405be1d8c8 adobe:docid:photoshop:cf96f18d-a6f2-11dd-b2ac-cac96f638488 adobe:docid:photoshop:d1fccbc0-0a37-11dd-8f37-872ce44d6b12 adobe:docid:photoshop:d5d0f74f-cbf2-11df-9218-c52ca14e83e9 adobe:docid:photoshop:d9b2e6a0-8ce7-11dd-be12-93c5fb96f243 adobe:docid:photoshop:da0afeca-b663-11df-989e-cf5b70c23ced adobe:docid:photoshop:db4c3739-d291-11de-9902-88725022e8f9 adobe:docid:photoshop:dd0d929c-07d6-11d9-bb77-bfa7c8df5462 adobe:docid:photoshop:e4c364fc-2298-11dc-a3f1-affe78f3f1dd adobe:docid:photoshop:ee6e49c8-7ce6-11d7-a363-f9d10a5efd56 adobe:docid:photoshop:ee86b539-ba5d-11db-8dd9-fdce7565c567 adobe:docid:photoshop:ef1a6e5e-cbe9-11da-80fe-a32a41494dfa adobe:docid:photoshop:f0782080-cdd9-11d9-880d-b6b93505ef6c adobe:docid:photoshop:f935bde8-01f5-11e1-b0e3-99530bda4a31 adobe:docid:photoshop:fdf24b1a-2b71-11db-836a-8172f4ed98db adobe:docid:photoshop:fe58821d-5776-11df-8604-e5ea32f60741 uuid:001538AE6ADFDB11A160D41A8AFEFCAB uuid:00F94DE476FADE11AFBDDD91A537C5BD uuid:012B2C21C9B9DF119CA8F01C9B0C0333 uuid:01814A2EB739E111821CC1F06665CF29 uuid:0261F32478B9DD1186D09AA78310AF3B uuid:02E56BB23746DE118E05E00A924D8CC5 uuid:030793878DD511DB866B8FDD4FC5F6E8 uuid:038BF6416BBEDD11A016A6CCB7190A9E uuid:0446C88A4A56DC118EB38611B26FC35B uuid:04770F6D9686DE119BF8D83DC6F1A789 uuid:047C71B83946DE118E05E00A924D8CC5 uuid:04995FE55015DF11B678C06184391132 uuid:049B6674521BDF118174D58534E02F48 uuid:067F0114C5F4DF1181FBFA1FAF58F2DA uuid:06AE789055C1DC118FCCAFD862EC21B4 uuid:06CADE1FCD57DE119AA1DA9EA00F26D4 uuid:07218203AADEE011BA4CB639D1A8BD5A uuid:0769202E525E11DC813CFF9D60E9E4E7 uuid:086840927201DD1192F9E6B08F89D298 uuid:08CD4728BB26DF11BDEEDCA72E0E76E6 uuid:0A139D1E8A5CDC119A05BD94A54C7480 uuid:0B00D3552B46DE118E05E00A924D8CC5 uuid:0BBC2E109551E011A9DBA1AE97CD3A90 uuid:0CB3F764639CDE1183DFC60C032A1A9A uuid:0CE6EE4B3046DE118E05E00A924D8CC5 uuid:0E387A182E46DE118E05E00A924D8CC5 uuid:0E6C4060E6ACDC11A31BE2F1875A55F1 uuid:0EC1D3E93146DE118E05E00A924D8CC5 uuid:0F6E42F71D46DE118E05E00A924D8CC5 uuid:0F82B8E1008DDE118063A18DC277C381 uuid:1054D978C0E1DF11AA8AB303BFA5E6F2 uuid:106F5789EEDEE011B872DF47B34C9F1C uuid:10D9DC303346DE118E05E00A924D8CC5 uuid:11056C5AF55AE0118DE98213B6FC8AC1 uuid:134CED88052EDD11B423D4798897593C uuid:138E6BEB550311DE9C9980EB732A103B uuid:14BEAC59A02ADF11AECBC7578FA1C8B8 uuid:14C354FB2146DE118E05E00A924D8CC5 uuid:15553F6A9213DB1180BDFBD3D4018BA1 uuid:15578F2F1E86DD11AF96B6D037A279B9 uuid:15C1037383AFDF119792D12E80BC077C uuid:16387A182E46DE118E05E00A924D8CC5 uuid:169BE01290ACDC118FF9BE61B5313549 uuid:16BCA70A928BDB119FE2D1D1AD6D4DCE uuid:16F84B7E3246DE118E05E00A924D8CC5 uuid:1733C6F5FF8DDF118C48B1BDE6AABF0E uuid:19501508E2EF11DD8BECCB6B4552BEA7 uuid:19880D482AA8DE1181EEF3E5985FC08C uuid:1C68182A4875DE11A992FD2DC6E9830D uuid:1C746F852FB6DD11856A9A95FF697F0E uuid:1C79290ECC45DE118B23AD30BCA96A14 uuid:1CC0A469339DDD1192D3E25231FB5305 uuid:1CF25C713546DE118E05E00A924D8CC5 uuid:1D4243C97491DC11B124BBBDFFB33225 uuid:1D441F4C79C6E111989FA47FE829BB4C uuid:1D468B5A156711DE9D09B95D7469FFFE uuid:1D6D06A3DC8BDD11911EA1F37D8753ED uuid:1D90BE4363FCDA11AA83B543DC89108D uuid:1DC5EA073246DE118E05E00A924D8CC5 uuid:1E11C42A48FADE11AC12D4AAFE286F5F uuid:1E2D9BC292B811DCAC0BD7CFBA286A6B uuid:1E71DF13FDB5DE11B9299E5C971CB542 uuid:1EE7DEC2481ADF11905AD1E5E7183152 uuid:1EF56AB8E4FEDB11B991B9E549BBAB83 uuid:1F5AF3B67229DF119FFAB26E240C71BB uuid:1F95AC394748E011BC12ECADEA413AA4 uuid:2008E13DE47DDD119CA6C60CABE7E84D uuid:20323DAF3833DD11B84DB153FFCB2B25 uuid:20755CD9A1BEDC11AD9FC86910038926 uuid:207F5AB1E3E6DE11AFB6E5ECBD156976 uuid:208C44507E13DF11882FD35504085383 uuid:20AD1BCA27D611DCB3DCF58CB1282188 uuid:20DD6643FAC6DB11A46EA4B49D2FDE5A uuid:226AE9E80D1CDF11ACEBF49C1510D7E2 uuid:227BDC9B2FAADC119028943FDADC2D16 uuid:2290C3CD8FACDC118FF9BE61B5313549 uuid:22B35C622246DE118E05E00A924D8CC5 uuid:22C16BAA5AF3DE11B11DCE9D526E88E8 uuid:240F7696E09BDF118943EC7D2E89C0BA uuid:259C2D4D68C0DC11B4B1BE8F57C5AEE6 uuid:268662FD552E11DBBFFDB36DCBD91ADF uuid:27D3988D43DEDD118DB9EA210F03F4FF uuid:27F89F1127E2DD118645D3FA1066C7BA uuid:28403F4BC4D2DE11A11ED550D38F445B uuid:284D341C3746DE118E05E00A924D8CC5 uuid:28B85E6492B811DCAC0BD7CFBA286A6B uuid:290B84B52146DE118E05E00A924D8CC5 uuid:29F3D697198FDD1184F5AD5C323BD3E2 uuid:2A0921B9216DDD11A727A67773091824 uuid:2AD564756594DE11B4DDDF1320E4F07D uuid:2BFAFD88407EDC118371AA574708AABD uuid:2C205C7E8234DD11A069BF111D61B76C uuid:2C2589466F13DD119981999D14D29795 uuid:2C4F78A7552E11DBBFFDB36DCBD91ADF uuid:2D1F05B02946DE118E05E00A924D8CC5 uuid:2DBDD1BFCE1DDF119ABEC149331D314D uuid:2DBF74503C01DE119EDBA14779040E1A uuid:2DE8D2195D4DDC11ADBADEFD96B7F140 uuid:2F207EF07CC311DC870CD15D8998FC19 uuid:2FC0808BAE1DDD1185C1B3B2A073CCB6 uuid:304189413A6DDD119AFBF80C0D12BBC3 uuid:304D341C3746DE118E05E00A924D8CC5 uuid:328C2A23A1F3DE1188FCDC0D4534976A uuid:329EBF14943111DB9A19BF196009E84F uuid:32AD901C1540DF11BA22EB8390E427FA uuid:32C9A1BE013BDF11B28AB1E9B9BBF88A uuid:348C14E2B68DE011B2D0DF71982ECD78 uuid:35C28732F068E011BAE4A0F3F205CB0C uuid:36483A0B31BA11DEB3BCC14406C17F6A uuid:36483A1131BA11DEB3BCC14406C17F6A uuid:369E727FB04FDE119777A241E1132B43 uuid:36CC338DBF03DE11AA85DC89D1FCF295 uuid:37DD06A87653E1118422D9075FE29A11 uuid:382227419650DE11828EB79B7FF87B46 uuid:38DF7959A6A5DB11A7C783DEA9FDEF8A uuid:38EFEBD32C46DE118E05E00A924D8CC5 uuid:395B108AEC5FDE118F3EC99520DEB99E uuid:399642B01C46DE118E05E00A924D8CC5 uuid:39A85F352346DE118E05E00A924D8CC5 uuid:39F2EE174FCADF118E56E5FBFA7574BF uuid:3A4677815E29DF11A0B087DF897F5C56 uuid:3A4F51BF7911DE11A781FBA8671F5E89 uuid:3A8AF8CF577911E0A1AEADCEF7A8C695 uuid:3ADF94544123E011ADD7B065B3C26A4D uuid:3BF230DABEACDD11889FAC5282935681 uuid:3C0D38C2AFDEE011B945C4A423A57949 uuid:3CB8F15F31B6DD11856A9A95FF697F0E uuid:3D5103E655A5DF118996AFF35D6A9C7A uuid:3D90B6044FC611DB95D9A98C0E2341EA uuid:3E451D295162DB11827CBBD5A8C451C9 uuid:3ED246C8D77DDE11BF1BC86AD7862F57 uuid:3FAAB31DC7F3DE11BFB3BB61AE1A198B uuid:4017B42DAECBDE1186239E156231D83C uuid:4062B740431FE0119F84DB1DBEC49892 uuid:41A85F352346DE118E05E00A924D8CC5 uuid:4201C5411090DE11B123E1D45CDBF792 uuid:42595685158BDC11A437894E1E45ED2D uuid:42A5C6F1B041DF1190BE881BF8159F39 uuid:438D9E113046DE118E05E00A924D8CC5 uuid:457D02955055DF118B59D959D9FCD50B uuid:45B952D1A760DD11B3A3AB60E7CB2E32 uuid:4610D2BB5C3ADF11A1E0EE016E9F3D12 uuid:469594D60783DC11B8A6C730DDF0A3E8 uuid:46B070169EABE011BB42E88B754C4AEE uuid:46E135E06305E011A766E5F2293E7D86 uuid:46E5046B7D79DD11B6DAD14729559D83 uuid:47D9591E31BA11DEB3BCC14406C17F6A uuid:47F508C2CB3EDE1189BBC659B9EC8880 uuid:488E7D216417DF11AB3096DB59BE8278 uuid:49E8A66A3BB5DE11809BA989B0D77432 uuid:4B7C1B8FA601DD11A05B82F82E7564A7 uuid:4BD64E3D591ADF119A44816E426D14CC uuid:4D09B0846C29DF11843DE8ED84598CA3 uuid:4D47530DBFB1DE11838CB79BB029C533 uuid:4D9C981BFF36E011B824F4BA8EC19276 uuid:4DAB2F01082BDC11A590ADEFB8A01727 uuid:4DB2B99C3246DE118E05E00A924D8CC5 uuid:4F9AD90BECFEDB11B991B9E549BBAB83 uuid:5001F74D2A46DE118E05E00A924D8CC5 uuid:502ADD3C8B13DD118EA79BEFBD19D7B1 uuid:502D4D912B46DE118E05E00A924D8CC5 uuid:5085FE1C5CF1DC1184999B2D473B40C5 uuid:50A5F355BC4BDF11A8A3F6410E93A61A uuid:51102D2348E6DC11BA37A1F459320984 uuid:51A11EEB85A7DD11A19786A77EB54A52 uuid:52A5D3054338DF1190DAEFCE2D940955 uuid:5344B517DA0CDE11AB76806D8F41191A uuid:53E437D50797DE11B2DABAB77D7740BE uuid:54E3BAB15595DE1191E8AA31C2B4DE24 uuid:556D58241B1CDB1189D5B5EC4E3A9E38 uuid:5577922C3846DE118E05E00A924D8CC5 uuid:557E3B3CE135DF119278D380A54DDC5A uuid:565C30D43A08DF11A61DB227EDDF59F8 uuid:56D4817031A9DD11B70DB0CF0BC9EDCD uuid:57659E439232DF11A17C9479A9CEE277 uuid:578299FCC3D0DE119465B96E3C2E2EAA uuid:57B5C40EA9FADF11BA9BD748AA367EA4 uuid:5837A8EFFDD2DE11B148FAEF5DA70A0A uuid:5975A572B4AFDE1191F9D38249749CE2 uuid:5A79E0672746DE118E05E00A924D8CC5 uuid:5B0CD778CF24DF1182C1B3E1B6A83EEB uuid:5B25B2A4FC5FDE118C55E1FD1DE5BAC3 uuid:5B5A903A8F63E0119B87E6FF75E31714 uuid:5B636B2FE0B0DE11A587BCC51C1D4B69 uuid:5B6CC28AD15EDD11B9AE8B3F0765C8D0 uuid:5BAB8930E193DD11ACDF9A606EE463A3 uuid:5C7449A48B91DC11831FEBD781B6ECB9 uuid:5D0C528FBA46E01183C8E802910C25E8 uuid:5D384D1449EADE11A9D8BF3293C13593 uuid:5DA6CE83324911DEA1B296A980BFAFA4 uuid:5DA895C1944CDE119C89B968D8A62C72 uuid:5F50494D7C49DE11826FBB70EB840DDA uuid:602E96167548DF11B95593FEFB4F0A8F uuid:60AD1AEAF96CDF1185BBB7D7C9ACD7A0 uuid:60BCB4D66DD6DD11A47DE4DAE0EFF793 uuid:6192C48C2463DC11A938D0D477F76208 uuid:620AF59A6568DD11A7E4CCA02A14236A uuid:62125b08-dfcc-5f4c-8dc1-0da856e0f01d uuid:62B1E9C30F69DD11BC168B5829BB5263 uuid:6355C15346DFDC11A214AD89929E38D3 uuid:6367FD463646DE118E05E00A924D8CC5 uuid:63C475A288ED11DEB3FFF614CCD16C87 uuid:648255D889CFDF11A1D8E4A4F489C6F9 uuid:65A58184AD03DF11BA1CFE2E2459F90E uuid:66211d2a-e75a-6349-9313-114dc4ac619f uuid:665D5C43515DDD11ABFDD4D30129E755 uuid:667885ABEAD0E1119C6E88955B330D71 uuid:66E770C8D883DD118567FD7DB7D1FB68 uuid:674D5E42B2DEE011B945C4A423A57949 uuid:67BCF230F7A1DB11AECBF85849BD86F5 uuid:68B73160563E11E0A57A92CDC08EBFDC uuid:68DDFCCD377FDD11958095E49FBC919E uuid:6922E29B5985DF11B4779C1A60E25466 uuid:693BEA6CB8A6DF11A082860CFDE3F28E uuid:6A51460EFCEFDE11A35CD3D8F4849AB1 uuid:6A6D4B9DD3BBDE1183F9F5180F278EF5 uuid:6AD4462FB204DD11A4539B8A658B95AB uuid:6B26E6F714A3E011B8F2B39CADF8C7BD uuid:6B4D5E42B2DEE011B945C4A423A57949 uuid:6BD6CAFDC3E7DC118D17CCC8742E2E78 uuid:6C1CEE99FF0CDE118B60808686D1CDA6 uuid:6C707EB54C4EDF119BF69F5E7CC385D4 uuid:6C875D7786AD11DBA35CA8F2CCD0B6EC uuid:6D2D16B0565211E0A57A92CDC08EBFDC uuid:6E47E0D0A3C911DD990ED023CA6AD342 uuid:6EDB09A4EF99DC119FDAE1E6C9E90D52 uuid:6F0C51E18A5FDF11B6C6A84C08FFDA77 uuid:6F5C782E2C9CDC11908C9ADAF87FE933 uuid:701F0AA1DC0FDD11B6B0DA6D17610842 uuid:71B724FCE7D1DC11AB7C8BDDCD744643 uuid:7222A0DBD298DC1182C6BEF4D19F3EF2 uuid:724842380D8DDE11811AE89A4C637779 uuid:72AD3ED38871DE11907DD58D2A428021 uuid:735432F83446DE118E05E00A924D8CC5 uuid:742FDDCAF0BF11DB96ACAB58D2874C3B uuid:746583581EC811DEB82CD8B338B01D3B uuid:748FBBC54761DE1199DC9982344E391A uuid:75889B152262DE11A72AF16963CD89BB uuid:758F019E77E011DCA16D9AD07F3E4EB0 uuid:75BA6EE02846DE118E05E00A924D8CC5 uuid:75DCEEF5501BDF118174D58534E02F48 uuid:75E80B316579DF11A939CB8B2C636ED9 uuid:75ad37b6-8a37-4fcd-a4fe-26f1aa1f11ab uuid:7726580E30E0E011A0DFF1A921A77D14 uuid:785BF1A33D44E01196A9FDAA302A4A52 uuid:786CC4073C01E011B40E84D550759E70 uuid:787B3D0F0C07DF11BF3BE2D4EE658A9A uuid:78948929B329DD11B93AF0E4356E33C1 uuid:78BDAE073DD4DD119574E49260AE7023 uuid:78E06230DE31DD119D9293E81F0F46B2 uuid:79D399B24B31DF11B87EB9B2F774C66B uuid:7A1A8CDA6753DE11AEE6B02826E52418 uuid:7A249F7BFEACDF11BC6E8D04CFB3FC6C uuid:7A53A07034E0E011B6EAB49C9ED7F21C uuid:7A7765743160DF11B7058CDA462E88D0 uuid:7AC55A0AFA7DDD11BDB4D1FB4F0D7360 uuid:7C0400B9C2E7DC118D17CCC8742E2E78 uuid:7C66DA44A194DF11953AEBEFD43548AA uuid:7D82A4D9F538DF1189AFCD2729466985 uuid:7DCCEB3E9D0DDF118A1BD62C0D068F40 uuid:7E53A07034E0E011B6EAB49C9ED7F21C uuid:7EB569DB4D83DF119319B163B01C38B5 uuid:7EBAC78415A3E011B8F2B39CADF8C7BD uuid:7F5CD1D0302EDF11A06B87AB6D5393CF uuid:801DD6C6E1DCDD11850FE2C9B83E74BC uuid:80DECBBD2846DE118E05E00A924D8CC5 uuid:823002034C69DD119C1F8E912965B471 uuid:82B09529C90ADF11823FC380DCAC210B uuid:8418B9F71B19DE11ACD1FD0D79D1C48C uuid:8426B111521BDF118174D58534E02F48 uuid:84BCB3D4733CDD11AB1EBF4A6A17D95E uuid:84BF1E98A360DE1194C18245487266E3 uuid:8631318ED591DE118BB0E5D058A15FA6 uuid:863D29600E91E011B7E2BA43D2041D1F uuid:86931125389ADF119BE6A44B39062E37 uuid:86CECBFFD057DD1195779C82C766E2BF uuid:871A6276F573E011AE93F71A5E985A91 uuid:87DD43522302DC11ACBFC215FBEC85FF uuid:88218060511BDF118174D58534E02F48 uuid:88682ECF5FDFDE11B366D9EF74DE4B3E uuid:888EFC12BBA4DC11A788F61F464F954C uuid:896C0FCBDA32DF11A473B21C49D1757E uuid:8998E2FC5D81DE11AB10E18A368CBC72 uuid:89BB70853646DE118E05E00A924D8CC5 uuid:8A8991253246DE118E05E00A924D8CC5 uuid:8AB3B33B3292DC11928CDAE88FF0982B uuid:8ADA5CACA94411DBB26D8C0280FD469D uuid:8AF0B2828F81DC11A53F84F58E6BA9AD uuid:8BD313481D31DC11907BBCD0C2EDFFE8 uuid:8C632C6BE825DA11BB67F40C32FA7FCF uuid:8C8B4F317E1ADF11BABCD74472CEE0AE uuid:8CB31ECD3546DE118E05E00A924D8CC5 uuid:8CF6F94AEE4FE2119D64B0A448181B33 uuid:8D62E5C5F946DF11A1ACBC2CD660C212 uuid:8E3257BC3446DE118E05E00A924D8CC5 uuid:8E4A02013946DE118E05E00A924D8CC5 uuid:8E77239FAC2AE11182A8F2C69689AB64 uuid:8EF58BA46E66DC1193F48773309C9D8D uuid:8FE1F95A9541DE1187A3B63AEC670B7F uuid:905423059AE9DA119E84CAF24BDD6066 uuid:90A480022946DE118E05E00A924D8CC5 uuid:90ADF7D5398A11DF86119436A17CB227 uuid:90C4C16F24ABDD11BC05B48537EE3891 uuid:90DBC697B2AFDE1182E898E4D7E7240B uuid:91BB70853646DE118E05E00A924D8CC5 uuid:91C6B9DD7D1ADF11BABCD74472CEE0AE uuid:91EE4D01FDA9DD118555BD7879927BCB uuid:920948E8D2A3DF11949EEA82414C67FD uuid:92108B13A540DE11A29DF00ED4C1B727 uuid:9328FB1C2246DE118E05E00A924D8CC5 uuid:93312F3A9EABE011BB42E88B754C4AEE uuid:9369042C2F46DE11BD9EE5A6639A625F uuid:93B74885F527DF11881EA6879E79C74F uuid:93E8AD8CBD32DC11BFE2E5D6CE581572 uuid:93EAD89D899BDF11AE2DCAA2C8CB51A4 uuid:93F0839448B2DE1191C3C665BC9BDA99 uuid:94B31ECD3546DE118E05E00A924D8CC5 uuid:952A33247B74DE11BBA19E5AEE919C47 uuid:95C5C57C521BDF118174D58534E02F48 uuid:9603F6864F22DF1191BA98E3D07EA6E2 uuid:964D6FC3F9F3DC11B7B787F67A8DC675 uuid:976501A145A6DF118EF0F8A0A306590B uuid:979E80F12C46DE118E05E00A924D8CC5 uuid:97E23D2C4B12DF11ADBDB3D48DA81215 uuid:982703D5AFDEE011B945C4A423A57949 uuid:98286303A71FDD11ACEC89ACF33BCD0B uuid:98624FB17A0611DB90E7A8A6B33DDE8F uuid:98A480022946DE118E05E00A924D8CC5 uuid:997168516F27DE118DD28306BA0AD781 uuid:999D0ED6592CE011875FEC74EAED3B90 uuid:99A724EF2246DE118E05E00A924D8CC5 uuid:99BC43C5789DDF118943EC7D2E89C0BA uuid:9A4E3BC73346DE118E05E00A924D8CC5 uuid:9A7015542E46DE118E05E00A924D8CC5 uuid:9A852FC218CADC119D59B5BD9DB71E82 uuid:9B8169013A6CDB11BEEFDD803C4CB37F uuid:9C427F29C23BDE118624AC3C981C00EB uuid:9C4C17673BB5DE11809BA989B0D77432 uuid:9C6B168B2263DC11A938D0D477F76208 uuid:9DC3029D1D46DE118E05E00A924D8CC5 uuid:9DCFFAE96350DF1198DBAA6ABC516A5B uuid:9DD593BF31BB11DEB3BCC14406C17F6A uuid:9E17A4246AEEE011A3E7C1FE0481E6CD uuid:9E27DCC8DD70DD11AFB2FB57BC79BEFD uuid:9E36763AB81CDF11A4DFDAC2607E8880 uuid:9E393079ED09DC119950AA34618C8687 uuid:9E41B67C0FDFE011B872DF47B34C9F1C uuid:9E749DEB31BA11DEB3BCC14406C17F6A uuid:9ED58FA75D9BDC11A06AF98D3B9E72A9 uuid:9F71A1DF3646DE118E05E00A924D8CC5 uuid:9FF76A7D9582DE11BB37BEE3126CDD63 uuid:A03CCF649B0EDF11A0D29729EA0AB6B0 uuid:A0D36E10BEDFE011AE6BCFD5A31C68AD uuid:A114E296DF15E011B51784A64D80A595 uuid:A18701B4B2DEE011B945C4A423A57949 uuid:A235FFA43633DD11B84DB153FFCB2B25 uuid:A270FE72B2DEE011B945C4A423A57949 uuid:A3233D7639A0DD118C4EB1D76F20D61F uuid:A3A81857CEB6DF11A9D8F81D08128070 uuid:A3CFFAE96350DF1198DBAA6ABC516A5B uuid:A3D6B47F18B2DD11919198E04079117F uuid:A4A0074F8101DC11B2DCD85209BF7530 uuid:A4A6D5B3CF6EDE11B59CDBEDD4FA0491 uuid:A52B2BE2D504DE118532A753628E9587 uuid:A52FE0D63946DE118E05E00A924D8CC5 uuid:A6243BD58D77DD11AD11D198EF8B0946 uuid:A6359C7E140ADC11A2DAA4D78F509131 uuid:A66D327A3BBF11DC8215ADC1775D44BC uuid:A6B8A16E3BB5DE11809BA989B0D77432 uuid:A6B8E3575957DD119F3F8760AB0AA4FE uuid:A76F7547765FDF119F61C543DD152838 uuid:A9005AAE8A7FDF119CD6A0C6AE1D8074 uuid:A98FCD856D55DF11BA0E9527DA9EC859 uuid:AA8E7E94A00EDF11B1CCD399BC96A2AC uuid:AB0C0C914333DF11A8E6A38A5488C1F3 uuid:AB548945339ADF119BE6A44B39062E37 uuid:ABC988A0D0C3DF1181D8F87795C0EBDC uuid:AC7E2C1F2747DE11AB48C7C86FE713E7 uuid:AD821971DBB1E01196138AFFE013C41F uuid:ADB8A6342EE0E0119500C872373672E0 uuid:AE02AF60883FDD11AC2BE9025EE1BBF9 uuid:AE363A6BEA4EDF1192DBF5680431570F uuid:AE5BE486BF77DC118A089E5735CF5EB9 uuid:AFE5E935C3DEE011BE5CDB1A796662A8 uuid:AFFEB253AFFEDE11A592862C0BC3D959 uuid:B00D84D55063DF1183BD84419D5831DE uuid:B01BB22766F8DA119EB1D1E45291D5FA uuid:B118FD9C3446DE118E05E00A924D8CC5 uuid:B48CC374F6E2DC1193D6E593F704EF94 uuid:B4EC9A2F511BDF118174D58534E02F48 uuid:B5F9259082C111E0A2268145FEAA7380 uuid:B7F8325E92B711DCAC0BD7CFBA286A6B uuid:B7FA54C069D3DC119030EB72FE5773AE uuid:B850031313CDDD119358D3EBF934974E uuid:B854A2A773DFE011A3EAB924634D1234 uuid:B886F63C4E62DE118924E4732F4AFB5E uuid:B8DBE641D274DC11B15CC929E0BBB1F0 uuid:B93D03A93346DE118E05E00A924D8CC5 uuid:B971000E3AE0E0118D54AF7EA314E301 uuid:BAA5CD7B8DAFDB11BB67B9E1DC4CE7A2 uuid:BAAF5DE4E21C11DDACC5B29D9085C55A uuid:BB1EF37481E8DC118DF8881DDBB15AA6 uuid:BC1357D69796DC118AF8AC23B60971C1 uuid:BD5AFE0931BA11DEB3BCC14406C17F6A uuid:BDE7D3ADA44ADD11B942826B91B46D31 uuid:C0599F3447CCDC11824DE83F3063EB00 uuid:C0AF6874BFFEDE11BA268E9760F6C405 uuid:C494ABFF2944E211B900832EC089AFA0 uuid:C86C30CAF7B5DF119A7FC51EFA65364E uuid:C8E2FDA62246DE118E05E00A924D8CC5 uuid:C8FFC71C31A9DD11B70DB0CF0BC9EDCD uuid:C95F8E93E1ECDD11AD81A1AB84D405B4 uuid:C9E6670A7191DD11A3FAF2032831011E uuid:CA4E034E7E1ADF11BABCD74472CEE0AE uuid:CC18FBD9041CDF11ACEBF49C1510D7E2 uuid:CD8BCACE98BCDE11AE26F9D1FD1B7E18 uuid:CE5A4F4F5DB8DF11A53AA0E9AB1C70AF uuid:CE850F17235911DDB8A999939B027CA1 uuid:CECC404C96BCDE11AE26F9D1FD1B7E18 uuid:CEEBB5CC348DDC1191489627CE433B2D uuid:CF5479BA31BA11DEB3BCC14406C17F6A uuid:CF5F4C02B4B3DF11BEE9D23A73828232 uuid:CF8E06442746DE118E05E00A924D8CC5 uuid:D151FA895E91DE11BDF1967A9D5E1EC3 uuid:D1DE550983DEDD11B182D5DA082F73C9 uuid:D27447C06783DF11A419DA8530481AE5 uuid:D2EBAF8C9303DC118103AC75D3E1885B uuid:D371356656E1DB11A1EDB8C01A221B6C uuid:D4D29E8CE37DDD119CA6C60CABE7E84D uuid:D5A43BCE2446DE118E05E00A924D8CC5 uuid:D62220B4D76BDE1185E2922F624AD9E5 uuid:D623E2FCCB44DF11A659990446779642 uuid:D6EF40FB5568DF11AE2DDE167B97FDBE uuid:D72377749B34DC11AFE894FD60CC29BB uuid:D76A99DD2D46DE118E05E00A924D8CC5 uuid:D883139A2F46DE118E05E00A924D8CC5 uuid:D8D88832C306DF11AF8AA587C3C1C2B2 uuid:D9C0F8FB9C90DE11AE0AC26550418DE9 uuid:DA29F8D63833DD11B84DB153FFCB2B25 uuid:DACB42AC0D57DF119E6183A921B60F6D uuid:DC4C48BEE80EDD119117B0EC9223F3FB uuid:DC4F5882B0E9E011B3269AB1C0356EB4 uuid:DC8074239110DF11856FF25F8996A646 uuid:DCAF95EF5418DC11991D9081DD0FA550 uuid:DCF2F321362811DCA14E914CEB339C56 uuid:DD3643D13746DE118E05E00A924D8CC5 uuid:DE2B51B51DDFE011B872DF47B34C9F1C uuid:DEA145090A4BDF11BF52B811BBA0F62A uuid:DF3E6C248070DE1182A4E4822D1896D0 uuid:DFFAC8748B60DF11A5D6C5494D1F118F uuid:E0FEFDA0DE26DF11925DB7C100A3E828 uuid:E17A1128166CDF11A85DDBD0BB17D8AD uuid:E1EFA889B9B2DE119ADAFFBED641D007 uuid:E37FE4776651DE11B0FF904ABD7E9C78 uuid:E4B7DEE9001FDF11B6BDAB31141CBAD0 uuid:E51D53285CF7DE11BAA3858EFB8697A5 uuid:E5D64E1F241311DDBF50C49E22072263 uuid:E5F4A87305CBDC11860BDAD4ECA0DB8B uuid:E687B8E3F9ECDF11B076F4C39C2F9754 uuid:E710B34B5B4EDD11AB3CE178BC4308B3 uuid:E726AB67A1D7DE11A1AE8A388BF11FDB uuid:E752405CD502DC1183F88C80D133AE02 uuid:E79A4A832DE0E0119500C872373672E0 uuid:E8711942FCD9DE11BEB2B63538B485CF uuid:E8E53D5DDD52DE11A63583E5225DA4A2 uuid:E97F51296D0ADE1187DEC54A1F42F690 uuid:EB01B3383110DF118ADBB50293FFA6F8 uuid:EB69B1888606DE11B380C9DFFF5EDB6B uuid:EC015C3A8574E11180B99F23AE58726A uuid:ECB78735274DDE11B01EEA9B67CC9BAE uuid:ECE2612CF702DC119927C0AD4422C47F uuid:ED8D85735E42DD11A1DCD26843D97074 uuid:EE8CBA0F2D46DE118E05E00A924D8CC5 uuid:EEF7F16FEF89DE11B1C4D65EF43688A3 uuid:EF9A4A832DE0E0119500C872373672E0 uuid:EFE92B5982DFE0119780E3E617CFD216 uuid:EFED9F6D3BB5DE11809BA989B0D77432 uuid:F0D3FF33AE63DD11A1C8DBED5B6F2ED7 uuid:F10C79062C46DE118E05E00A924D8CC5 uuid:F2652DC558E1DB11A1EDB8C01A221B6C uuid:F331D6A9AE00DC11ACAF98334D040065 uuid:F3F7568A445BDE1184E2C3A479231CEB uuid:F4BCB835CD84DA11AEE3C92BF541D7B5 uuid:F5E54A230C69E011BAE4A0F3F205CB0C uuid:F626B67D8860DF11A9018B722DA7EE55 uuid:F68CBA0F2D46DE118E05E00A924D8CC5 uuid:F76F71AE586DDF119ABBECCE6851D422 uuid:F81E9BC9978ADE1196A0EFF950960E15 uuid:F87C837D9769DF11ABBAC37B0CF877C5 uuid:F8838F0B3646DE118E05E00A924D8CC5 uuid:F8C8948B2946DE118E05E00A924D8CC5 uuid:F97486C1E24FDF1183C7996710D099DC uuid:F9C28AB70279DE119AF4C11AE6D6D880 uuid:FC6284395CDFDE11B366D9EF74DE4B3E uuid:FCE867DF3272E211A33A8755952F88B0 uuid:FD3CAB94E740DF11B86BCA79B8B8B185 uuid:FE4E366D55EBDE11B73DBE257B556A3A uuid:FED7768A2A46DE118E05E00A924D8CC5 uuid:FF79D4767969DF11B0C7F2016358B619 uuid:FF9AF64D0C39DF11BF8393223FA3F19B uuid:FFE4355518A1DE11B97A955C1491AF1F uuid:faf5bdd5-ba3d-11da-ad31-d33d75182f1b xmp.did:006B7D713E266811910997920F9A7541 xmp.did:00801174072068118083885AD9345809 xmp.did:00801174072068118083BAFDA65F8430 xmp.did:0080117407206811871FA882204C4943 xmp.did:008011740720681187E6D3F1FEEE7E61 xmp.did:008011740720681188C69E72FB9C9FD5 xmp.did:00801174072068118A6DC339C638C22A xmp.did:00801174072068119109D0F9CCA25A5B xmp.did:008011740720681192B08162DEA350D1 xmp.did:009CBBF21FA4E011B882E5809DDE5B73 xmp.did:00EE06B326A4E111AF47D84B5110F70D xmp.did:0153B9CE159BE011A42DEC14C3EFCAEC xmp.did:0180117407206811808388714877E726 xmp.did:01801174072068118083A3AD73AC711F xmp.did:01801174072068118083C4FE05237EAC xmp.did:01801174072068118083F8C3CE47E75D xmp.did:01801174072068118083FA9F955E2000 xmp.did:0180117407206811828A9C07725CD1BC xmp.did:0180117407206811871F8EA3F2A2AE1D xmp.did:0180117407206811871F9B09294944B5 xmp.did:0180117407206811871FA7DDB6344DDF xmp.did:0180117407206811871FB222890A0E4A xmp.did:0180117407206811871FB6D45CC9A53C xmp.did:0180117407206811871FC852CC88A456 xmp.did:0180117407206811871FDB7C73EC7AF4 xmp.did:0180117407206811871FDDF97733816A xmp.did:0180117407206811871FE8DD2340C0B0 xmp.did:0180117407206811871FE9333920AD6A xmp.did:0180117407206811871FF1961D211D67 xmp.did:0180117407206811871FFBB65EC420B1 xmp.did:0180117407206811871FFFE0F6FD6607 xmp.did:018011740720681187E2AD1A500D39E0 xmp.did:018011740720681188C684EAF6EB3EED xmp.did:018011740720681188C68CC6C803710E xmp.did:018011740720681188C6A2A17C791225 xmp.did:018011740720681188C6C612837B0247 xmp.did:018011740720681188C6C8FB64E3077F xmp.did:018011740720681188C6CD649893B632 xmp.did:018011740720681188C6DEB6A7380E02 xmp.did:018011740720681188C6E4708E0E2747 xmp.did:018011740720681188C6FD88E3797378 xmp.did:01801174072068118A6D856087352BA7 xmp.did:01801174072068118A6D894AE997EB0E xmp.did:01801174072068118A6DB6C7EBF6AD02 xmp.did:01801174072068118A6DCC78F8DCE567 xmp.did:01801174072068118A6DE6B814766CDB xmp.did:01801174072068118A6DF13459D8D59D xmp.did:01801174072068118C1495187346E998 xmp.did:01801174072068118CE8FAB7EAEEF1DA xmp.did:01801174072068118DBBB0B046013550 xmp.did:01801174072068118DBBD7411B5EC877 xmp.did:01801174072068118DBBF67CC7525F38 xmp.did:01801174072068118F6281652F82AFE6 xmp.did:01801174072068118F6283F08ABAE4B0 xmp.did:01801174072068118F6284B29ADFCC43 xmp.did:01801174072068118F628DC2429FD647 xmp.did:01801174072068118F62C5774A079733 xmp.did:01801174072068118F62DBC328695FC3 xmp.did:01801174072068118F62E2D7B95B1B14 xmp.did:01801174072068118F62EB2ADE46D273 xmp.did:01801174072068118F79B7473C32B448 xmp.did:01801174072068118FBC9421557B7B20 xmp.did:018011740720681191098FD20CBDF1C4 xmp.did:018011740720681191099C046A8759D2 xmp.did:018011740720681191099F8626CB41AB xmp.did:01801174072068119109AC6131693E65 xmp.did:01801174072068119109B5666CC87C3E xmp.did:01801174072068119109BD18F96FE5FE xmp.did:01801174072068119109C37490BE3834 xmp.did:01801174072068119109DA99C2E792B3 xmp.did:01801174072068119109DAEE9E19A282 xmp.did:01801174072068119109DDF6FAAF36D2 xmp.did:01801174072068119109E22328FDF13B xmp.did:01801174072068119109E8810C5BC784 xmp.did:01801174072068119109F305646EB57D xmp.did:01801174072068119109F981883825E0 xmp.did:01801174072068119109FA297A7A5904 xmp.did:018011740720681192B08AE26BD827F7 xmp.did:018011740720681192B09184D5478EBC xmp.did:018011740720681192B097F0C9D8B91A xmp.did:018011740720681192B097FB589AB6DF xmp.did:018011740720681192B09C403CFF3A3B xmp.did:018011740720681192B0A5BCFE59DE75 xmp.did:018011740720681192B0B727F2063586 xmp.did:018011740720681192B0BAA904DE0F8D xmp.did:018011740720681192B0D93A7E1A012D xmp.did:018011740720681192B0E8A60AAA7296 xmp.did:018011740720681192B0EA0610751F7C xmp.did:018011740720681192B0F39C7BC094AF xmp.did:018011740720681192B0F77B00BE432A xmp.did:018011740720681192C7D0F81AAEB882 xmp.did:01801174072068119457B5780B4D650C xmp.did:0180117407206811956CDA996C733812 xmp.did:018011740720681195FE85312F4E4086 xmp.did:018011740720681197A5B386C33BAD50 xmp.did:018011740720681197A5CD7DCFD54202 xmp.did:018011740720681197A5DAF2583A0A4B xmp.did:018011740720681197A5F9674A0885AD xmp.did:0180117407206811994CB67047760989 xmp.did:0180117407206811994CE07EFE756DA7 xmp.did:0180117407206811994CEBF7BEB94108 xmp.did:01801174072068119A889F688513D349 xmp.did:0180117407206811A088E49E19740FB2 xmp.did:0180117407206811A610925F68191C15 xmp.did:0180117407206811A7BADF4AD3269966 xmp.did:0180117407206811A7BAE496507CC015 xmp.did:0180117407206811A81C97AE71B8FB6D xmp.did:0180117407206811AB0888EC9D8B85A6 xmp.did:0180117407206811AB08B40A0C00B04E xmp.did:0180117407206811AB08E8E8EE3F0289 xmp.did:0180117407206811AE569E92DE925BD5 xmp.did:0180117407206811AEC7ACE16F2ADB0F xmp.did:0180117407206811B1A481173F3B2091 xmp.did:0180117407206811B34BBA3E1B4D7703 xmp.did:0180117407206811B50CFC9853933782 xmp.did:0180117407206811B6BE96AFFBCEFD7E xmp.did:0180117407206811B901FE6ED6130D27 xmp.did:0180117407206811BA06DE2D23900A1F xmp.did:0180117407206811BEEAF2CDF8DA2015 xmp.did:01BDB8EC4B4011E1B98CEF24291654DE xmp.did:01C668CB2C3A11E0B24BF72F16719A14 xmp.did:01C66F18E5C6E011BEF0A37AC8AFF6B8 xmp.did:01EDA34036EEDE11A8DE8E9B24B12DAF xmp.did:02649246152168118A6DC8429994DB80 xmp.did:0274AA50BBD9DF11BFD1959D5E34049B xmp.did:027CDBED1E37E2118E37E38874568DAA xmp.did:028011740720681180838223AEF978C2 xmp.did:02801174072068118083DFDF36644483 xmp.did:0280117407206811822AD2268457245B xmp.did:028011740720681188C6C9584A0CE4D6 xmp.did:028011740720681188C6EA7AFA84B3CB xmp.did:02801174072068118A6D9937AF694056 xmp.did:02801174072068118A6DE8CC51352B1F xmp.did:02801174072068118A87FFDBA1F29826 xmp.did:02801174072068118BAACF3C48947CCA xmp.did:02801174072068118E8B95801AA5B653 xmp.did:02801174072068118F629EAE88CED33B xmp.did:02801174072068118F62A2F6C51121F7 xmp.did:02801174072068119109906E1CD89C48 xmp.did:02801174072068119109AC6131693E65 xmp.did:02801174072068119109B0F0B9959332 xmp.did:02801174072068119109C13AE0D52ACD xmp.did:02801174072068119109C65A70401340 xmp.did:028011740720681192B0C3F69947135E xmp.did:028011740720681192B0DEBFF74CEF5E xmp.did:02801174072068119457F50BDC4298B1 xmp.did:0280117407206811994CDFAA02EEDD50 xmp.did:02801174072068119DBFAEEF0353CE0A xmp.did:0280117407206811A818A5FA62C0A48A xmp.did:0280117407206811AC988E10CC0CC7E7 xmp.did:0280117407206811B44DF79DFC232CD8 xmp.did:0280117407206811B840C1437888502E xmp.did:02EBADD8BEC5E1119B98D94286F4CEAE xmp.did:03801174072068118083D2748AE39423 xmp.did:0380117407206811871F81E8BB0F82E6 xmp.did:0380117407206811871FFAC63C818640 xmp.did:038011740720681188C6823329C82B91 xmp.did:03801174072068118A6D9937AF694056 xmp.did:03801174072068118A6DE0B43D455FB9 xmp.did:03801174072068118C14A49D02AC9755 xmp.did:03801174072068118C14ED8399FD50F5 xmp.did:03801174072068118F62DFCEF30AAC90 xmp.did:03801174072068118F62FA26B1D2377A xmp.did:03801174072068118FEDF87473FF36A0 xmp.did:03801174072068119109E219C1666972 xmp.did:03801174072068119109F03089D4B9B9 xmp.did:03801174072068119109F416381BA9E4 xmp.did:038011740720681192B08C886B6D489C xmp.did:03801174072068119346F274C058D55C xmp.did:038011740720681194288658274AEA5E xmp.did:038011740720681197238F25F2FFB081 xmp.did:038011740720681197A59FB566CBE17E xmp.did:0380117407206811A237BBC8AE7066D6 xmp.did:0380117407206811A7D4DF8188E07E2E xmp.did:0380117407206811AEE4ECC20A5D0880 xmp.did:0380117407206811B894F2D3850E7186 xmp.did:0380117407206811B8B5B25456C28219 xmp.did:0380117407206811BD209C3F4437B116 xmp.did:04801174072068118083EFB21C9E6096 xmp.did:0480117407206811822AB634F36508C2 xmp.did:0480117407206811871FF0EE6AD5790B xmp.did:048011740720681188C6BBFAF87E6B92 xmp.did:04801174072068118A6DEC27AEB5D46C xmp.did:04801174072068118C14B8B7A921B342 xmp.did:04801174072068118F62DB3F26862A68 xmp.did:048011740720681191098D76C49036E9 xmp.did:0480117407206811910999E172ACEF41 xmp.did:048011740720681195FED5E9D317291E xmp.did:0480117407206811B6188380968D4DC3 xmp.did:04BB01059CF711E08A9C913C073A663E xmp.did:04C7B018AD8BE0118005E62EBF747214 xmp.did:04E55EBD6020681188C6D9EA900BA018 xmp.did:04EE06B326A4E111AF47D84B5110F70D xmp.did:050E6D0F2B2068118083A159441B1002 xmp.did:0580117407206811808387D48DB3A4B0 xmp.did:058011740720681180838D77FED7457F xmp.did:05801174072068118083FCD7EE0824B6 xmp.did:058011740720681180B4DB6FCDC6F1A9 xmp.did:0580117407206811822AEF11CA54EF0A xmp.did:0580117407206811871F834B9271D32D xmp.did:0580117407206811871F9617A759D4E6 xmp.did:0580117407206811891D9A76213AD321 xmp.did:05801174072068118C14A56C815EEBE2 xmp.did:05801174072068118C14B4DD23E1D3A1 xmp.did:05801174072068118F28AC14F3A6738D xmp.did:05801174072068118F628C5BC7FF1E1F xmp.did:05801174072068118F62984C1217D466 xmp.did:058011740720681192B0B03D2B78CFDD xmp.did:058011740720681192B0FBBF273EF816 xmp.did:0580117407206811A440DAC4D3AECDA0 xmp.did:0580117407206811BCD78B457D78A81D xmp.did:05D444BCFE64DF11A64FA7B28D390DE9 xmp.did:0605C7F9D822681195FEA4354762D610 xmp.did:06801174072068118083B98A8E501C2D xmp.did:0680117407206811822AB1921B4CF57B xmp.did:0680117407206811871FC852CC88A456 xmp.did:06801174072068119109B5757D1049F7 xmp.did:068011740720681192B0F8CAB850210B xmp.did:0680117407206811931DB3FBE9BC56F2 xmp.did:0680117407206811935398A7741CF40E xmp.did:0680117407206811A613B4EE39B4D58C xmp.did:0680117407206811B1A48ACCC66BA1E0 xmp.did:069AC01433C211E0AA8582F7083052C8 xmp.did:069E61B2CCB211DFAC2D95EB3860F061 xmp.did:0764F0FC39206811920BD6CB55DF7E21 xmp.did:078011740720681188C696DC609994EC xmp.did:078011740720681188C6CAC5BEF2CC51 xmp.did:07801174072068118DBBE31A192FEEDC xmp.did:07801174072068118F6288F23A50D5DD xmp.did:07801174072068119109DDBC5677155C xmp.did:07801174072068119457905C16F6CCBC xmp.did:078011740720681197F3DAD110AB1D7D xmp.did:0780117407206811994CC7F0B5403F08 xmp.did:0780117407206811A72CF339EEA0CCAD xmp.did:0780117407206811BEB789E23D201984 xmp.did:07A9EBB69ED3E211944AEC6650246579 xmp.did:07D85B194F21681188C696DC609994EC xmp.did:08084073AF60E011AFA79E3A4F01158E xmp.did:08801174072068118083DB8F1A026FAD xmp.did:0880117407206811871FB03D861007B1 xmp.did:0880117407206811871FFE11C8ACA7AE xmp.did:08801174072068118A6DE3227BBC4D54 xmp.did:08801174072068118F628C5BC7FF1E1F xmp.did:088011740720681192B0B191B1BF16B7 xmp.did:088011740720681192B0BCCE1816D9E6 xmp.did:08801174072068119457C4C657E622B8 xmp.did:0880117407206811A195E33BF38323D9 xmp.did:088D6ED2437011E088D29E4C0233231A xmp.did:088F6FA571206811808383758E6AB92B xmp.did:092C276A5DF411E0A80E8127450A213E xmp.did:0980117407206811871FD8AA5A0491ED xmp.did:09801174072068118C148FD8AA42D93B xmp.did:09801174072068118C149339A6CC4AB2 xmp.did:09801174072068118F28AC14F3A6738D xmp.did:0980117407206811994CE07EFE756DA7 xmp.did:0980117407206811AEE4ECC20A5D0880 xmp.did:0980117407206811B1A4F894E8A7A910 xmp.did:09B542E7BA21681188C696DC609994EC xmp.did:09F76F48C3C7DE11925FE106D59B22C8 xmp.did:0A368DA92F39E0119258DF6378E0E372 xmp.did:0A45DB531F206811871FBF7EE03058F8 xmp.did:0A483A276D2068119457B4E8E216C3A8 xmp.did:0A80117407206811871FBF7EE03058F8 xmp.did:0A80117407206811871FF47DC91DE11F xmp.did:0A8011740720681188C696DC609994EC xmp.did:0A8011740720681188C6C5D9DC520BD2 xmp.did:0A801174072068118A6DC5C740EBC4EC xmp.did:0A801174072068118F62E601B48A9F82 xmp.did:0A80117407206811A613B4EE39B4D58C xmp.did:0A89FF8AE8A8E011A816A106ECD60EAD xmp.did:0AC317AD1A206811871FBF7EE03058F8 xmp.did:0ADB599167FFE1118B1EEAD46BB4F8D0 xmp.did:0B45DB531F206811871FBF7EE03058F8 xmp.did:0BF11FD1DE22DF118E04DE7FDFD8DEB5 xmp.did:0C0EFB7E5C99DF119F378A3C59214966 xmp.did:0C3F353F2167E2118D30DED9691A214B xmp.did:0C45DB531F206811871FBF7EE03058F8 xmp.did:0C483A276D2068119457B4E8E216C3A8 xmp.did:0CCF6644C8A6E011979696CECC20A286 xmp.did:0D18F7379D3EDF119B20E8B33AC24173 xmp.did:0D34739667206811871FBF7EE03058F8 xmp.did:0D3C41E10BBCDF11B749FA66D2EDAE0E xmp.did:0D9A9BFCEE7FE01182DFD33A26DD6908 xmp.did:0DC2B982FBA5E011A4FEE67DFDD7FB36 xmp.did:0E2330CF1D206811808394B683B79160 xmp.did:0E2383CC272068119109827B1118762F xmp.did:0E2AC53BD72168119109CA2496A1ABE5 xmp.did:0F30D59357C8E011BEF0A37AC8AFF6B8 xmp.did:0FC317AD1A206811871FBF7EE03058F8 xmp.did:100823B1CB0FDF119A0D9CB73A16B779 xmp.did:1085A4F83DD011E0A5E4E63061587FB7 xmp.did:10C249B651206811AE568088196B6FA8 xmp.did:10CF6644C8A6E011979696CECC20A286 xmp.did:1134739667206811871FBF7EE03058F8 xmp.did:119A01FA9E2068119022D6BA6E344F5A xmp.did:11CCEBCD14A9E0118060BA4CC79A319B xmp.did:11FB407FDBE5DF119CEFD33EC3DF08E5 xmp.did:1282A8B04D7611E19390BDCF62603736 xmp.did:128BC47B2F20681180839613FFBBFAAC xmp.did:12B6375A0E206811822AAEB57B3841C0 xmp.did:12D5329AFEC7E111863086AF44B50601 xmp.did:12ECDFCC6918E0118317A5126B184C9C xmp.did:130F0792073711E2A496EA31311299BA xmp.did:13B748432EA2E0118D04E5AB37155918 xmp.did:13ECBBB17E1CDF118D4EF1C33EDDA687 xmp.did:1437CB2E34E9DE118EC4B76DFBF31F4B xmp.did:1439D15279D511E19671E44CBD77ACF2 xmp.did:144C62F9830311E0B62FB7127DA0FEAF xmp.did:146C32C21F2068118A6DB4DDC650E5F6 xmp.did:149AEF289F20681192B0A9A85A8A7D16 xmp.did:149C8558F373E0119389FF7D0DABFC0C xmp.did:149C96F760EBDE119BC8F1569F9CED01 xmp.did:154F526AB7FCDF118B1C8E78BC400721 xmp.did:1588ABA64B7EDF118BB3FD3FFFE50FBC xmp.did:15C2C46649B2E011BC4B89489F74C31C xmp.did:15C9895284D3DF11B5A1BCED77057419 xmp.did:1630586DC9E3E0118D4BE9BCF87F398E xmp.did:168BC47B2F20681180839613FFBBFAAC xmp.did:16B5EA561C21681191099A139FF76C18 xmp.did:16CA07E609B011E28169E3EC62F75B6B xmp.did:16CE2978BF2BDF11B1C9D5AA7FB5335E xmp.did:17385DBEFB20681188C696DC609994EC xmp.did:174FAB68C1B3E0119D60EAD8B0E55DEB xmp.did:176A42696DCCDF11B4C780F3440113A1 xmp.did:17D4795219206811994C9AA37B1758FD xmp.did:18407EA49F74DF11B9ADF501B1FEEC5B xmp.did:18503ACC11206811A7BADD5938E42519 xmp.did:1887D09300216811A056AC0239505D2E xmp.did:1898268C5597E0119487CB48DC3DD8DC xmp.did:18A6A5FAB913E01180DACEB1E4B080FC xmp.did:18AE44CEC0B7E1119D49E3B95737C8E4 xmp.did:18E040BF726B11E096478444BF297328 xmp.did:18F1103E54C3DF11AAE49CD88AA644AB xmp.did:18FE1CEEFD20681188C696DC609994EC xmp.did:192D77D2771011DFA0818C96C5DDB083 xmp.did:194993840129E1118B6683AB8BA184CC xmp.did:194FAB68C1B3E0119D60EAD8B0E55DEB xmp.did:1990B25A12216811871FAE052E76F513 xmp.did:19AC502341206811808386281F38E783 xmp.did:1A0AA41B6576DF11A0EA8D814D891314 xmp.did:1A4FAB68C1B3E0119D60EAD8B0E55DEB xmp.did:1A6A210EBD21681188C696DC609994EC xmp.did:1A87D09300216811A056AC0239505D2E xmp.did:1A94536A323A11E0A7B8D76BEBDDFBE4 xmp.did:1AAC8D2DA296E011AFA59308968A047F xmp.did:1AB777227629E0119AD1B945C1964BAE xmp.did:1B1EFFEC6313DF11A719F1AF52661082 xmp.did:1B2999A3ADA1E011874FF440FF7753C4 xmp.did:1B4FAB68C1B3E0119D60EAD8B0E55DEB xmp.did:1B61A465988DDF11B96ADBDD437880CB xmp.did:1B8BC47B2F20681180839613FFBBFAAC xmp.did:1BD6A30692A8E0118BA8F2782CB3F003 xmp.did:1C01C42FF620681188C696DC609994EC xmp.did:1C03146227226811AF6F8C15B6994DA7 xmp.did:1CBB581A2D2268118DBBFC31635E93B6 xmp.did:1CCF6619A3A8DF11B402D829E1AF718C xmp.did:1CFE1CEEFD20681188C696DC609994EC xmp.did:1D012E9EC9C3DF1190EED90E3B79DA34 xmp.did:1D06EF8E726B11E08CB3DF7C657CD3E9 xmp.did:1D2B29771E28E211B066F17E0191D7A7 xmp.did:1D51DAA7222268119109F828D8DAF436 xmp.did:1D541901DF4BE011B3A2B8E9249F1B48 xmp.did:1D6E4373AC5FDF11A68ED251FF23EC34 xmp.did:1D794D3196A0E011BA5FA492FDC2C4B6 xmp.did:1DDB5A635CD9E111ADE6B0E234903112 xmp.did:1DED8CFF57BBDF118185E1BC98F91251 xmp.did:1E01C42FF620681188C696DC609994EC xmp.did:1E059DA44734E011AD25903082F159FB xmp.did:1E7E6F2C19E8E1119DFDF0AAA80BF1AE xmp.did:1EC0AD1472DFE011BAC7F7CD194FE1BE xmp.did:1EFE1CEEFD20681188C696DC609994EC xmp.did:1F7560349B4011E192EFD39D50A0C01E xmp.did:1F7560389B4011E192EFD39D50A0C01E xmp.did:1FE3A640427AE011A4D3C40ADA3B0913 xmp.did:1dc90e95-4b92-f94a-ac77-2889352f001a xmp.did:20954B6E3791E0119DE0C72DBAF511EC xmp.did:20B881312B20681192B0EDAAC00D9FEC xmp.did:20BB8F69102168118DBBBB77ECE750CC xmp.did:210C18881B21681188C696DC609994EC xmp.did:213D01546D8911DFBDD584DDC8C95BF8 xmp.did:21491BAE758111E0B7A8BCCDCED631CB xmp.did:215D6A12242AE1119583FD4A981E0514 xmp.did:219911BF2F6BE0118B53B756951DDF56 xmp.did:21BCF77D6204E2118B88C0833978F058 xmp.did:21E4C91A9F9EE011ACA098E241098547 xmp.did:220C18881B21681188C696DC609994EC xmp.did:2325628D6A59E011A4FAF43FA448DE9C xmp.did:23301B1D792068118083982FE4C6204F xmp.did:233270CDBA206811BAC7A817D1EDAD8E xmp.did:233CDBFC62BFDE118D6FB67E48281758 xmp.did:2425628D6A59E011A4FAF43FA448DE9C xmp.did:249077570A206811910986D9CD6AC386 xmp.did:24DE300A77FADF11957CB6C8F2BB99C0 xmp.did:250F37FDBE65DF1196A2E5386EB7EFBF xmp.did:252A728E65BBDF11B714F0C6E94ABD01 xmp.did:253270CDBA206811BAC7A817D1EDAD8E xmp.did:25481FF6A7206811B560FCE792BD8256 xmp.did:267A70FFD257E011A551F15593603B5A xmp.did:2749DAC169E0DF11BAE2A9F4FA1C730E xmp.did:27C109D5ACDEDF11BAACCFE187E6E735 xmp.did:282F44E5EFE9DF11A2C6F6A60B573B0E xmp.did:2868824E9A24E111AC0CEB2D40DBE528 xmp.did:2877DFF125206811871F92C91D0752B0 xmp.did:28B3672D7767DF11B32EB6BE29A22260 xmp.did:28EEA9B79AD5DF119648F8511B7417D3 xmp.did:2928DC004423E01199ECC9B0A3B730D7 xmp.did:29339019AE55E0119C03A862C7BF6F88 xmp.did:295BA0A36A76E0119CA1815ECAD13ED2 xmp.did:298B4D5D11206811920BD6CB55DF7E21 xmp.did:2A2118970D2068119109FC901257E622 xmp.did:2A3D854F0A2168119109FB109986C91C xmp.did:2A7A21AD11216811994C80DBF724891C xmp.did:2A8DADA9201EE011842A99364FEBD0F6 xmp.did:2ACF258E325DE011A1A5CBD15F1C5D8A xmp.did:2ADE300A77FADF11957CB6C8F2BB99C0 xmp.did:2B0FAC131420681188C69B8C88BD3CC1 xmp.did:2B2824FB28206811822AFB3366404E54 xmp.did:2B47F7FACE8311E1A4CCB1433E3CE3F6 xmp.did:2B49DAC169E0DF11BAE2A9F4FA1C730E xmp.did:2B8CEC4A9C5BDE118525ADA73261E261 xmp.did:2C46390A7D4911E0A66DC919951D3F2B xmp.did:2C514E4873D111E0B183883F507A6AA6 xmp.did:2D0FAC131420681188C69B8C88BD3CC1 xmp.did:2D49ECD639CEDE11AC1FBF9D231E361F xmp.did:2DA2E4C6F3BCE011B0BBD5E3244285CA xmp.did:2DF8BDAF08206811A056AC0239505D2E xmp.did:2E229BE45760E0118647B4BD29669B78 xmp.did:2E53E9854520681180839B699B907CBB xmp.did:2ECF258E325DE011A1A5CBD15F1C5D8A xmp.did:2F0FAC131420681188C69B8C88BD3CC1 xmp.did:2F290AB9132068119109C80A4C3147BC xmp.did:2F9782BF00C8E011BEF0A37AC8AFF6B8 xmp.did:310FAC131420681188C69B8C88BD3CC1 xmp.did:31552C38272068118A6DC2EB5CD0A707 xmp.did:31C6EDB7352068119109A05ED6E5C9B4 xmp.did:321F17924B3268118DBBBFECFBC2A23E xmp.did:32DAAC512520681192B0BE8DD628D238 xmp.did:32F018B31320681192B0C09A9F8F6D74 xmp.did:330FAC131420681188C69B8C88BD3CC1 xmp.did:331A1DE61120681191098946CB8DAAB6 xmp.did:332CDACA9F206811994C8A8243CF6DD5 xmp.did:340EF1E17A20681188CCC0301896C619 xmp.did:34171119382068118F62CFDF647A2B49 xmp.did:3424F194212068119457A748E286EBA1 xmp.did:3430CAFA0B2068119109A05ED6E5C9B4 xmp.did:3469A8DF112068118DBBCC81981F930D xmp.did:3516E9E994E1E2119625E9EBA0C6BB67 xmp.did:353C7E32B620681192B0FA0C0917E462 xmp.did:355FC8B3671FDF11BBA3AE65F667B488 xmp.did:35E359430B2068118083F09DAD716619 xmp.did:3604BEC6044DE211AF57E606ADDDD0FB xmp.did:36142865952068119109E554154D32B1 xmp.did:36232F4D813ADF11A89FA523901B3490 xmp.did:363A8F868D206811BA24F97E9D027B47 xmp.did:36750d82-6ef4-cf46-86db-3a8aba33e5ad xmp.did:36AF18290C206811BC56E1514E765539 xmp.did:36C863DBD4DAE1118CC1E0C7CE6212AF xmp.did:37108FD0D25811E08013A15AD7E5F089 xmp.did:3777AD23C143DF11AF0CE727C9EFF862 xmp.did:378FF16EB8A8E011A816A106ECD60EAD xmp.did:3804A6C3B853DF119FF2EB1981619B1F xmp.did:381562C4082068118083FEE20518A8E1 xmp.did:38157EBE224FE011B047D7F07BD7BBC0 xmp.did:381BE30EE535DE118F219ECC9DE4732B xmp.did:382F6AAEE32168119109CA2496A1ABE5 xmp.did:3888163F0820681188C6D9EA900BA018 xmp.did:3892E408BD53E0118E47D5B457BBAED7 xmp.did:38A0129A8F21681192B08499B73FEA31 xmp.did:399DEF2EF1E9DE1183AEB319878DB4AA xmp.did:39BB885782216811BFE5BF57D4DB04A4 xmp.did:39BF5BD6C8E111E19D53A1BD4566F6C5 xmp.did:3A3CE7F335206811B311EBA70FD71192 xmp.did:3A62EBC4235111E0B173A65C0EC2E2AC xmp.did:3A6850363F8DE011A68BE05DED48B03D xmp.did:3A6CAF272B19E01184DD8FBD11034008 xmp.did:3A76783CD0A8DF11B2A19D50FF21B8D9 xmp.did:3AFBCD36732068119457B4E8E216C3A8 xmp.did:3B612268DAB6E01187C39E0D90EB37B5 xmp.did:3BBE07725E2FE0118BCEF3BA41E893A3 xmp.did:3BC6CE12C370DF11850CB72DB9D2CB92 xmp.did:3BDD977B1F2068118F62F4555C5E84BE xmp.did:3C17D9B5007011E0BAA5A546D65C57CC xmp.did:3C3603469AD511E08F0ABD72ABEC7BC6 xmp.did:3CBB494529D1DF11A5339ABF8266E818 xmp.did:3D02E62ADF8CDF1181DCCB8E8B77F31F xmp.did:3E3CE7F335206811B311EBA70FD71192 xmp.did:3E4901925221681188C696DC609994EC xmp.did:3E51E265833FE011AA6A8DA7AB0A81D0 xmp.did:3E8A102C200C11688442D886113E168A xmp.did:3EBA6728D72168118317ABB614DA433E xmp.did:3EE476995A28E0118FEFFAAC272DD9E7 xmp.did:3EEE2DB5B07FE0119FBDB1C3DCB285CD xmp.did:3F2840BBDAF4DF119B9FED66B6875A77 xmp.did:3F4901925221681188C696DC609994EC xmp.did:3F727C802A20681188C6D9C4D0AF0270 xmp.did:3F88163F0820681188C6D9EA900BA018 xmp.did:3FA591860E20681188C6AAF8EEECA0D4 xmp.did:3FB9609F5BA7E011979696CECC20A286 xmp.did:3FBE3CFB20206811A472E9C34FBDCB1B xmp.did:3FFF88B42320681180838C2BD51DE762 xmp.did:4064AC52F1A0E211A8259619CE1CB52B xmp.did:407BA1D2DE21681188C696DC609994EC xmp.did:40F5E85E7ECDE011A9998254DA7B207E xmp.did:41144A9F5CBBE011A9CDC1CC5A8545F0 xmp.did:41178B8188D4DD11BF828F18DEEAE683 xmp.did:41225C25162068118083E4CA328882ED xmp.did:41A8D9E589206811871FBF7EE03058F8 xmp.did:426956A63C7EDF11A5A4E9065FAC704C xmp.did:427629EB1F7AE011BC6ADBE9D9257556 xmp.did:42909406645FE011964FE99A58EBB358 xmp.did:42A169505720681188C6D9EA900BA018 xmp.did:42A8D9E589206811871FBF7EE03058F8 xmp.did:42B79C4D1720681188C69E9C0DE8906E xmp.did:42C8435B1F206811A9619D3E69A42F4A xmp.did:42CBEF71662268118F62F8E68BACEB90 xmp.did:42DD52B8322068118F62C099F7DFBA1B xmp.did:43487F5815BCE011B0BBD5E3244285CA xmp.did:441E8B361020681188C6D9EA900BA018 xmp.did:44569F2270206811B540D1205A8C4334 xmp.did:44972308022368118A6DC7B27BABA40A xmp.did:44BA610FF715E011850FA901B4C1B675 xmp.did:44C7E966DEACE01186C0EE0104E410A1 xmp.did:450652A0D25811E084B2FC8CD418D5A2 xmp.did:453680A25EC9DF11A86DDD161CFCEB0D xmp.did:45599B5D3BDFDF11AD98D0CC567A99E5 xmp.did:4582F7613448DF11AD0C84D94E5D43BD xmp.did:4590A1312920681188C6D159E68FEEFA xmp.did:45BF49C464C8E011BEF0A37AC8AFF6B8 xmp.did:45F62045FF1CE211BF1CBEAB02877C54 xmp.did:4618A328212068118DBBA997D43539B9 xmp.did:461E8B361020681188C6D9EA900BA018 xmp.did:463C55EC1F206811871F9753D344F7A3 xmp.did:4640EA1197DCE1118E89A806EF65A4BF xmp.did:4667C1F29B4411E192E9FD709E2209FE xmp.did:467C5988B9DC11E1A387A11AE8020488 xmp.did:46A95EEE9FBFE011B0BBD5E3244285CA xmp.did:46AB7E0D2730DF119042AD88AD5F9FC9 xmp.did:46BD6B5B42206811871FBF7EE03058F8 xmp.did:46E39520AEB8E011AEBCBCB1E3A15768 xmp.did:46FDAC28978AE0118DBED2E4485D9FF1 xmp.did:4723CCE5234BE111AC6CE507506EC647 xmp.did:4758DFE9017C11E1937E8BD9211F1F0D xmp.did:4804CD8307206811AE56F87BB2B8114A xmp.did:480B7E46AF78DF11A825CF8DE5D91DF7 xmp.did:4814DD170A21681188C696DC609994EC xmp.did:48947023BB4EDE118DE49E2CFEB84DA0 xmp.did:48F5EFE5AE80E0118A91AF6880B6674F xmp.did:4948814585206811BAB9848BFF04B50D xmp.did:496823831E2068118F1CFECA782915C6 xmp.did:4978DD280123681192B0CABB2874AF0C xmp.did:49BC7A4F35206811B311EBA70FD71192 xmp.did:4A83F1387620681197A5B53B0C75C963 xmp.did:4B04CD8307206811AE56F87BB2B8114A xmp.did:4B12AF1A50216811AF5C82C8D4EEE19A xmp.did:4B5C4472412068118083BAFDA65F8430 xmp.did:4C4949F6B82ADE1195A78A8137920439 xmp.did:4C4D4D899EF7DD1180199D0A99EB683F xmp.did:4C51B774A17011E0A528DEF2AC8C55C6 xmp.did:4C8C79BCDBF8DF11A111C57C46790BC9 xmp.did:4CA1D100CDC1DF11AAC7DEF7E9EA2229 xmp.did:4CDA76DA3520681188C6CC41240299E2 xmp.did:4CF62045FF1CE211BF1CBEAB02877C54 xmp.did:4D15C4DBB82BDF11B1C9D5AA7FB5335E xmp.did:4D46A20FF75AE011817EF430ABC94196 xmp.did:4D5C4472412068118083BAFDA65F8430 xmp.did:4D92A42A4AEEDF119356EE6A667C05DF xmp.did:4DCB8A30914DE011BD63DE0802894CA1 xmp.did:4DFE631B1C2068119109D986A10A20A5 xmp.did:4E15C4DBB82BDF11B1C9D5AA7FB5335E xmp.did:4E2A12FF272068118DBBF1E759913209 xmp.did:4E5BCDD097A8E011B01BA4DFDBC23FA5 xmp.did:4E8F42D203D811E190EB8FF8DF0840C7 xmp.did:4E96D8071320681191099262B251A4F6 xmp.did:4F0CFAAE632568118DBBFC31635E93B6 xmp.did:4F2FBD5B3833E211ABC1ADC0DA5AC883 xmp.did:4F6BB8702C206811871FE169E7DC3C98 xmp.did:4FDD2F6FA22BDF11B1C9D5AA7FB5335E xmp.did:4FFFE781FC0CDE11A770A9ABB3D9137E xmp.did:500A9AE2DD206811A613B4EE39B4D58C xmp.did:501167C17451E0119063CB825D612016 xmp.did:5032E746EBDCDD118BB0ED485B2406E3 xmp.did:5046D02657E8E0118873D8CABF5B9B31 xmp.did:505381322485E011BD3DE9624629426F xmp.did:50A9D158862068118C14FC1C697D6C64 xmp.did:50F0464C0C2068118089E259502D6AC2 xmp.did:510B91F3AB2068118A6DF9D78C0F9B15 xmp.did:51546FDD1320681192B0BAA904DE0F8D xmp.did:51B82BC8222068118A6D8F7F76AB4DDC xmp.did:5232646C26CBDF1190EAEC1F0BACD3F2 xmp.did:52910D990C206811A961A044C143500B xmp.did:538F8AD33C23681188C6E3B2AFCF6608 xmp.did:53D2627EE32911E08A618A5AC5C07AD7 xmp.did:543A798F1307E011846FE8C04D3C8DEC xmp.did:54546FDD1320681192B0BAA904DE0F8D xmp.did:5489D78E1966E111BC68E08AF29E25BD xmp.did:5496D8071320681191099262B251A4F6 xmp.did:54BF11E22DCBDE11AC1FBF9D231E361F xmp.did:54C3F9F8BDAEDF11A5DC959C82ABC9E1 xmp.did:54C6CCC48F7DE0118A8F80BF7355E0D1 xmp.did:556E056A4621681188C696DC609994EC xmp.did:557C42AE992068118F42CFE2A9EBEA82 xmp.did:559FCD3B527ADF118914DEB1351761F1 xmp.did:55C093961E2068118083EBC7D6F18424 xmp.did:55E2C85D50B911E09B45EB5D6BDA9918 xmp.did:560A54489961DF11BEE9B786BB033420 xmp.did:56BF11E22DCBDE11AC1FBF9D231E361F xmp.did:56EAD66EECEDE1118EBDD2792BC326D4 xmp.did:56FD0742357AE1118349FA99D447291B xmp.did:57729B10F02BE111AF198DCAA3F1E75B xmp.did:577969B29D5011DF8B1491785F4DE9BB xmp.did:57BCD4A3F738E3119802BE982B1502BD xmp.did:58316A45F5F5DF11807F8C8A28F8A117 xmp.did:583BD1F31720681191098946CB8DAAB6 xmp.did:586276373B20681197A5ABE98A388C5F xmp.did:58F757F1372068119109E4A43CE530D0 xmp.did:590D834E29AFE011BB50818B7E198924 xmp.did:593E6CA71120681188C69B8C88BD3CC1 xmp.did:5A4523D4BAD2E1118B12B8550F44D456 xmp.did:5ACA778625C1E01180B9D22014B81B82 xmp.did:5B00864E4767E01197F3F9B0477D6229 xmp.did:5B3E6CA71120681188C69B8C88BD3CC1 xmp.did:5B6DD2B74584DF11B7248B7DDF794A1A xmp.did:5C146AA32C206811871FBF7EE03058F8 xmp.did:5C20A878E3246811B4F2E4B54918CE3A xmp.did:5C810BCA432068118F62F8D9147DC05A xmp.did:5CAC3B5AF977E011AC53A76EEAD13040 xmp.did:5CE96B67222568118DBBFC31635E93B6 xmp.did:5CEC9C6EC13DE011A0BEF8DDCFC32D6A xmp.did:5D0CDBD57F76E011BA3CF330558605BE xmp.did:5D3E6CA71120681188C69B8C88BD3CC1 xmp.did:5D7E93F5833411E0B62FB7127DA0FEAF xmp.did:5DE7C465E499E011A42DEC14C3EFCAEC xmp.did:5DEA28BF0A20681191098CDF369CA920 xmp.did:5E1C88E1FC20681188C696DC609994EC xmp.did:5EC857194DD3E0118BBCBA5E7FF86AF5 xmp.did:5ED080139B4011E1BDF8AB7E2919F0A2 xmp.did:5EF6E033572FE011A924FF15510F1797 xmp.did:5F0079D829206811B1A4D56600D919C7 xmp.did:5F2CF7595D206811994CE68A7A8A9137 xmp.did:5F4BFDF37F1ADF119CB8E7D742FA3A25 xmp.did:5F8E58AB66AEE011BB50818B7E198924 xmp.did:60640A5C5826E01182CAD38ECEDCE268 xmp.did:610079D829206811B1A4D56600D919C7 xmp.did:61850AFCE49011E185D9D5AC343CED4E xmp.did:628A8AFA8D1211E192BFBBCE8C7D6A8D xmp.did:62D01CE14BF911E0A0A08DC280149321 xmp.did:638880E80920681192B0BAA904DE0F8D xmp.did:6395943583CBDF11BAF5EC302DA3E9DF xmp.did:639B1DD297D5DF119648F8511B7417D3 xmp.did:63AEF9105305E011867F89B0211E4F7A xmp.did:63B9DF027F206811871F80898A1CC3A1 xmp.did:63C7F7A61E20681192B0E03D46CBFB2F xmp.did:63F09B6B8525E1119CDAE92B716695D8 xmp.did:6474C83C687CDF118E1F99D69B3525CC xmp.did:647F1DD60621681188C696DC609994EC xmp.did:648880E80920681192B0BAA904DE0F8D xmp.did:6494CD194F206811871FCD2199AD167E xmp.did:649D06DE7020681188C6D9EA900BA018 xmp.did:64C6C5C839CCDE118040C244BCAE0AC0 xmp.did:64D83FC593206811871FBF7EE03058F8 xmp.did:6515EC6E98206811994C86814C2F3017 xmp.did:653E4C94DD2068118F62D27A6BCE2F0B xmp.did:659F34731BCDDF1191BD97C1AE6A08AB xmp.did:65E9662A8496E1119889E2A76909DC02 xmp.did:6625348F6D43E011B1B5DB40F0283379 xmp.did:664D5C459C7711E08A9C913C073A663E xmp.did:66562D8A30206811822AF66E54970861 xmp.did:668880E80920681192B0BAA904DE0F8D xmp.did:66BCB3B7EAB9E011AEBCBCB1E3A15768 xmp.did:6735706A402068119457C4C657E622B8 xmp.did:677E60494F2068118DBBE52260A278CD xmp.did:678880E80920681192B0BAA904DE0F8D xmp.did:68033E32A59611E0AE7E90E1E54CD6BB xmp.did:6859A8AA4C20681192B0C49A4A67C7CB xmp.did:686C661626206811871FBF7EE03058F8 xmp.did:689B1DD297D5DF119648F8511B7417D3 xmp.did:68C8EE3EEBABE0119875CB404E826AAC xmp.did:6966F9529C23E011BDF9E30C5CFEECDF xmp.did:69993D007926E111864098E5E4DF3557 xmp.did:699D06DE7020681188C6D9EA900BA018 xmp.did:69B2F9191F20681194578A02E8C9B59B xmp.did:6A15AFA28B206811871F8DE1CBDF9EB0 xmp.did:6A284E091A29681192B0D53FF790F85B xmp.did:6A47007B82A4E011A4FEE67DFDD7FB36 xmp.did:6AE4DB37096FDF11BD60EAD4B082D434 xmp.did:6B159B20C5ACE01186C0EE0104E410A1 xmp.did:6B43DD71B9D011DFA897EC2DD419EB70 xmp.did:6B6A135A9DB911E1A8FCB9DED824DBE6 xmp.did:6C5A013B2B216811910990FE46E80D18 xmp.did:6CDE07D55E20681198E99BCF30868C79 xmp.did:6E282DCA7F17E011B0739866E9AD0C81 xmp.did:6E7CD2CED77BE011A60BCDD5CBCAB985 xmp.did:6E843CF8437011E088D29E4C0233231A xmp.did:6FAD2A5D0E20681188C6D9C4D0AF0270 xmp.did:705B30E088F611E083F782CBB1D50FB1 xmp.did:7089C6CFC8B5DF11820885489254C0E7 xmp.did:70A31406DF206811871F81E8BB0F82E6 xmp.did:70D3233031206811871FBF7EE03058F8 xmp.did:710A7400A8EBE011B976D593E6469015 xmp.did:7125C99E1320681182FE98EF7F18BF1D xmp.did:7138CE366F61E111A5F0E9A958BBD36C xmp.did:7162A10113206811871FCD2199AD167E xmp.did:71BF4AE7B28EE1119DACE15551E8B269 xmp.did:727318241C16E011A6BDE351CD2F170F xmp.did:73433320EF38E011B0A3AA87FCB13408 xmp.did:7360C3BF8D206811B6999C6B4BE18F8F xmp.did:73835F56AFD3DE11AE11874F0DDFD12F xmp.did:739D7E9FEBADDF11AADEADA356222083 xmp.did:73B57231C3E9E0119FC8E3CA42FCF1AC xmp.did:73C5D4E7ECA7E011ABD49328F4BC62FE xmp.did:74117FF720071168B4F2D4360359303D xmp.did:7437D61FD021681188C696DC609994EC xmp.did:74F33ECEDBBADE1191609FD758966D64 xmp.did:753A28DD3120681197F3DAD110AB1D7D xmp.did:756A1C8AD8AFE111BCB0C7DF566281B3 xmp.did:759EC5FDBF66E11192B4D50FDFA7DCBB xmp.did:75DEDC25312468118B72DE2C6B104274 xmp.did:75FC7CDC7B20681188C6D9EA900BA018 xmp.did:7631A3109686E0119D98C2D90B3468EC xmp.did:76857F743F20681197A5E7B0831EA4A7 xmp.did:777A8B8D2CCEDE11AC1FBF9D231E361F xmp.did:77FCDCFF0C20681188C6C677A3826B0E xmp.did:7841B3F958A3E1118EE39C2C7AC22163 xmp.did:788200B33261DF11B38F998875CC8654 xmp.did:7925336F792068118F62FB2F86618C29 xmp.did:799A288FE48E11E185D9D5AC343CED4E xmp.did:79CD63DC242AE111A211D8B9742EBC10 xmp.did:7A7A501C1F206811871FE0E4CB6C52AC xmp.did:7AC1A8E47A206811BA24F97E9D027B47 xmp.did:7B043B7D7321E0119D96D946FB4715F7 xmp.did:7B24B5768A72E011938DBEF8D25B6A28 xmp.did:7B29C0F54820681188C6D9EA900BA018 xmp.did:7B78254BE0AEE011853D816FB98ABCA3 xmp.did:7BD2A7176C34E01183C188C0B0DA4CAA xmp.did:7C3E01E7621EE0119FA7EAA9BF1AC2FE xmp.did:7C6F110A13F4E0119A97C6F5F7FD5B9F xmp.did:7C702F8623CEDE11AC1FBF9D231E361F xmp.did:7CDB0AA0EC0011E08BAADF41A5DFD597 xmp.did:7CE9741F22206811AE568088196B6FA8 xmp.did:7D4E139D1885E011BD3DE9624629426F xmp.did:7D5E1B8AEAEFDF118A9DAF75AAD34E89 xmp.did:7D5ED72279B111E19AF3D57CE9DEB3C9 xmp.did:7D5ED72679B111E19AF3D57CE9DEB3C9 xmp.did:7DEF14247280E0118A1A98C5FA0DA4D2 xmp.did:7E30378069FC11E18753C48E566371BB xmp.did:7F6D26F1E2FEE0119C6ABCC0BC7488E3 xmp.did:7F9C53A211206811ACB683AE4DE260D1 xmp.did:7FBFAB2ACFDBE1119E848C69D255D3A5 xmp.did:7FD93A5FBF57DF11A6E5DB9F6F6C55FC xmp.did:7FFFA217A653DF11872EF9A8EFC0E527 xmp.did:801A5C852C20681180839613FFBBFAAC xmp.did:804007CE2420681180839613FFBBFAAC xmp.did:8059655B2C2068118F62CDC0FFB60C81 xmp.did:8078365AE76F11E18533F1ECFAB65801 xmp.did:80C93B4FEB3111DF9C439A7A28CCF362 xmp.did:80CE0A53F2FBE011BE70F7A2A05D4BEA xmp.did:80F11D74C0D411E099C8954F847EAFAE xmp.did:8137BCB2E609E011AFBBDA0630995ED7 xmp.did:8166F94F8E5ADF11B2A8D5C54226B8D0 xmp.did:81BFAB2ACFDBE1119E848C69D255D3A5 xmp.did:81E1AEF49B09E2119BAAB0C9C55048B7 xmp.did:820E24D92B2068118C14B7428F978057 xmp.did:8210FDB3082068118A6DAF67FF497528 xmp.did:830B9C46982568119109AFE3CF4AF35A xmp.did:832892B8412068118F62F71255CC48E7 xmp.did:833C8CE42459DE11A76AB674739B3094 xmp.did:838372649821681188C696DC609994EC xmp.did:838BF2091320681188C6B205E89566F4 xmp.did:83B41E2DDE55DE11AD63CFBD010DF686 xmp.did:83EB4BDCEEC3DF11A03DE80758667799 xmp.did:841A5C852C20681180839613FFBBFAAC xmp.did:842F757B8120681188C688F5D09384AC xmp.did:84C76E5CA61EE0119B62C1A72CDDBB2D xmp.did:84C95075E3FBE0119B5AF02CBE935267 xmp.did:852600B68B8BDF1198968D8BFA9A0C11 xmp.did:85740B880E21681188C696DC609994EC xmp.did:859A4C2A202F11E19107DB90BFA0BECA xmp.did:85B2001FDBA8E1119FFCA576B484D989 xmp.did:861A5C852C20681180839613FFBBFAAC xmp.did:861CB129116CDF11A081DAC65549FFF8 xmp.did:865B2D5F46236811994CB5207DCDF24F xmp.did:86740B880E21681188C696DC609994EC xmp.did:86754CDB0820681188C6DA43C866EEAE xmp.did:86C08269482068119457C4C657E622B8 xmp.did:86D9306BCF20681188C68D6968983E56 xmp.did:87E33B19803811E09258D24CBD61FD3F xmp.did:88740B880E21681188C696DC609994EC xmp.did:88A1231164D711DFA6978521D60DF460 xmp.did:88C351403ED8E11186E3E883EB9255AD xmp.did:88EEB63969FC11E18753C48E566371BB xmp.did:891A5C852C20681180839613FFBBFAAC xmp.did:893835F45F0AE111AB6485CEEA28C3FD xmp.did:89C45F4A208ADF1195A9C4DC515AF3FD xmp.did:89DB88EE8521681188C696DC609994EC xmp.did:89E36FFA7D14DF1197C89C8FF17B2D44 xmp.did:8A101BFFC72068118DBBFC31635E93B6 xmp.did:8A63DD1700CF11E191B7E8D4874E87EA xmp.did:8A84CF9C69FC11E18753C48E566371BB xmp.did:8B90858FB573DF11BFBBF00759A3D452 xmp.did:8BD0CC8BD42268118DBBD37DD26DADFC xmp.did:8BD0EE5C653311E1B736BFACD3620D8F xmp.did:8C808E7F85DDE0119A5BC7203B0F52A5 xmp.did:8C8372649821681188C696DC609994EC xmp.did:8CFA6888BDC9E0118A1894B66E94A91C xmp.did:8D6BF2DD0F206811A8D69B0972D029D7 xmp.did:8DA18CE51B20681188C6E479C139F768 xmp.did:8E966105F320681188C696DC609994EC xmp.did:8F4DFE5AC221681188C696DC609994EC xmp.did:8FC93F7B2EAFE01191C6909159CD1941 xmp.did:9055651CDAA4E01197A1A65F7AE4791A xmp.did:90A1EB3B082068118603AD4B49AD7764 xmp.did:90BBF09D38B1E1119B1BDB5EFCD192A6 xmp.did:90C5D5266479DF11865CEEF09851FD79 xmp.did:90E47E696271DF118311B0C80F59CA13 xmp.did:911C7F2A8A21681188109F9973D46F2A xmp.did:9192FF6B0A4CDF1187C0E54B36521B89 xmp.did:91D03B52A2C5DF11AD408D720C5A42C7 xmp.did:91DB88EE8521681188C696DC609994EC xmp.did:91EE4B6BED92E211B157A76FBA09468E xmp.did:91FF051E0FD3DF11B2D1C51F59B5FB29 xmp.did:9260FA1A3E12DE118089D2AE8FA9A37E xmp.did:92966105F320681188C696DC609994EC xmp.did:92B423E31A2068119109BCD3F23227AF xmp.did:92CBBD15D6206811A7BAB1FC45DDAD2B xmp.did:92E4E5920A20681194098696425599BA xmp.did:92E577500821681188C696DC609994EC xmp.did:930C97C2BFABE0119DFF82FD9D6C9E81 xmp.did:930DD8B928206811AFFD97A6A7E489B5 xmp.did:944A847A363B11E0AEB2FFF11F63D948 xmp.did:94658B6B3B206811871FDB7C73EC7AF4 xmp.did:9497763E26ABE011979696CECC20A286 xmp.did:94BF7C8F16206811822AEEB3D886E662 xmp.did:95A96A28F3DAE111A7AAA5DE6EB18B89 xmp.did:95B2C65AB684E011ABCFE78D83B50568 xmp.did:95C2077600CF11E1B332971007A50C02 xmp.did:96058457A360E11188FC933E59052C44 xmp.did:96591BA8B7E2DF119A52D83C080E6159 xmp.did:9666F0B64C2568118DBBFC31635E93B6 xmp.did:9672422DDBCDDE11ABFAA0D8603A9AA1 xmp.did:967DD1DC2B34E011B6CDA8F0B2C213CD xmp.did:968CEE49372068118A6DC2EB5CD0A707 xmp.did:96925A4197C2E011B180E288B7389DB2 xmp.did:96A47FB56A1FE111952789A0D5E19759 xmp.did:96C81ADD14236811AF6F8C15B6994DA7 xmp.did:96C8249C6FFADF11B295A881C3F5AF4C xmp.did:96E44C36EE4EE01195F4B95F349B38BF xmp.did:97197485D51EDE119E659B86C3686744 xmp.did:973AB16794B1E011AF59B6057C510CF7 xmp.did:9785BA49DBDADF11B163E9831471534B xmp.did:984F950EB29DE111B056A6C58D1607AE xmp.did:98759349A621681188C696DC609994EC xmp.did:98C912840720681192B0E6C15935B3CD xmp.did:992CEF020B2068119109FEECB06854FB xmp.did:99343A4732206811871FE8DD2340C0B0 xmp.did:9A759349A621681188C696DC609994EC xmp.did:9A8FD6619B3CE2119925D9CC22BAEF70 xmp.did:9ACD98F7A9DFE011BAC7F7CD194FE1BE xmp.did:9B0BC90E76B4DF11A365EF5257762381 xmp.did:9B0C97C2BFABE0119DFF82FD9D6C9E81 xmp.did:9B4613316923E111B8D9F5BDE94825E4 xmp.did:9BA59F93AC206811B4CCE9880A1B4D83 xmp.did:9C34F11D8567E1119E03F98C97A3B1AF xmp.did:9C66F0B64C2568118DBBFC31635E93B6 xmp.did:9D764364F93FE1118D3AA6094BA023F6 xmp.did:9DA429A15120681188C6D9EA900BA018 xmp.did:9DEED1530021681188C696DC609994EC xmp.did:9DF1224211206811822AE3B9CDB16A6A xmp.did:9E1C987F773CE0119951FE9E21D95FD2 xmp.did:9E27C63DF158E2118D02EE5CB004327A xmp.did:9E4C6A750820681192B0FEBDA93E3C72 xmp.did:9E5A44A108206811871FE8C12D95F69C xmp.did:9E7D607C4F216811AF5C82C8D4EEE19A xmp.did:9E8FFCECBA17E111A00B91E6F524DF45 xmp.did:9EA1AF2B9358DF11BB73AF92DE6846CC xmp.did:9EC912840720681192B0E6C15935B3CD xmp.did:9EF7D92FC392DF11AED6A59B0EF71149 xmp.did:9F2C9CACEE0AE11186C29F7E56C3BAA4 xmp.did:9F822ADCF0D711DFBE96AA0FFE5462A2 xmp.did:9F822AE4F0D711DFBE96AA0FFE5462A2 xmp.did:A0546D104BC511E0B78A85AD4FD2359F xmp.did:A0704BB7182068119109F6AC020C5FF2 xmp.did:A0AFA84FD870E011B557BFCA0CAA97BB xmp.did:A0EED1530021681188C696DC609994EC xmp.did:A1A747644C21681188C6C2EFB22D669F xmp.did:A1AFD5E0A2F3E2118284B32F29535E66 xmp.did:A1C5E8639820681188C6A894A1D908BE xmp.did:A21F72567D09E211BDF3E77D7562D72A xmp.did:A23DA5AAD6B1E011A5629C3693D5C0CF xmp.did:A26263210D20681192B0B59A26F7999F xmp.did:A2B299F0726FE0118AC58FDA9DF5DA7A xmp.did:A2C2B76E1320681188C69B8C88BD3CC1 xmp.did:A2D86490D952DF11967E8720A676FAF0 xmp.did:A2F5C5F1E5CBDF11AD7D9A1023BE16FD xmp.did:A3501E239D2FE011A325D07E052CB137 xmp.did:A3A429A15120681188C6D9EA900BA018 xmp.did:A3B6ACD2D133E011B14D815C16B7C2CD xmp.did:A3F4D7821620681192B0C5319CB69C7C xmp.did:A41B25DD19206811871F850BE2F5A6A4 xmp.did:A48499331620681188C6D9EA900BA018 xmp.did:A48D36A70E206811822ABFFA029D9A53 xmp.did:A491E44BE6EFE011A72BC4DCA77C5A48 xmp.did:A4A429A15120681188C6D9EA900BA018 xmp.did:A511B8AD212068119109C4FC82D5C1CB xmp.did:A526EE802F40E111B91BB4AFE66AABC6 xmp.did:A5F0B1A348EBE0118A34ADD00EBCF069 xmp.did:A5FBAB916DE9E1118715EE5B318F5724 xmp.did:A60A9CE5B121681188C696DC609994EC xmp.did:A611B8AD212068119109C4FC82D5C1CB xmp.did:A628AAE1CB4DE0118CCDBF34AD86A220 xmp.did:A688D3B59AC6E011A93D9F61069A0227 xmp.did:A6C24E1BF5C3DF119F6D9BF4B2FB596D xmp.did:A6C2B76E1320681188C69B8C88BD3CC1 xmp.did:A6C6277E1C89DE11A849D901E441D0B0 xmp.did:A78499331620681188C6D9EA900BA018 xmp.did:A792B57D4B206811871FBF7EE03058F8 xmp.did:A7E473D0DB77E011A72BB337603AD007 xmp.did:A7E87A2F958C11DFB77CF3AD4F00B0EF xmp.did:A806C3667DA0E011A4FEE67DFDD7FB36 xmp.did:A80A9CE5B121681188C696DC609994EC xmp.did:A817C161BFA411E08C7396F5C0DD6D7F xmp.did:A83A97962E2068119109C80A4C3147BC xmp.did:A8C2B76E1320681188C69B8C88BD3CC1 xmp.did:A8ECE7294820681188C6E275F11AA5DE xmp.did:A9432DF857F7DE118BE884B676DB25DC xmp.did:A947F2DB1A2068118A6D83BDDADBE6EE xmp.did:A9EA192F292068118DBB82DD622598DD xmp.did:AA219AA73F2068119B7BD4F86EBFACF4 xmp.did:AA8C8B5160206811808386281F38E783 xmp.did:AAC2B76E1320681188C69B8C88BD3CC1 xmp.did:AAE0E9190C2068119109B208AFE7A4D2 xmp.did:AAE768FF8D6ADF118290CBB94C5CF4F0 xmp.did:AB074D2D0F9DE011B929E56A1DD8643C xmp.did:AB31483161206811871FBF7EE03058F8 xmp.did:AB74F6F3922068118083DB197420851A xmp.did:AB7E99DDA5D3DF1184108A6DF5F8799A xmp.did:AB9CD0663720681188C6D9EA900BA018 xmp.did:ACC2B76E1320681188C69B8C88BD3CC1 xmp.did:AD026819AF5BDF118C5AF66058A6DDB5 xmp.did:AD118B0104E4DF119190888724FA0B17 xmp.did:AD1818B51F206811815ED0470E64A083 xmp.did:AD3773DD9D53DF11B8B4B48CEB770F68 xmp.did:AD909E2ABF5FE211BC75A780DCE622FB xmp.did:AD92B57D4B206811871FBF7EE03058F8 xmp.did:AE4343DD3D2068119457D1716966A8A1 xmp.did:AE752A91EF8D11E0B59EFA46D6C257DD xmp.did:AE9ABA76FAC8E011A72BDC489F5B89F7 xmp.did:AEEFFB4525C3E011BEF0A37AC8AFF6B8 xmp.did:AEFF010E2F4CE011A153D2BF7C2CEB4B xmp.did:AF223C4E7ED7DD1199E1B78BB722FF90 xmp.did:AF3F48E9A5C0DF118427E32E6F9EFF05 xmp.did:AF3F94FC8A8111DFB58EA5992B51587C xmp.did:AFEBEFE8542068118A6DDF8D24144623 xmp.did:B00AB6B3222068119DB8BB0B9C67E4C5 xmp.did:B01EADEA1DBBE1118C61C3FA7E29662D xmp.did:B031483161206811871FBF7EE03058F8 xmp.did:B03244C1C18EE011AB41D8FD6E7F1E9A xmp.did:B03E696E21C6DF11891AB4133B3B4FF4 xmp.did:B03F48E9A5C0DF118427E32E6F9EFF05 xmp.did:B09C874A37DB11E09A1AECB6F8F33707 xmp.did:B0B076C44920681192B0EC05249DD377 xmp.did:B11D360C25F1DF119445A5FD895D781E xmp.did:B13F48E9A5C0DF118427E32E6F9EFF05 xmp.did:B1854DB6AB37E0118B3D9D759656F948 xmp.did:B1AA322600CF11E185E891BAF236F5D5 xmp.did:B1DD540D3BCEDE11AC1FBF9D231E361F xmp.did:B1EFFB4525C3E011BEF0A37AC8AFF6B8 xmp.did:B22E72991EDFE011BAC7F7CD194FE1BE xmp.did:B251B6060EFDDF11B2E3C4FD4894A392 xmp.did:B28B606385C6E01185BED54A95B1630C xmp.did:B2E2684C49226811AB08A7F30EE532D7 xmp.did:B2E7D2623E52DF119BFF8B070109B2C6 xmp.did:B2FCE64C5DF011E080EDF4F399B355AD xmp.did:B326D72B98C4DF11BA82AFFFE558943D xmp.did:B3DD540D3BCEDE11AC1FBF9D231E361F xmp.did:B3FCE625EDDAE0118842B29FA6343094 xmp.did:B43A9BE516B9E011AEBCBCB1E3A15768 xmp.did:B4592B00292068118DBBBDA095473D70 xmp.did:B505585B4720681188C6D9EA900BA018 xmp.did:B53BDA96C7206811ABD4B664A86E6DC6 xmp.did:B5A517ECBFE5E1118B99A97503504C1B xmp.did:B5B0C2465198DE1186268619AF7D6180 xmp.did:B5F2047052DA11E08FFB97E9624AAF60 xmp.did:B609F8673D2068118DBB9A2BD87D7921 xmp.did:B64468DD2020681192B0FB3680825E28 xmp.did:B650AFBAD12168118CC2AEB4C1718E17 xmp.did:B66B14327664E011BE41B15A6A029915 xmp.did:B6936E01CE9DE011AF4CB0B3AD39C76D xmp.did:B6DB0B007C20681197A5FEC97E293B54 xmp.did:B6F2711BBEBBDF1196F5B44D3A9BD6F6 xmp.did:B705585B4720681188C6D9EA900BA018 xmp.did:B7303852DC5011E0B192AB8A8597E6C6 xmp.did:B74ACEE3B8206811BF3094187AF8421C xmp.did:B7598833D620681188C6C0C998FCF1E5 xmp.did:B7D58F9579B011E19AF3D57CE9DEB3C9 xmp.did:B7D58F9979B011E19AF3D57CE9DEB3C9 xmp.did:B7D58F9D79B011E19AF3D57CE9DEB3C9 xmp.did:B8440D0B0F206811AE3FD62352FF1D11 xmp.did:B85E369DF0ABE011A0EAA0B446E442FE xmp.did:B928BC2D2E2068118F62A2D886FC3EA7 xmp.did:B932B92E0920681188C6956C521FE498 xmp.did:B956EA72157DDF11A762EA67B35A3A50 xmp.did:B9D5D6D3BC38DE11951B998C65B1B618 xmp.did:B9DD4C1C2E2668118DBBFC31635E93B6 xmp.did:BA2334AEFD53E011A54D9507E0E8BC34 xmp.did:BA32B92E0920681188C6956C521FE498 xmp.did:BA621BD59254DF119563A63D2350A99D xmp.did:BAC74A767A3BDF11B81DE3CAC7B760A2 xmp.did:BAE948E4A421681183A2BC64D6373250 xmp.did:BAFCE625EDDAE0118842B29FA6343094 xmp.did:BB1625B78953E011A54D9507E0E8BC34 xmp.did:BB251EF6B780E011BFF8C28A70355E3A xmp.did:BB3565E81520681192B0BAA904DE0F8D xmp.did:BBAD363C202068118F62F8D9147DC05A xmp.did:BBDD540D3BCEDE11AC1FBF9D231E361F xmp.did:BBE0CFA2B12068118F62B83BB8D9B324 xmp.did:BBFFC530D12068119109C37490BE3834 xmp.did:BC14929B7521681188C696DC609994EC xmp.did:BC5E369DF0ABE011A0EAA0B446E442FE xmp.did:BC806AC3DFD7E0118AB9ECA40DAC3FF4 xmp.did:BC87D955B461DF1186C7B47407E46CEC xmp.did:BC9B22EE162068118083B78A909B2B11 xmp.did:BCC8924632206811A178B4862A3AC2C7 xmp.did:BCCA85B00B2068119109870628CE59B5 xmp.did:BD14929B7521681188C696DC609994EC xmp.did:BD3F85792F60E01180C2A532D32911CC xmp.did:BD44F04B1A20681188C6CE9135C0C173 xmp.did:BD6B1DE20174E01192F2D8B5008E758A xmp.did:BD774EEE3E20681188C6D9EA900BA018 xmp.did:BDAEF7BB77D8E0118842B29FA6343094 xmp.did:BEA61E1EE6F0DF118A48A038B5F54722 xmp.did:BEACBAD96F2268118083DD6A9D608EBA xmp.did:BEE10793DF48E1118E76C3D85A8878D0 xmp.did:BF0FF0E5621511E085C1D1F80F173C23 xmp.did:BF4E9F14E9D2E111AE16AB8C13D025EF xmp.did:BF6463E2BE9011DF9756F3B2E85D211F xmp.did:BF7C797A9EA7E011B01BA4DFDBC23FA5 xmp.did:BF7E93310B2068119109E40C65AF52D5 xmp.did:BF9B22EE162068118083B78A909B2B11 xmp.did:BFACBAD96F2268118083DD6A9D608EBA xmp.did:BFD75184AE21681188C696DC609994EC xmp.did:C028BC2D2E2068118F62A2D886FC3EA7 xmp.did:C03040BFDF90DF11AE82CBA880F138F9 xmp.did:C05698F0819011E1B924A4A8CF2A245E xmp.did:C074A85E06F7DE119CCA8227581679DF xmp.did:C0850C312820681197A5B2DA320444DD xmp.did:C085439615206811871FE459E5C10885 xmp.did:C0A61E1EE6F0DF118A48A038B5F54722 xmp.did:C0BA93CBAD206811BFE5BF57D4DB04A4 xmp.did:C12C2402E064DD11AE6AB030FE2B7C4A xmp.did:C16B15488B21681188C696DC609994EC xmp.did:C1774EEE3E20681188C6D9EA900BA018 xmp.did:C1F456B1E5F0DF11A0DC84A10DADEBAB xmp.did:C1F748A95921681188C6BD0FAC4EC9BB xmp.did:C23565E81520681192B0BAA904DE0F8D xmp.did:C26C0D495267DF11B2E5C8CA2A20B501 xmp.did:C29C58B9EBDADF11AF20E3D3A3FCE87D xmp.did:C373CEC0362068118F62D0F7010AC02F xmp.did:C38F0EAD67206811A26EEF0A84B9044C xmp.did:C3DF245BDF2111E1837BCA93B883A4B1 xmp.did:C3E99553BA2BE2118052DF928F7D1CCC xmp.did:C479F20430A6DF119C3AB96E6BC803AD xmp.did:C4AF4E884A20681188C6D9EA900BA018 xmp.did:C53485763605E011B0878B10470BE98C xmp.did:C579B182572068118083CED5C8106250 xmp.did:C5956433422068118083E4CA328882ED xmp.did:C5D75184AE21681188C696DC609994EC xmp.did:C5F5FBA4B262DF11A5908EE048EFD3D2 xmp.did:C66C0D495267DF11B2E5C8CA2A20B501 xmp.did:C67F1174072068119109E40C65AF52D5 xmp.did:C69C58B9EBDADF11AF20E3D3A3FCE87D xmp.did:C6B3A3B94A21681188C696DC609994EC xmp.did:C7110E5F5076DF118E61ACD179D06244 xmp.did:C72BB5B253DDDF11A4D5D54ADD1CE786 xmp.did:C73A523D1846DF118065D80F7B596DE4 xmp.did:C84CCF5DDD21681188C696DC609994EC xmp.did:C85758D352206811871FBF7EE03058F8 xmp.did:C8656C4D0C20681192B0CF50B4F61303 xmp.did:C885439615206811871FE459E5C10885 xmp.did:C8C3AD0F9810E0119E3EED6DA52BB020 xmp.did:C8D94497193FE011BCB2EBD6700DA6F2 xmp.did:C933F621056311E18A71B2C53ED92F96 xmp.did:C952816D83206811BCCDE187B49CA19C xmp.did:C95A7CC3AFA9E0119E7DE495A33FFAC7 xmp.did:C97F117407206811994CF132BC83D69A xmp.did:C9C04586BC53E0119D3985FB4A82845E xmp.did:CA7B75907F2068118083DF8FD5225E6C xmp.did:CA949CCAAFCCDF11AAA5ECB36CFA01C9 xmp.did:CAA83FFC05216811910987CF0230F4F6 xmp.did:CAD23720A27DE011B2AAA058498F3016 xmp.did:CB5A7CC3AFA9E0119E7DE495A33FFAC7 xmp.did:CB5BBB441A2068118083EE03884A9181 xmp.did:CBB4D1F9D22368118DBBF2DAAEBE3D62 xmp.did:CBCA914B2520681186C89F4E62C56BFC xmp.did:CC0C567EB42168118F0FBB5DBDD97766 xmp.did:CC20579C3A20681180839613FFBBFAAC xmp.did:CC233AAA1220681180839CE599C3AD30 xmp.did:CC49A8FC6195DE11A97FFAA811454526 xmp.did:CC4AB591A7DCDF11BF79FA62B51DF6C7 xmp.did:CC6E956B2DE4E011A574825CAC1E8216 xmp.did:CC9EFD375F2068118DBB967E97684763 xmp.did:CCB3A3B94A21681188C696DC609994EC xmp.did:CD2AF5DCA5C4DF11BA82AFFFE558943D xmp.did:CD424D36EFF0DF11A41DD54C81C3BCF8 xmp.did:CD5A7CC3AFA9E0119E7DE495A33FFAC7 xmp.did:CD68A0E616206811822AB5766B66A762 xmp.did:CDB3A3B94A21681188C696DC609994EC xmp.did:CDDB91E8E74CE111BB50FDC03D86DCD2 xmp.did:CDE88BCE4B6FDF11B218B00D847DC297 xmp.did:CE58F6CF24A011E19E12B87F7C1C15CF xmp.did:CE7EFAB95D0D11E2A3119B5C42DD2062 xmp.did:CE807746834D11E0B62FB7127DA0FEAF xmp.did:CEDD717E815111E084CF9208B3BF176F xmp.did:CF05856847206811AEE4ECC20A5D0880 xmp.did:CF202C7400D011E18D96E08C37B82D61 xmp.did:CFA05BAC57C811E0B731C54AC127987D xmp.did:CFB4D1F9D22368118DBBF2DAAEBE3D62 xmp.did:CFC659F89E20DF118A73D73207D10630 xmp.did:CFCCDBEA442168118083ED384A5CA32B xmp.did:D0385D898772E0118C3089D479022CBD xmp.did:D05758D352206811871FBF7EE03058F8 xmp.did:D0A7CE91808CE011A0FC932931B9D7E7 xmp.did:D0B31BC50D206811871F81B8681E3F37 xmp.did:D113248AE42068118BDAECB4C7294005 xmp.did:D19D4794FA45E1119CA8B4DE29831962 xmp.did:D1C13B2778B7DE11994196785E609050 xmp.did:D1EA7F0E7172E011A599C59C80AD6134 xmp.did:D1F017DD47206811AD4CE55DF3434A14 xmp.did:D217B386CF51DE118702BAC19059DE69 xmp.did:D2D750523220681188C6D9EA900BA018 xmp.did:D3451B801E25DF11BAB9C18CADBB71B8 xmp.did:D366EFA10A20681191098977F35DFB2C xmp.did:D3674245D143E111B3C7DCF0635B33AF xmp.did:D36DB02BEF23E011A709EE79085E3A92 xmp.did:D3C068EC2321681192B0ED941B81D256 xmp.did:D3D399022320681191098A39F9B5A384 xmp.did:D4054EC11920681192B0BAA904DE0F8D xmp.did:D44404ACAED5E011A6FE9FC6A55C05A3 xmp.did:D4F431872BE011E1BD20A05C192A7A05 xmp.did:D58C284B1638E0119CCBC45B8A98BC1C xmp.did:D5D9C4ECE5BDE011B0BBD5E3244285CA xmp.did:D608018C282068118A6D94CA2FB9BD94 xmp.did:D60880EA1BD5E21181C5AC231A2B216B xmp.did:D7176B6D58E0E011B95EDA3E835E31DF xmp.did:D7200B25316ADF11BBDBF2B8175EFA10 xmp.did:D736F40B6EEBDF119CE89B15806AEDB9 xmp.did:D76FEA384729681188C6BE54CC59F542 xmp.did:D7A082228321681188C696DC609994EC xmp.did:D83C6E8818206811871FBF7EE03058F8 xmp.did:D85DB58C20AAE011979696CECC20A286 xmp.did:D883498B272068118DBBF11625A05A5C xmp.did:D883D4C80775E011B3C9FB563EB9BBC3 xmp.did:D8D3659C0B20681188C6D9EA900BA018 xmp.did:D8FF4BF0AE71E01192CC8DA08924FABB xmp.did:D905C4C213206811822A95BF04DAE155 xmp.did:D9A628947F21681188C696DC609994EC xmp.did:DA30AD8C12206811910989406DF36966 xmp.did:DA3E09F6DA8211E1BE87EF578EF31FAB xmp.did:DA67C380402068118F62A588B3F859EB xmp.did:DABF1920E8E6E1119507C1B6640A63A6 xmp.did:DAC8507854D5DF11A094DF01E6EDE320 xmp.did:DB00867DC148E211975BE3F01A671811 xmp.did:DB1E4C1CE87ADF118CB7FEA7CD74D35B xmp.did:DB6BC860392168118F62F638EA26DDDD xmp.did:DBF226EE2D81E011A575FF8823ABA620 xmp.did:DC00867DC148E211975BE3F01A671811 xmp.did:DC4F4822108DE011A1C7E8C95E0A5A44 xmp.did:DC5F1D7EB557DF11A6E5DB9F6F6C55FC xmp.did:DC6570B46458DF1191428977A047BDAA xmp.did:DC74AD2D0C206811B1A4827FBE321FD6 xmp.did:DCC0E10A1F95DF11B30EEA8B8FA3A1BD xmp.did:DCC1853A3A216811AEE4ECC20A5D0880 xmp.did:DDAC2FAC1B206811AB08DC8C504A3F44 xmp.did:DE382B3B9D68DF11AEC1C82B050F8955 xmp.did:DEF63713352068118A6DCE218B785D1E xmp.did:DF899B466140E011AE5DE74C62F0E7EC xmp.did:E01E9F4F4EA111E09220D9ED97689A20 xmp.did:E02C190E426EDF11B24DE908ACCAC095 xmp.did:E06F786DFCB1DF1198DFB20F90D3AA6E xmp.did:E0D9104422A4E011926BAE6E10BDBFF1 xmp.did:E0DC5C40852068118F62D27A6BCE2F0B xmp.did:E18B6B7881AFDF11A99089F1760612D8 xmp.did:E1C9C41C142068118083BFAB8F3F6622 xmp.did:E1E03CF4017B11E1937E8BD9211F1F0D xmp.did:E2387CA9092068118A6DD7606065F06D xmp.did:E2421EC8A62068118DBBE9BB7FD2A0C8 xmp.did:E2E0DAC5E2EE11E0BE01E65A46588275 xmp.did:E2F26FF45DBFE111B99DF8E76F9ABF74 xmp.did:E2F3B2A11E2068119109C04F2B24B753 xmp.did:E31FFC57541211E0BD2AF927F2DB9596 xmp.did:E33EEECDC9F8E011A452DB8AC9648D02 xmp.did:E36553242020681192B0876F326BD696 xmp.did:E42882E8F6F211DFA418AE0B3A87249F xmp.did:E4D11ACAE40FDE118598AD22A001510A xmp.did:E5058D4E9E2BE0119DFC94F68E9FB408 xmp.did:E5120C9C0E6BDF11B4F18758ECB3026B xmp.did:E589A9A91D2068119553C5952A36A291 xmp.did:E5F40B46DD64DF11AEF4E21B49241302 xmp.did:E61653204488DF118E8FBD716AC90F65 xmp.did:E6A6562B112068118C14D3B8541D6FB9 xmp.did:E6C74BF40B206811BEDCEC12B17E052F xmp.did:E6EEAC66382068119109E4A43CE530D0 xmp.did:E7041F041F0F11E084C9A70103495335 xmp.did:E747C0F80F65DF119A94C5D8D188955B xmp.did:E794078DDE64DF118A53D4EFE20C3518 xmp.did:E7DD52641A19E01195F1BA474F2C0BAE xmp.did:E7EEAC66382068119109E4A43CE530D0 xmp.did:E8017BD55A3911E0A9D49A9EBFE78424 xmp.did:E812A371FC4CDF11BE559267F53A0BAF xmp.did:E83E8B283232E0118EE68999D946CEB1 xmp.did:E8C1560E9217E011AFFBA65419AF10CB xmp.did:E8F5DDBCEDB0E01191FFBD2DD96ABF07 xmp.did:E8FE6E6DE62E6811994C8EBF8F51C4A6 xmp.did:E9710C1D002FE01195828DEEC618B761 xmp.did:E9785F9708206811B3A9FA077BBC5C96 xmp.did:E9D7FE3B4D2068118083F286C739C2F9 xmp.did:E9F8E4BCC421681188C696DC609994EC xmp.did:EA0D6809B52468119604BD563ECECA8D xmp.did:EA1653204488DF118E8FBD716AC90F65 xmp.did:EA90CCE850216811AE56AF0821E747B2 xmp.did:EA92B2569ED8E0118842B29FA6343094 xmp.did:EAD2576A0D20681192B0FEBDA93E3C72 xmp.did:EAD3D6971220681188C69B8C88BD3CC1 xmp.did:EB9D13B8007C11E0A51DEB87967C265B xmp.did:EC1CAAE8441FE111952789A0D5E19759 xmp.did:EC47EBE89857DF11A6E5DB9F6F6C55FC xmp.did:EC867B3F342068119109909B64798A91 xmp.did:ECAA5F395A2368118F62F8E68BACEB90 xmp.did:ECD3D6971220681188C69B8C88BD3CC1 xmp.did:ECD989D5DF71E01186C4F2433814AC76 xmp.did:ED3E3D66EB7B11E0A5A9E0B0834D7800 xmp.did:ED7F1174072068119457FF348A38AABA xmp.did:EDB543427420681188C6D9EA900BA018 xmp.did:EE060BC9B174DF11B6A78A06DDE30A7A xmp.did:EE162A984C16DF1185C38799BDF561B5 xmp.did:EE693A7E1C2068118DBBB9F63A3FE05F xmp.did:EE9960205D0D11E28E38E0940CE424C6 xmp.did:EE9BFD521973E0118605B93E5BBA3B8C xmp.did:EEC1560E9217E011AFFBA65419AF10CB xmp.did:EED2576A0D20681192B0FEBDA93E3C72 xmp.did:EED3D6971220681188C69B8C88BD3CC1 xmp.did:EEE453CD12206811871FC58FD6F55664 xmp.did:EF0008E2E40911DFB5AAA6008D4E8DB8 xmp.did:EF8441C065E7DF11B8ABBBF7FFA6B0C4 xmp.did:EF9BFD521973E0118605B93E5BBA3B8C xmp.did:F0156A7F33206811871FBF7EE03058F8 xmp.did:F020252D40206811871FE8DD2340C0B0 xmp.did:F04377DB6C20681188C6D9EA900BA018 xmp.did:F064A1845D6E11E080EDF4F399B355AD xmp.did:F0B555145168E0118B1385B28F882E94 xmp.did:F0CA1CDE8020681192B0A9A85A8A7D16 xmp.did:F0D3D6971220681188C69B8C88BD3CC1 xmp.did:F0EC54C91EF0E011BF318C473C42BF32 xmp.did:F1281C1E22206811822ABDDE6FC4B71D xmp.did:F1440447726F11E1B4D898E7C6DC2DE0 xmp.did:F178F87B86206811BEB789E23D201984 xmp.did:F18F93CC6279E011A4D3C40ADA3B0913 xmp.did:F1C1092E02C2E01185C6B675C312A0F3 xmp.did:F22117C53520681180839613FFBBFAAC xmp.did:F2D3D6971220681188C69B8C88BD3CC1 xmp.did:F2D9C097D12DE011A4C39FDDCFC91B6D xmp.did:F348C3CCC40CE011972FEB89052F1F93 xmp.did:F3490D2C1921681188C6B7868B1364E8 xmp.did:F37F1174072068118F62DDDDAFF10DFB xmp.did:F39D39633289E1118849B8370FE74D24 xmp.did:F4BE07503650E01188FDFFA22DD2E1BF xmp.did:F5600DB9092068118083CC59682F5222 xmp.did:F57337FA1D206811808384D0F1D669E1 xmp.did:F5B5082B9B4311E192E9FD709E2209FE xmp.did:F5C288EE8C58E0118A6CFA0D378051C3 xmp.did:F5C949D4FB68DF11BB279F98F067360A xmp.did:F5C96B6611206811994C973DAB47318D xmp.did:F5CF8E2D7490E0119A18FB12BAA81907 xmp.did:F5F3271861E8E011A8B1E233584C880C xmp.did:F65EEB8B6B2068118083AC546C0EE525 xmp.did:F661D9FA8775E011B17A9E22BEA99AB9 xmp.did:F6CF60380D21681188C696DC609994EC xmp.did:F6F9C04A69ACE011A043E0338EFB7D23 xmp.did:F70C4FE61920681188C6E817E1445A54 xmp.did:F7308A261D206811871FBF7EE03058F8 xmp.did:F75D918A1120681192B08BEE29C75DD2 xmp.did:F77D6FDFE93311E1B505F01906542BBD xmp.did:F77D6FE3E93311E1B505F01906542BBD xmp.did:F77D6FE7E93311E1B505F01906542BBD xmp.did:F77F1174072068118016E3CF38EC96CC xmp.did:F77F11740720681180838FBAD129F239 xmp.did:F77F1174072068118083EB83C62BD7C1 xmp.did:F77F1174072068118083F5C1F4AE9621 xmp.did:F77F117407206811822A8CFF8F7B958E xmp.did:F77F117407206811822AC2D40AA7F8BA xmp.did:F77F117407206811822AFC260B154F81 xmp.did:F77F1174072068118603B4EB98C19FD1 xmp.did:F77F117407206811871F867F3B44C780 xmp.did:F77F117407206811871FAF8B0949E228 xmp.did:F77F117407206811871FCCB4A2ADB235 xmp.did:F77F117407206811871FE2FFC5A15DAA xmp.did:F77F117407206811871FE54CC1F6E823 xmp.did:F77F117407206811871FFE96F47936D6 xmp.did:F77F11740720681188C69E72FB9C9FD5 xmp.did:F77F11740720681188C6B07CC95C0538 xmp.did:F77F11740720681188C6D9EA900BA018 xmp.did:F77F11740720681188C6F83C91933163 xmp.did:F77F1174072068118A6D90E1FCEAAC55 xmp.did:F77F1174072068118A6D99D68D2699F7 xmp.did:F77F1174072068118A6DA93661469E78 xmp.did:F77F1174072068118A6DBA8381C39EEB xmp.did:F77F1174072068118A6DBB3238D4DB65 xmp.did:F77F1174072068118A6DBCFF8FBBF0B9 xmp.did:F77F1174072068118A6DCE44DE9A6594 xmp.did:F77F1174072068118A6DE0B41756505B xmp.did:F77F1174072068118A6DF43387500C21 xmp.did:F77F1174072068118BF792C16EE1E716 xmp.did:F77F1174072068118C14928747CA1A04 xmp.did:F77F1174072068118C14CD081E66E7E8 xmp.did:F77F1174072068118C14E9255BB07F2C xmp.did:F77F1174072068118DBBA8F193EBC78B xmp.did:F77F1174072068118DBBBF093A1DAA97 xmp.did:F77F1174072068118DC196984EFEC09F xmp.did:F77F1174072068118F1CFECA782915C6 xmp.did:F77F1174072068118F62EEA207DB2DFF xmp.did:F77F1174072068118F62FDBD9649A46B xmp.did:F77F1174072068119109862065E637A5 xmp.did:F77F1174072068119109A61C6B9B1188 xmp.did:F77F1174072068119109AA3891E71C20 xmp.did:F77F1174072068119109B80DD3093C00 xmp.did:F77F1174072068119109BC552EB79E12 xmp.did:F77F1174072068119109CC85AE74B274 xmp.did:F77F1174072068119109CD214D5A7EFE xmp.did:F77F1174072068119109EC839F3C61B6 xmp.did:F77F1174072068119109F8FE27718D5A xmp.did:F77F11740720681192B0A1AA0B2EFC15 xmp.did:F77F11740720681192B0E25DE3CF5EA6 xmp.did:F77F1174072068119457F53F102BBA12 xmp.did:F77F11740720681194FC8A3235E08E7E xmp.did:F77F11740720681195FEC1F5E62B59CE xmp.did:F77F11740720681195FEE3C51095942E xmp.did:F77F11740720681197A5E94B7C2456C1 xmp.did:F77F11740720681198E99BCF30868C79 xmp.did:F77F117407206811994C8A8243CF6DD5 xmp.did:F77F1174072068119B83CEEA27995AC4 xmp.did:F77F1174072068119C12FCC73F11446E xmp.did:F77F1174072068119EB8F890500830B9 xmp.did:F77F117407206811A178B4862A3AC2C7 xmp.did:F77F117407206811A52E8953DB82452D xmp.did:F77F117407206811A613FC07C3D4EEBA xmp.did:F77F117407206811A781EBFF837DF325 xmp.did:F77F117407206811A7BACE4D918669F7 xmp.did:F77F117407206811A9F8A44324AE3979 xmp.did:F77F117407206811AA7CEE1FC8B15BD5 xmp.did:F77F117407206811AB088ED073FBA775 xmp.did:F77F117407206811AE56D6748533125F xmp.did:F77F117407206811AEE1E85804F1BC1E xmp.did:F77F117407206811B516B5B451545A40 xmp.did:F77F117407206811B5669AC054FE53DD xmp.did:F77F117407206811B5FEC38E6EA09CBA xmp.did:F77F117407206811B823B27E8187C0A8 xmp.did:F77F117407206811BA24F97E9D027B47 xmp.did:F77F117407206811BAFDD8C559CCB40F xmp.did:F77F117407206811BB8EE28C44C74A0A xmp.did:F77F117407206811BEDCA708FFA8A08A xmp.did:F77F117407206811BF8EAA6E2CF6254A xmp.did:F7A270C2A7A3DF119F139B952251B991 xmp.did:F7CF60380D21681188C696DC609994EC xmp.did:F87F117407206811808384D0F1D669E1 xmp.did:F87F117407206811808386F774EDA757 xmp.did:F87F117407206811808399331810C790 xmp.did:F87F117407206811822AC478A9276ED4 xmp.did:F87F11740720681188C6956C521FE498 xmp.did:F87F1174072068118A6DBB3238D4DB65 xmp.did:F87F1174072068118C1482C953781ED9 xmp.did:F87F1174072068118C1499CEFB83A67B xmp.did:F87F1174072068118DBBBF093A1DAA97 xmp.did:F87F1174072068119109AAFB9F469FD0 xmp.did:F87F117407206811994CA9A71151591E xmp.did:F87F1174072068119CD4DB2985335F93 xmp.did:F87F117407206811A138D837490E6437 xmp.did:F87F117407206811B4E49E03AC4C228B xmp.did:F87F117407206811B9B1DE3DF693708F xmp.did:F88F820B1420681188C6D9EA900BA018 xmp.did:F8B1200EC82068118F62B55C94B5F1CA xmp.did:F8BC412B0C2068119109C80A4C3147BC xmp.did:F8C58836202368119AA4FC7100F2C672 xmp.did:F8E327E22F21681188C696DC609994EC xmp.did:F92117C53520681180839613FFBBFAAC xmp.did:F94377DB6C20681188C6D9EA900BA018 xmp.did:F974D8AD50E3DE119B98A0D1FCBA1444 xmp.did:F9760D1D9B4211E1BDF8AB7E2919F0A2 xmp.did:F97F1174072068118083EB83C62BD7C1 xmp.did:F97F117407206811871FEB8DB824A23C xmp.did:F97F11740720681188C6956C521FE498 xmp.did:F97F1174072068118A6DF1EB259C6C29 xmp.did:F97F1174072068118C14886BEA417E94 xmp.did:F97F1174072068118C14F8EC1C27609B xmp.did:F97F1174072068118DBBB19E0C24AE1C xmp.did:F97F1174072068118DBBEB69C03E24DA xmp.did:F97F1174072068118DBBF1EFF81BD277 xmp.did:F99A94C85A2068119457B4E8E216C3A8 xmp.did:F9BD06E86176E011BBC0D959D25D44FD xmp.did:F9D2BC0A0398DF118E0DFBCC39F1D70C xmp.did:FA130DF832216811B6D09349CCF4BD48 xmp.did:FA7F117407206811822AC411053758AF xmp.did:FA7F1174072068118C14AF6C9BD96AB9 xmp.did:FA7F1174072068118F628C4A209C8985 xmp.did:FA7F1174072068119D68B0A7E60C0F5F xmp.did:FA7F117407206811A964A31DC56DDF2F xmp.did:FACF60380D21681188C696DC609994EC xmp.did:FAFBB512432668118DBBFC31635E93B6 xmp.did:FB1A20AB659BE011913BB35C5E38BF39 xmp.did:FB2B2121D016E11180D1BBB1A0D9259F xmp.did:FB2E2AA02D15E1118308D89485463889 xmp.did:FB536F21AB21681188C696DC609994EC xmp.did:FB7F1174072068118603AD4B49AD7764 xmp.did:FB7F117407206811871FEEA6EC09A2E5 xmp.did:FB7F11740720681188C6CC16CFB2376C xmp.did:FB7F1174072068118F628504B14915F2 xmp.did:FB7F1174072068118F62B4C0222208FE xmp.did:FB7F11740720681192B0A1AA0B2EFC15 xmp.did:FB7F11740720681192B0A6951AA679E5 xmp.did:FB7F11740720681192B0DC8DC9EE0D67 xmp.did:FB7F11740720681197A58C87B58F4D68 xmp.did:FB9AB60C0BE6DF119976D66446F575DC xmp.did:FBC4D2040A2068119109CC642C44EC0C xmp.did:FBF99EB7567DDF11A74EE6CE03994422 xmp.did:FBF99FCCEA61DF11B23FC8C2DC80D41E xmp.did:FC6F0BD5F22FE111835FCEA6CCEB95E2 xmp.did:FC7F1174072068118A6DBB3238D4DB65 xmp.did:FC7F1174072068118A6DBEF0F202E5F4 xmp.did:FC7F1174072068118A6DF3C73496F8E5 xmp.did:FC7F1174072068118DBBF11625A05A5C xmp.did:FC7F1174072068118F62D51A6DC08DF3 xmp.did:FC7F117407206811AD43B1EC353D4389 xmp.did:FC7F117407206811AE568088196B6FA8 xmp.did:FC9AB60C0BE6DF119976D66446F575DC xmp.did:FCEB59718E206811871FBF7EE03058F8 xmp.did:FD7F11740720681182FE98EF7F18BF1D xmp.did:FD7F117407206811A178B4862A3AC2C7 xmp.did:FD7F117407206811BF24C98FA878C053 xmp.did:FD9AB60C0BE6DF119976D66446F575DC xmp.did:FE7F1174072068118083BAFDA65F8430 xmp.did:FE7F1174072068118083E4FF021AA64B xmp.did:FE7F1174072068118F62DD804FF26847 xmp.did:FE7F117407206811A961E68EEDC136C8 xmp.did:FE8F876C7E2168118F62E601B48A9F82 xmp.did:FEC52D397663DF11B26194DD13427F8B xmp.did:FF3550F002AD11E18740F64E75AD4D2A xmp.did:FF7F11740720681192B0DCE86BF657A9 1 720000/10000 720000/10000 2 1 16 16 dqr cHRMz%u0`:o_FIDATx|=hu|pSUZft$RQ t. "ME(M&"V ݴW+T#\nqkY9'.<ĺsvAc&T+`ʾ]Q[H+ݞ~KZ'ouE) QT}>c.zZtWMx*eti[XPǴg\%>/~O7?YӭRO[N<29V3Qy?[B܆DYxo7+'m`l!ltyz\pc_Z۱z,dEy'ʵVGZ޿b ?{3q膿~kvmn*n~IENDB`JlS wt3smartSEO/aa-framework/images/16_generalsettings.png obPNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-:iTXtXML:com.adobe.xmp Adobe Photoshop CC (Windows) 2013-11-07T11:17:07+02:00 2013-11-07T11:17:07+02:00 2013-11-07T11:17:07+02:00 xmp.iid:7ee785a4-0bc6-5948-b26b-e0d8f901552d xmp.did:e95f2da1-7cf8-2f43-a2f7-aaff2d132c63 xmp.did:e95f2da1-7cf8-2f43-a2f7-aaff2d132c63 created xmp.iid:e95f2da1-7cf8-2f43-a2f7-aaff2d132c63 2013-11-07T11:17:07+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:7ee785a4-0bc6-5948-b26b-e0d8f901552d 2013-11-07T11:17:07+02:00 Adobe Photoshop CC (Windows) / image/png 3 sRGB IEC61966-2.1 1 720000/10000 720000/10000 2 1 16 16 Y7 cHRMz%u0`:o_FIDATxڔ=hQo&JͰ *"h *!A"iRӯhaecea-,L&, X.D L,R(df,x{s8{oP Cl+(MV,Ka/BގxzS; [?0W׊!ث?BCX"ȷ/o}Jw]PȫXWpX (Uמ%d1Ѹ^|(N<$م ~ Oz/AY֎=>TИ,n`ón/x5O\d1;B;su^Kn/yLUf v7~.(MnEifն:^'v H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-CpiTXtXML:com.adobe.xmp Adobe Photoshop CC (Windows) 2013-11-07T11:20:16+02:00 2013-11-07T14:37:51+02:00 2013-11-07T14:37:51+02:00 image/png xmp.iid:1709f568-9e85-dc41-be6d-942d749927c5 xmp.did:2f5e891f-9592-504b-9468-f61145101583 xmp.did:2f5e891f-9592-504b-9468-f61145101583 created xmp.iid:2f5e891f-9592-504b-9468-f61145101583 2013-11-07T11:20:16+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:6c17ff4b-8fe6-644e-86e4-32b95baaf4ec 2013-11-07T12:45:49+02:00 Adobe Photoshop CC (Windows) / saved xmp.iid:05f864b3-fce6-be4b-bff7-ceb4d6aecf96 2013-11-07T14:37:51+02:00 Adobe Photoshop CC (Windows) / converted from application/vnd.adobe.photoshop to image/png derived converted from application/vnd.adobe.photoshop to image/png saved xmp.iid:1709f568-9e85-dc41-be6d-942d749927c5 2013-11-07T14:37:51+02:00 Adobe Photoshop CC (Windows) / xmp.iid:05f864b3-fce6-be4b-bff7-ceb4d6aecf96 xmp.did:2f5e891f-9592-504b-9468-f61145101583 xmp.did:2f5e891f-9592-504b-9468-f61145101583 404 404 xmp.did:4e55d131-4156-ef47-9231-b3ac27fa2863 xmp.did:57BCD4A3F738E3119802BE982B1502BD 3 sRGB IEC61966-2.1 1 720000/10000 720000/10000 2 1 16 16 D cHRMz%u0`:o_FCIDATxӱKA1`-̺8TIiOj!ER,.d!kFLfNN#b7|ofyEEyS @A3i-m+MS_}9IENDB`fL v.smartSEO/aa-framework/images/16_monitorize.png obPNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATx1jQar)XY˸WVnA,i!o9ճyB|G8+^RjүZ;_Z`,a=kn^ n)wY 8Msn ~< &xhW؇jX \  \[npm­ț!,//Ed!yIENDB`+I ۝۝*)smartSEO/aa-framework/images/16_offpg.png obPNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-B6iTXtXML:com.adobe.xmp Adobe Photoshop CC (Windows) 2013-11-07T11:20:16+02:00 2013-11-07T12:52:23+02:00 2013-11-07T12:52:23+02:00 image/png xmp.iid:fb7239fc-0e73-7549-b721-20f784e4c2c9 xmp.did:2f5e891f-9592-504b-9468-f61145101583 xmp.did:2f5e891f-9592-504b-9468-f61145101583 created xmp.iid:2f5e891f-9592-504b-9468-f61145101583 2013-11-07T11:20:16+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:6c17ff4b-8fe6-644e-86e4-32b95baaf4ec 2013-11-07T12:45:49+02:00 Adobe Photoshop CC (Windows) / saved xmp.iid:bb026221-f771-824a-b7a7-4f675a3b6aa5 2013-11-07T12:52:23+02:00 Adobe Photoshop CC (Windows) / converted from application/vnd.adobe.photoshop to image/png derived converted from application/vnd.adobe.photoshop to image/png saved xmp.iid:fb7239fc-0e73-7549-b721-20f784e4c2c9 2013-11-07T12:52:23+02:00 Adobe Photoshop CC (Windows) / xmp.iid:bb026221-f771-824a-b7a7-4f675a3b6aa5 xmp.did:2f5e891f-9592-504b-9468-f61145101583 xmp.did:2f5e891f-9592-504b-9468-f61145101583 xmp.did:4e55d131-4156-ef47-9231-b3ac27fa2863 xmp.did:57BCD4A3F738E3119802BE982B1502BD 3 sRGB IEC61966-2.1 1 720000/10000 720000/10000 2 1 16 16 F cHRMz%u0`:o_FIDATxڤ1HaI:\)ᦂCCRP4mRHRS-*[k17#+;\PH%йq {{?'Qc# \.o=X6_ب$5ɇm&Xp{PĹl0 H4:0ZLbr t*abj{)y>ӊC<;}Qh46bb`[:ڃI1c88vfSGtٺCSdy$Te|amF8P_IGr4~B-;|=0BS7|> \z;}MbK(8n]ʴV|rx=c,N`0b Wv&қ X!&vG|aoT*~$gʕIENDB`H n(smartSEO/aa-framework/images/16_onpg.png obPNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-:iTXtXML:com.adobe.xmp Adobe Photoshop CC (Windows) 2013-11-07T11:16+02:00 2013-11-07T11:16+02:00 2013-11-07T11:16+02:00 xmp.iid:2969fd5d-6fca-d941-9093-9fee40451ab8 xmp.did:30faefe1-432a-0e4a-b0df-1bef9711bf3d xmp.did:30faefe1-432a-0e4a-b0df-1bef9711bf3d created xmp.iid:30faefe1-432a-0e4a-b0df-1bef9711bf3d 2013-11-07T11:16+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:2969fd5d-6fca-d941-9093-9fee40451ab8 2013-11-07T11:16+02:00 Adobe Photoshop CC (Windows) / image/png 3 sRGB IEC61966-2.1 1 720000/10000 720000/10000 2 1 16 16 oH cHRMz%u0`:o_FIDATxڤ[UusBL%AlAǍ(h 0!"b ( Bd壁AaDPQ*BQw޺ge<>=~k}Vg50Gn}XFC_v(a nOuY@5|5TOf{06^fl )W]?;t"&~HÛRv<=i'|!Y h8x:ipC_)L‘!OwE™⹐nD)(f~vSi7'^G!ſV Vg1.lUQܤNC>h9ܳ?w[&CMY8IENDB`"O '/smartSEO/aa-framework/images/16_setupbackup.png obPNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-CpiTXtXML:com.adobe.xmp Adobe Photoshop CC (Windows) 2013-11-07T11:20:16+02:00 2013-11-07T14:40:57+02:00 2013-11-07T14:40:57+02:00 image/png xmp.iid:2b1eba4a-3373-ff47-a908-85d56c96e64f xmp.did:2f5e891f-9592-504b-9468-f61145101583 xmp.did:2f5e891f-9592-504b-9468-f61145101583 created xmp.iid:2f5e891f-9592-504b-9468-f61145101583 2013-11-07T11:20:16+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:6c17ff4b-8fe6-644e-86e4-32b95baaf4ec 2013-11-07T12:45:49+02:00 Adobe Photoshop CC (Windows) / saved xmp.iid:1ea1d8e9-fba4-3044-bfc4-51b48b39ebc2 2013-11-07T14:40:57+02:00 Adobe Photoshop CC (Windows) / converted from application/vnd.adobe.photoshop to image/png derived converted from application/vnd.adobe.photoshop to image/png saved xmp.iid:2b1eba4a-3373-ff47-a908-85d56c96e64f 2013-11-07T14:40:57+02:00 Adobe Photoshop CC (Windows) / xmp.iid:1ea1d8e9-fba4-3044-bfc4-51b48b39ebc2 xmp.did:2f5e891f-9592-504b-9468-f61145101583 xmp.did:2f5e891f-9592-504b-9468-f61145101583 404 404 xmp.did:4e55d131-4156-ef47-9231-b3ac27fa2863 xmp.did:57BCD4A3F738E3119802BE982B1502BD 3 sRGB IEC61966-2.1 1 720000/10000 720000/10000 2 1 16 16 j cHRMz%u0`:o_FIDATxڔkq$Y6'E!:B-I(:sa.(!  ՒJ.L.Hqf+v}ַ]>z?J4]k  _PC Te"yױ 9m 4r8,ή-?4y^7"nERQĊ:7 Dp! zoCAjq)_?2sudqڗ~LNŌZ̛ЍKHz+nNClڐlþ&d'x! ϣGgk Xf ױ# {ЇBF~aÑP#DZ><2-& kpy"Wq-~!p-'1T˅  H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-:iTXtXML:com.adobe.xmp Adobe Photoshop CC (Windows) 2013-11-07T11:18:53+02:00 2013-11-07T11:18:53+02:00 2013-11-07T11:18:53+02:00 xmp.iid:62a7f609-d28c-4c42-b98c-3a9c35b9b6e3 xmp.did:7fffe7da-e315-4445-b2b2-2ff207d900ee xmp.did:7fffe7da-e315-4445-b2b2-2ff207d900ee created xmp.iid:7fffe7da-e315-4445-b2b2-2ff207d900ee 2013-11-07T11:18:53+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:62a7f609-d28c-4c42-b98c-3a9c35b9b6e3 2013-11-07T11:18:53+02:00 Adobe Photoshop CC (Windows) / image/png 3 sRGB IEC61966-2.1 1 720000/10000 720000/10000 2 1 16 16 4 cHRMz%u0`:o_FIDATxڄOHTQόSiQAH=%Ë D&\ QRVEGE ۤ-v(wVFmn *_;!0gu9~+has،Qt*]<!-4Atcs呖#2J-GRa[uWA'Ysƒ3vB_> -) eqR>Tg ϋ>4^@!:뗵0ٶųNp:+s,Nы}|O~_Jo蠊!v{p [Wr6ðƱoB|,icz3Ofq2 3tw{+Jac,GtjE@TK'0I =a-V5R)%7uԛr!WIENDB`QN /.smartSEO/aa-framework/images/32_monitorize.png obPNG  IHDR szz pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-:iTXtXML:com.adobe.xmp Adobe Photoshop CC (Windows) 2013-11-07T12:40:08+02:00 2013-11-07T12:40:08+02:00 2013-11-07T12:40:08+02:00 xmp.iid:3a13b1ed-d1d1-5445-a3e4-29b9f685ad7f xmp.did:bdd26a56-d393-3d47-b653-a9cc0a0591a3 xmp.did:bdd26a56-d393-3d47-b653-a9cc0a0591a3 created xmp.iid:bdd26a56-d393-3d47-b653-a9cc0a0591a3 2013-11-07T12:40:08+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:3a13b1ed-d1d1-5445-a3e4-29b9f685ad7f 2013-11-07T12:40:08+02:00 Adobe Photoshop CC (Windows) / image/png 3 sRGB IEC61966-2.1 1 720000/10000 720000/10000 2 1 32 32 /, cHRMz%u0`:o_F!IDATx엿KBQ?\%[ѭ%hɢձE!.-4т 2hOq&'w~|9NiƧ pE`3hxx U)lV NyW dXD)@j(Ǽf#̮͂%5T<{7Rk zwh@M4PV xp#s 7s4^L5gtN+nu^4h>PZԃaVLZ=7=7IENDB`3ovI ]A)smartSEO/aa-framework/images/32_offpg.png obPNG  IHDR szz pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-@4iTXtXML:com.adobe.xmp Adobe Photoshop CC (Windows) 2013-11-07T12:45:20+02:00 2013-11-07T12:51:52+02:00 2013-11-07T12:51:52+02:00 image/png xmp.iid:d5767eca-5855-be45-869d-f02a54040aa4 xmp.did:4e55d131-4156-ef47-9231-b3ac27fa2863 xmp.did:4e55d131-4156-ef47-9231-b3ac27fa2863 created xmp.iid:4e55d131-4156-ef47-9231-b3ac27fa2863 2013-11-07T12:45:20+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:3a832c3b-7040-d346-9b16-e2c025fbcd3d 2013-11-07T12:51:52+02:00 Adobe Photoshop CC (Windows) / converted from application/vnd.adobe.photoshop to image/png derived converted from application/vnd.adobe.photoshop to image/png saved xmp.iid:d5767eca-5855-be45-869d-f02a54040aa4 2013-11-07T12:51:52+02:00 Adobe Photoshop CC (Windows) / xmp.iid:3a832c3b-7040-d346-9b16-e2c025fbcd3d xmp.did:4e55d131-4156-ef47-9231-b3ac27fa2863 xmp.did:4e55d131-4156-ef47-9231-b3ac27fa2863 xmp.did:57BCD4A3F738E3119802BE982B1502BD 3 sRGB IEC61966-2.1 1 720000/10000 720000/10000 2 1 32 32 cHRMz%u0`:o_FIDATx̗Oh_E?_C5U0HGG!RPjKģ`=x1ςЈJR%WiihcAZ*XH-֟ <v.;o3vfgk4A3!e"N:<`wF? ||lJ+^>ǀ 1p$zNei`wFqFO8wsN*q8tĻ"NV+'eDWs8ka`95[ ;ѵeQ'_z'e"^e~;Nx'3e3Et'8'8P6;|oDl3)`[K;XׄJ|WtiݳV_{?*qlKBveYgQ1O w՜ѫZEe8QH!Vd.Ey3=ϴOB$?@2CVD県=-DtFB[Td܂=]>m*B-8ӆ6`UƏW+ sM_^*, ,џQKwd<=ni^ t /Vԉ7PRou @$cB=]>eulTko=]>6j)OOm@o^fjiboc={7BOKNzt\heY%! vgl'%BloiɔͦZ~DT/,?b+ؔ8w+ 䕴#X٬!u_^$0(O'kFD٬l6tpTWCdV6/4S6%V>gt7LvFyz/ꚬR6;b6:~x~m-D֎K&? IENDB` ēV ۦۦgS6smartSEO/aa-framework/images/32_onpageoptimization.png obPNG  IHDR szz pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-C#iTXtXML:com.adobe.xmp Adobe Photoshop CC (Windows) 2013-11-07T12:45:20+02:00 2013-11-07T13:08:14+02:00 2013-11-07T13:08:14+02:00 image/png xmp.iid:a41df2f3-c8f7-9a49-a7ae-7cf5b8da3717 xmp.did:4e55d131-4156-ef47-9231-b3ac27fa2863 xmp.did:4e55d131-4156-ef47-9231-b3ac27fa2863 created xmp.iid:4e55d131-4156-ef47-9231-b3ac27fa2863 2013-11-07T12:45:20+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:734d31d5-f4da-3c42-a366-328b958e3011 2013-11-07T12:59:05+02:00 Adobe Photoshop CC (Windows) / saved xmp.iid:67c7fba5-6d0f-3e40-87df-3e3532452f94 2013-11-07T13:08:14+02:00 Adobe Photoshop CC (Windows) / converted from application/vnd.adobe.photoshop to image/png derived converted from application/vnd.adobe.photoshop to image/png saved xmp.iid:a41df2f3-c8f7-9a49-a7ae-7cf5b8da3717 2013-11-07T13:08:14+02:00 Adobe Photoshop CC (Windows) / xmp.iid:67c7fba5-6d0f-3e40-87df-3e3532452f94 xmp.did:4e55d131-4156-ef47-9231-b3ac27fa2863 xmp.did:4e55d131-4156-ef47-9231-b3ac27fa2863 404 404 xmp.did:57BCD4A3F738E3119802BE982B1502BD 3 sRGB IEC61966-2.1 1 720000/10000 720000/10000 2 1 32 32 t&6 cHRMz%u0`:o_FWIDATxe9#BIm˴b`s-7BŒ 16V PGpjY-je5K-4;PQNROqszW9{{ws_^688چ;<pon_)05l1N(MU2ԥ(߀-ǏSwmԁ߶fl;B;uQn_M|d]Ffk[v|[JT嘎J]z6E9[Tʃ[u~3Zx:<}uQ;p.ʛ uQ3ʇx3*+/Y<µp \|BSR_V(/0*rl?:L֘c.zW)P噸;KSwEy5F sR}bލxGwo:7*/ X|. Sw[&WO(vuuNًS<. bT5x+z1s._`OU^¥ q.MUה [ݽ;qʻD1mhTa)nOUn E pI7kmS/G`euQZ!Z5tOHqCܹuQrLX:LB=^i^/D5"<'x}mkzQ('CE6U0zF uu^9Qut^ b yCS_KU~IdALpO(oÁT%/D޽,!KUy-$|Z k'"^ Vp=@p6*??R(;@Mьl8wqr` JY1Uyhҹu@X[6 SӤ arU~\8i-ʪ1,uQ^a|YxC85:=p~GvEK<2Պا5 $cs !1&Y2v}] Qew4GCsğfuQN;`>x7x=]`cq=1Aߌ{#iEsxtRy 9U/)6TMAl|{ꢼ.Ѧ'cP‡+$c1UnpoLRCN uՙlGwﱑ|E97VRW w?r_IENDB`t6H i"(smartSEO/aa-framework/images/aa-logo.png obPNG  IHDRE^ pHYs  iTXtXML:com.adobe.xmp Adobe Photoshop CC (Windows) 2014-03-14T17:46:50+02:00 2014-03-18T14:52:44+02:00 2014-03-18T14:52:44+02:00 xmp.iid:0f80168f-6c25-4646-a825-b357f1541ecc xmp.did:fe327254-bf6d-1a40-a65f-06c8219d2355 xmp.did:fe327254-bf6d-1a40-a65f-06c8219d2355 created xmp.iid:fe327254-bf6d-1a40-a65f-06c8219d2355 2014-03-14T17:46:50+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:39b723ca-711e-6649-8a83-2bdcfa371d56 2014-03-14T17:46:50+02:00 Adobe Photoshop CC (Windows) / saved xmp.iid:0f80168f-6c25-4646-a825-b357f1541ecc 2014-03-18T14:52:44+02:00 Adobe Photoshop CC (Windows) / 3 01572CA43F1E3A8160018073B8740742 024F796E6EB19108F58B6C5CBC92BFAB 02AD8C32EFDA8FFDA17773883C5AAC94 07915DA1719E56F9E1595BFEF0D147E5 08BB5329D93CC641BE97A023BD1CAEB1 0B577B6A134B449EDAAABC0EDC0F8E23 104107DEE7473480BC36240B15D0828F 11A01A357438223E32B67CB5F38E57EB 142315D3D5F08AD07BD100AE3E9D6023 1F318427C4B9D75A9A326FF8C0EB8208 2060245C617D273175534EAA5AA26A21 20DA58E2790F7350DDD31C0E47118966 2BAC96F93029B8409AAA9A83C6C8E0B6 2CC3277F2AF0BC423F255627CCDC64D9 3CEF098BEEE207B2D28713FA41A91F99 41EDA4468139D2A335F7C650EB891357 445BD608B87ECF51070CE97900EBAEBE 447A83FE9F059FAE0B1EB5BA19B45A39 4A64588F74F050EB1E63F287CC177CF3 4FE9DB0E928E52EB8CE243BBFAC4A557 55B758C43A57A264DA9E3354837F022E 55BCF7BD2E918CDD1CC761C55F4717DC 599FD634435DF0632FDA16ED3F1D0557 59F2D561D6B867AFEFB9952A2D5FF38D 617FA99AD0EBF0A549AAF8E6C2ED496C 619BD56CC4FEA59FFD2C2AD6CAAA69E3 6F0535DF0BC6A696263219F409C3E95D 76C513B5F60DA9EEEFCD69BF9AD32158 82E45C4F2E3BB5026FEB55788E8B46D2 83C25B812DF8753C4A25799E51016FAC 83F84CEE57D174FB62657681F4A88BBE 8D1A0ADD2E8D10B1FE65CC7C43EEC95A 8F48DC0F12C6E4CE5E0F05473CE8F6F1 946AD6422484AAF697DCBB25BB6642A3 9C239BDC71753AFB5A0D130978F23EA2 9D80DA8B7F04316654BF1E09260F7F70 A1401CCA5E96AD523B0C97616A5E8F1D A1D16162D80934986806426F7AE2765F B192FA8F1E5BB1C1A649438DAFA2C9A5 BC2B829F2BD2918A42FF6AA6D4C68CAA BED2401C96EC4268B153EC448CEA9737 C27A6EE216DEDDF452B9D9321E056730 C8A4588815AABA6DEDC876FBCA06B4D8 CF38E47788C68A47F6B689A750211D60 CF7C46B18733C648EFC5E51D96B561D2 D67C0825A8B7FD496D2B75309A224B65 D6E6053232371882D9CE98FD29881FF7 DF698680E0ACAC53A262DE2F9A38C895 E27D491CFE73849F282FDBB0245325E5 E795B782469DEF7079ED781318CB4B9E E7D7F49ADF8A9D50C80181F8156B7F6D E9B34685FE9E28D3BDEE9A1F9BC51CE2 ED3547DA3B2ECEAFDE751D5373E88343 EE705C74D86BA4F86801A2E4D2E8B83D EF9F52E39C5E375D5250630B1C2C4AC9 EFBCA7F452AD034564040DA2B7758F69 F0CDBE86158BA39A954327D634ECFA82 FA8CD7EAB5D939145BE099E13E1FE499 adobe:docid:photoshop:0629df6d-a412-11da-9dde-c8a00c7693e5 adobe:docid:photoshop:0fc79f20-d232-11db-b1bb-aeba6ac5ef65 adobe:docid:photoshop:112ff759-2eb4-11d8-a7a3-d143df8e175d adobe:docid:photoshop:17f5aa33-b3be-11dc-9058-b94aaeb221d7 adobe:docid:photoshop:42b55d04-ca65-11da-ac60-99df23f712b8 adobe:docid:photoshop:4f6997ab-913d-11dc-a3e7-c094cbb267fd adobe:docid:photoshop:67825bcd-c497-11d9-9b79-b43e3425d820 adobe:docid:photoshop:6cc72dd4-c122-11da-9ea0-b410217bc604 adobe:docid:photoshop:72ee0624-feb0-11df-95f8-fbdf23b3ba38 adobe:docid:photoshop:76c7207c-5eda-11da-8dd2-e400fd2b8985 adobe:docid:photoshop:8d293722-0529-11da-8d9f-87e9dc8d9ac6 adobe:docid:photoshop:97c3b72d-4db2-11d9-9000-c6cf0216aa2e adobe:docid:photoshop:c5063482-0f94-11db-a9d4-b21f0f974623 adobe:docid:photoshop:c6f96f3b-5231-11dd-b295-c1ce63d1952b adobe:docid:photoshop:ee6e49c8-7ce6-11d7-a363-f9d10a5efd56 adobe:docid:photoshop:ef1a6e5e-cbe9-11da-80fe-a32a41494dfa uuid:001538AE6ADFDB11A160D41A8AFEFCAB uuid:0F82B8E1008DDE118063A18DC277C381 uuid:134CED88052EDD11B423D4798897593C uuid:138E6BEB550311DE9C9980EB732A103B uuid:169BE01290ACDC118FF9BE61B5313549 uuid:16BCA70A928BDB119FE2D1D1AD6D4DCE uuid:19501508E2EF11DD8BECCB6B4552BEA7 uuid:1C746F852FB6DD11856A9A95FF697F0E uuid:1EF56AB8E4FEDB11B991B9E549BBAB83 uuid:2008E13DE47DDD119CA6C60CABE7E84D uuid:207F5AB1E3E6DE11AFB6E5ECBD156976 uuid:2290C3CD8FACDC118FF9BE61B5313549 uuid:29F3D697198FDD1184F5AD5C323BD3E2 uuid:2BFAFD88407EDC118371AA574708AABD uuid:2F207EF07CC311DC870CD15D8998FC19 uuid:304189413A6DDD119AFBF80C0D12BBC3 uuid:32C9A1BE013BDF11B28AB1E9B9BBF88A uuid:348C14E2B68DE011B2D0DF71982ECD78 uuid:36483A0B31BA11DEB3BCC14406C17F6A uuid:36483A1131BA11DEB3BCC14406C17F6A uuid:37DD06A87653E1118422D9075FE29A11 uuid:3A8AF8CF577911E0A1AEADCEF7A8C695 uuid:3CB8F15F31B6DD11856A9A95FF697F0E uuid:469594D60783DC11B8A6C730DDF0A3E8 uuid:47D9591E31BA11DEB3BCC14406C17F6A uuid:47F508C2CB3EDE1189BBC659B9EC8880 uuid:49E8A66A3BB5DE11809BA989B0D77432 uuid:4B7C1B8FA601DD11A05B82F82E7564A7 uuid:4DAB2F01082BDC11A590ADEFB8A01727 uuid:4F9AD90BECFEDB11B991B9E549BBAB83 uuid:5344B517DA0CDE11AB76806D8F41191A uuid:54E3BAB15595DE1191E8AA31C2B4DE24 uuid:56D4817031A9DD11B70DB0CF0BC9EDCD uuid:5B25B2A4FC5FDE118C55E1FD1DE5BAC3 uuid:5B636B2FE0B0DE11A587BCC51C1D4B69 uuid:5BAB8930E193DD11ACDF9A606EE463A3 uuid:5DA895C1944CDE119C89B968D8A62C72 uuid:6192C48C2463DC11A938D0D477F76208 uuid:6355C15346DFDC11A214AD89929E38D3 uuid:68B73160563E11E0A57A92CDC08EBFDC uuid:6A51460EFCEFDE11A35CD3D8F4849AB1 uuid:6BD6CAFDC3E7DC118D17CCC8742E2E78 uuid:6D2D16B0565211E0A57A92CDC08EBFDC uuid:7222A0DBD298DC1182C6BEF4D19F3EF2 uuid:75DCEEF5501BDF118174D58534E02F48 uuid:78BDAE073DD4DD119574E49260AE7023 uuid:7F5CD1D0302EDF11A06B87AB6D5393CF uuid:8426B111521BDF118174D58534E02F48 uuid:84BCB3D4733CDD11AB1EBF4A6A17D95E uuid:87DD43522302DC11ACBFC215FBEC85FF uuid:8EF58BA46E66DC1193F48773309C9D8D uuid:905423059AE9DA119E84CAF24BDD6066 uuid:90ADF7D5398A11DF86119436A17CB227 uuid:90C4C16F24ABDD11BC05B48537EE3891 uuid:92108B13A540DE11A29DF00ED4C1B727 uuid:9369042C2F46DE11BD9EE5A6639A625F uuid:95C5C57C521BDF118174D58534E02F48 uuid:976501A145A6DF118EF0F8A0A306590B uuid:997168516F27DE118DD28306BA0AD781 uuid:9C6B168B2263DC11A938D0D477F76208 uuid:9DCFFAE96350DF1198DBAA6ABC516A5B uuid:9DD593BF31BB11DEB3BCC14406C17F6A uuid:9E27DCC8DD70DD11AFB2FB57BC79BEFD uuid:9E393079ED09DC119950AA34618C8687 uuid:9E749DEB31BA11DEB3BCC14406C17F6A uuid:A3CFFAE96350DF1198DBAA6ABC516A5B uuid:A4A0074F8101DC11B2DCD85209BF7530 uuid:A4A6D5B3CF6EDE11B59CDBEDD4FA0491 uuid:A6359C7E140ADC11A2DAA4D78F509131 uuid:A6B8E3575957DD119F3F8760AB0AA4FE uuid:AE02AF60883FDD11AC2BE9025EE1BBF9 uuid:B01BB22766F8DA119EB1D1E45291D5FA uuid:B4EC9A2F511BDF118174D58534E02F48 uuid:B886F63C4E62DE118924E4732F4AFB5E uuid:B8DBE641D274DC11B15CC929E0BBB1F0 uuid:BAA5CD7B8DAFDB11BB67B9E1DC4CE7A2 uuid:BAAF5DE4E21C11DDACC5B29D9085C55A uuid:BC1357D69796DC118AF8AC23B60971C1 uuid:BD5AFE0931BA11DEB3BCC14406C17F6A uuid:C0599F3447CCDC11824DE83F3063EB00 uuid:C8FFC71C31A9DD11B70DB0CF0BC9EDCD uuid:CEEBB5CC348DDC1191489627CE433B2D uuid:CF5479BA31BA11DEB3BCC14406C17F6A uuid:D1DE550983DEDD11B182D5DA082F73C9 uuid:D2EBAF8C9303DC118103AC75D3E1885B uuid:D371356656E1DB11A1EDB8C01A221B6C uuid:D4D29E8CE37DDD119CA6C60CABE7E84D uuid:DC4C48BEE80EDD119117B0EC9223F3FB uuid:E0FEFDA0DE26DF11925DB7C100A3E828 uuid:E51D53285CF7DE11BAA3858EFB8697A5 uuid:E752405CD502DC1183F88C80D133AE02 uuid:E97F51296D0ADE1187DEC54A1F42F690 uuid:ECE2612CF702DC119927C0AD4422C47F uuid:F0D3FF33AE63DD11A1C8DBED5B6F2ED7 uuid:F2652DC558E1DB11A1EDB8C01A221B6C uuid:F331D6A9AE00DC11ACAF98334D040065 uuid:F3F7568A445BDE1184E2C3A479231CEB uuid:F81E9BC9978ADE1196A0EFF950960E15 uuid:FF9AF64D0C39DF11BF8393223FA3F19B xmp.did:00801174072068118083BAFDA65F8430 xmp.did:00EE06B326A4E111AF47D84B5110F70D xmp.did:0180117407206811828A9C07725CD1BC xmp.did:0180117407206811871F9B09294944B5 xmp.did:0180117407206811871FB6D45CC9A53C xmp.did:018011740720681188C6E4708E0E2747 xmp.did:01801174072068118DBBB0B046013550 xmp.did:01801174072068118DBBD7411B5EC877 xmp.did:01801174072068118DBBF67CC7525F38 xmp.did:01801174072068118F6281652F82AFE6 xmp.did:01801174072068118F6283F08ABAE4B0 xmp.did:01801174072068118F6284B29ADFCC43 xmp.did:01801174072068118F628DC2429FD647 xmp.did:01801174072068118F62EB2ADE46D273 xmp.did:01801174072068118F79B7473C32B448 xmp.did:01801174072068118FBC9421557B7B20 xmp.did:01801174072068119109B5666CC87C3E xmp.did:01801174072068119109DDF6FAAF36D2 xmp.did:01801174072068119109F305646EB57D xmp.did:01801174072068119109FA297A7A5904 xmp.did:018011740720681192B08AE26BD827F7 xmp.did:018011740720681192B0B727F2063586 xmp.did:018011740720681192B0BAA904DE0F8D xmp.did:018011740720681192B0EA0610751F7C xmp.did:018011740720681195FE85312F4E4086 xmp.did:018011740720681197A5CD7DCFD54202 xmp.did:018011740720681197A5DAF2583A0A4B xmp.did:018011740720681197A5F9674A0885AD xmp.did:0180117407206811994CB67047760989 xmp.did:0180117407206811994CE07EFE756DA7 xmp.did:0180117407206811A088E49E19740FB2 xmp.did:0180117407206811AB08E8E8EE3F0289 xmp.did:0180117407206811B50CFC9853933782 xmp.did:0180117407206811B6BE96AFFBCEFD7E xmp.did:01BDB8EC4B4011E1B98CEF24291654DE xmp.did:02801174072068118F629EAE88CED33B xmp.did:02801174072068119109B0F0B9959332 xmp.did:02801174072068119109C13AE0D52ACD xmp.did:02801174072068119109C65A70401340 xmp.did:02801174072068119DBFAEEF0353CE0A xmp.did:0280117407206811A818A5FA62C0A48A xmp.did:0280117407206811B44DF79DFC232CD8 xmp.did:03801174072068118A6DE0B43D455FB9 xmp.did:03801174072068118F62DFCEF30AAC90 xmp.did:03801174072068119109F03089D4B9B9 xmp.did:038011740720681197A59FB566CBE17E xmp.did:0380117407206811B8B5B25456C28219 xmp.did:0480117407206811822AB634F36508C2 xmp.did:048011740720681191098D76C49036E9 xmp.did:04C7B018AD8BE0118005E62EBF747214 xmp.did:04EE06B326A4E111AF47D84B5110F70D xmp.did:058011740720681192B0B03D2B78CFDD xmp.did:0580117407206811BCD78B457D78A81D xmp.did:05D444BCFE64DF11A64FA7B28D390DE9 xmp.did:0605C7F9D822681195FEA4354762D610 xmp.did:0680117407206811871FC852CC88A456 xmp.did:068011740720681192B0F8CAB850210B xmp.did:0764F0FC39206811920BD6CB55DF7E21 xmp.did:078011740720681197F3DAD110AB1D7D xmp.did:0880117407206811871FFE11C8ACA7AE xmp.did:08801174072068119457C4C657E622B8 xmp.did:088D6ED2437011E088D29E4C0233231A xmp.did:0980117407206811994CE07EFE756DA7 xmp.did:0980117407206811B1A4F894E8A7A910 xmp.did:09F76F48C3C7DE11925FE106D59B22C8 xmp.did:0A368DA92F39E0119258DF6378E0E372 xmp.did:0A483A276D2068119457B4E8E216C3A8 xmp.did:0A89FF8AE8A8E011A816A106ECD60EAD xmp.did:0C3F353F2167E2118D30DED9691A214B xmp.did:0C483A276D2068119457B4E8E216C3A8 xmp.did:0D18F7379D3EDF119B20E8B33AC24173 xmp.did:1439D15279D511E19671E44CBD77ACF2 xmp.did:149AEF289F20681192B0A9A85A8A7D16 xmp.did:15C2C46649B2E011BC4B89489F74C31C xmp.did:16CE2978BF2BDF11B1C9D5AA7FB5335E xmp.did:174FAB68C1B3E0119D60EAD8B0E55DEB xmp.did:176A42696DCCDF11B4C780F3440113A1 xmp.did:17D4795219206811994C9AA37B1758FD xmp.did:1887D09300216811A056AC0239505D2E xmp.did:1898268C5597E0119487CB48DC3DD8DC xmp.did:194993840129E1118B6683AB8BA184CC xmp.did:194FAB68C1B3E0119D60EAD8B0E55DEB xmp.did:1A0AA41B6576DF11A0EA8D814D891314 xmp.did:1A4FAB68C1B3E0119D60EAD8B0E55DEB xmp.did:1A87D09300216811A056AC0239505D2E xmp.did:1B4FAB68C1B3E0119D60EAD8B0E55DEB xmp.did:1CBB581A2D2268118DBBFC31635E93B6 xmp.did:1D541901DF4BE011B3A2B8E9249F1B48 xmp.did:20BB8F69102168118DBBBB77ECE750CC xmp.did:21E4C91A9F9EE011ACA098E241098547 xmp.did:2325628D6A59E011A4FAF43FA448DE9C xmp.did:2425628D6A59E011A4FAF43FA448DE9C xmp.did:28B3672D7767DF11B32EB6BE29A22260 xmp.did:295BA0A36A76E0119CA1815ECAD13ED2 xmp.did:298B4D5D11206811920BD6CB55DF7E21 xmp.did:2A2118970D2068119109FC901257E622 xmp.did:2A7A21AD11216811994C80DBF724891C xmp.did:2A8DADA9201EE011842A99364FEBD0F6 xmp.did:2ACF258E325DE011A1A5CBD15F1C5D8A xmp.did:2B0FAC131420681188C69B8C88BD3CC1 xmp.did:2D0FAC131420681188C69B8C88BD3CC1 xmp.did:2D49ECD639CEDE11AC1FBF9D231E361F xmp.did:2DF8BDAF08206811A056AC0239505D2E xmp.did:2F0FAC131420681188C69B8C88BD3CC1 xmp.did:310FAC131420681188C69B8C88BD3CC1 xmp.did:31C6EDB7352068119109A05ED6E5C9B4 xmp.did:321F17924B3268118DBBBFECFBC2A23E xmp.did:330FAC131420681188C69B8C88BD3CC1 xmp.did:331A1DE61120681191098946CB8DAAB6 xmp.did:34171119382068118F62CFDF647A2B49 xmp.did:3430CAFA0B2068119109A05ED6E5C9B4 xmp.did:37108FD0D25811E08013A15AD7E5F089 xmp.did:378FF16EB8A8E011A816A106ECD60EAD xmp.did:3804A6C3B853DF119FF2EB1981619B1F xmp.did:38157EBE224FE011B047D7F07BD7BBC0 xmp.did:381BE30EE535DE118F219ECC9DE4732B xmp.did:3892E408BD53E0118E47D5B457BBAED7 xmp.did:399DEF2EF1E9DE1183AEB319878DB4AA xmp.did:3A3CE7F335206811B311EBA70FD71192 xmp.did:3AFBCD36732068119457B4E8E216C3A8 xmp.did:3BDD977B1F2068118F62F4555C5E84BE xmp.did:3C17D9B5007011E0BAA5A546D65C57CC xmp.did:3E3CE7F335206811B311EBA70FD71192 xmp.did:3E51E265833FE011AA6A8DA7AB0A81D0 xmp.did:3FBE3CFB20206811A472E9C34FBDCB1B xmp.did:41178B8188D4DD11BF828F18DEEAE683 xmp.did:42C8435B1F206811A9619D3E69A42F4A xmp.did:42CBEF71662268118F62F8E68BACEB90 xmp.did:42DD52B8322068118F62C099F7DFBA1B xmp.did:44972308022368118A6DC7B27BABA40A xmp.did:44C7E966DEACE01186C0EE0104E410A1 xmp.did:450652A0D25811E084B2FC8CD418D5A2 xmp.did:4618A328212068118DBBA997D43539B9 xmp.did:49BC7A4F35206811B311EBA70FD71192 xmp.did:4A83F1387620681197A5B53B0C75C963 xmp.did:4B5C4472412068118083BAFDA65F8430 xmp.did:4C4949F6B82ADE1195A78A8137920439 xmp.did:4D15C4DBB82BDF11B1C9D5AA7FB5335E xmp.did:4D46A20FF75AE011817EF430ABC94196 xmp.did:4D5C4472412068118083BAFDA65F8430 xmp.did:4E15C4DBB82BDF11B1C9D5AA7FB5335E xmp.did:4E8F42D203D811E190EB8FF8DF0840C7 xmp.did:4F0CFAAE632568118DBBFC31635E93B6 xmp.did:4FDD2F6FA22BDF11B1C9D5AA7FB5335E xmp.did:4FFFE781FC0CDE11A770A9ABB3D9137E xmp.did:501167C17451E0119063CB825D612016 xmp.did:510B91F3AB2068118A6DF9D78C0F9B15 xmp.did:51546FDD1320681192B0BAA904DE0F8D xmp.did:54546FDD1320681192B0BAA904DE0F8D xmp.did:54BF11E22DCBDE11AC1FBF9D231E361F xmp.did:54C6CCC48F7DE0118A8F80BF7355E0D1 xmp.did:55E2C85D50B911E09B45EB5D6BDA9918 xmp.did:56BF11E22DCBDE11AC1FBF9D231E361F xmp.did:583BD1F31720681191098946CB8DAAB6 xmp.did:586276373B20681197A5ABE98A388C5F xmp.did:590D834E29AFE011BB50818B7E198924 xmp.did:593E6CA71120681188C69B8C88BD3CC1 xmp.did:5B3E6CA71120681188C69B8C88BD3CC1 xmp.did:5C20A878E3246811B4F2E4B54918CE3A xmp.did:5C810BCA432068118F62F8D9147DC05A xmp.did:5CE96B67222568118DBBFC31635E93B6 xmp.did:5D3E6CA71120681188C69B8C88BD3CC1 xmp.did:5DEA28BF0A20681191098CDF369CA920 xmp.did:5F8E58AB66AEE011BB50818B7E198924 xmp.did:62D01CE14BF911E0A0A08DC280149321 xmp.did:638880E80920681192B0BAA904DE0F8D xmp.did:648880E80920681192B0BAA904DE0F8D xmp.did:6625348F6D43E011B1B5DB40F0283379 xmp.did:668880E80920681192B0BAA904DE0F8D xmp.did:6735706A402068119457C4C657E622B8 xmp.did:678880E80920681192B0BAA904DE0F8D xmp.did:68C8EE3EEBABE0119875CB404E826AAC xmp.did:6AE4DB37096FDF11BD60EAD4B082D434 xmp.did:6B159B20C5ACE01186C0EE0104E410A1 xmp.did:6E843CF8437011E088D29E4C0233231A xmp.did:7138CE366F61E111A5F0E9A958BBD36C xmp.did:727318241C16E011A6BDE351CD2F170F xmp.did:73C5D4E7ECA7E011ABD49328F4BC62FE xmp.did:753A28DD3120681197F3DAD110AB1D7D xmp.did:7841B3F958A3E1118EE39C2C7AC22163 xmp.did:7B24B5768A72E011938DBEF8D25B6A28 xmp.did:7C3E01E7621EE0119FA7EAA9BF1AC2FE xmp.did:7C702F8623CEDE11AC1FBF9D231E361F xmp.did:7FD93A5FBF57DF11A6E5DB9F6F6C55FC xmp.did:7FFFA217A653DF11872EF9A8EFC0E527 xmp.did:80CE0A53F2FBE011BE70F7A2A05D4BEA xmp.did:81d1c7cd-b12e-44f9-a79b-78a48dfa510b xmp.did:85B2001FDBA8E1119FFCA576B484D989 xmp.did:86754CDB0820681188C6DA43C866EEAE xmp.did:86C08269482068119457C4C657E622B8 xmp.did:86D9306BCF20681188C68D6968983E56 xmp.did:8A101BFFC72068118DBBFC31635E93B6 xmp.did:8A63DD1700CF11E191B7E8D4874E87EA xmp.did:8C808E7F85DDE0119A5BC7203B0F52A5 xmp.did:8CFA6888BDC9E0118A1894B66E94A91C xmp.did:8FC93F7B2EAFE01191C6909159CD1941 xmp.did:90A1EB3B082068118603AD4B49AD7764 xmp.did:9260FA1A3E12DE118089D2AE8FA9A37E xmp.did:92E4E5920A20681194098696425599BA xmp.did:95C2077600CF11E1B332971007A50C02 xmp.did:9666F0B64C2568118DBBFC31635E93B6 xmp.did:96925A4197C2E011B180E288B7389DB2 xmp.did:96E44C36EE4EE01195F4B95F349B38BF xmp.did:97197485D51EDE119E659B86C3686744 xmp.did:973AB16794B1E011AF59B6057C510CF7 xmp.did:984F950EB29DE111B056A6C58D1607AE xmp.did:9B4613316923E111B8D9F5BDE94825E4 xmp.did:9C34F11D8567E1119E03F98C97A3B1AF xmp.did:9C66F0B64C2568118DBBFC31635E93B6 xmp.did:9E1C987F773CE0119951FE9E21D95FD2 xmp.did:A2C2B76E1320681188C69B8C88BD3CC1 xmp.did:A2D86490D952DF11967E8720A676FAF0 xmp.did:A3B6ACD2D133E011B14D815C16B7C2CD xmp.did:A6C2B76E1320681188C69B8C88BD3CC1 xmp.did:A8C2B76E1320681188C69B8C88BD3CC1 xmp.did:AA219AA73F2068119B7BD4F86EBFACF4 xmp.did:AAC2B76E1320681188C69B8C88BD3CC1 xmp.did:AAE0E9190C2068119109B208AFE7A4D2 xmp.did:ACC2B76E1320681188C69B8C88BD3CC1 xmp.did:AD026819AF5BDF118C5AF66058A6DDB5 xmp.did:AD1818B51F206811815ED0470E64A083 xmp.did:AD909E2ABF5FE211BC75A780DCE622FB xmp.did:AE752A91EF8D11E0B59EFA46D6C257DD xmp.did:AE9ABA76FAC8E011A72BDC489F5B89F7 xmp.did:B03244C1C18EE011AB41D8FD6E7F1E9A xmp.did:B0B076C44920681192B0EC05249DD377 xmp.did:B1AA322600CF11E185E891BAF236F5D5 xmp.did:B1DD540D3BCEDE11AC1FBF9D231E361F xmp.did:B28B606385C6E01185BED54A95B1630C xmp.did:B2E7D2623E52DF119BFF8B070109B2C6 xmp.did:B3DD540D3BCEDE11AC1FBF9D231E361F xmp.did:B53BDA96C7206811ABD4B664A86E6DC6 xmp.did:B8440D0B0F206811AE3FD62352FF1D11 xmp.did:B85E369DF0ABE011A0EAA0B446E442FE xmp.did:B928BC2D2E2068118F62A2D886FC3EA7 xmp.did:B9D5D6D3BC38DE11951B998C65B1B618 xmp.did:B9DD4C1C2E2668118DBBFC31635E93B6 xmp.did:BA621BD59254DF119563A63D2350A99D xmp.did:BB3565E81520681192B0BAA904DE0F8D xmp.did:BBAD363C202068118F62F8D9147DC05A xmp.did:BBDD540D3BCEDE11AC1FBF9D231E361F xmp.did:BC5E369DF0ABE011A0EAA0B446E442FE xmp.did:BC87D955B461DF1186C7B47407E46CEC xmp.did:BCCA85B00B2068119109870628CE59B5 xmp.did:BD3F85792F60E01180C2A532D32911CC xmp.did:BEA61E1EE6F0DF118A48A038B5F54722 xmp.did:BF7E93310B2068119109E40C65AF52D5 xmp.did:C028BC2D2E2068118F62A2D886FC3EA7 xmp.did:C0A61E1EE6F0DF118A48A038B5F54722 xmp.did:C23565E81520681192B0BAA904DE0F8D xmp.did:C373CEC0362068118F62D0F7010AC02F xmp.did:C5F5FBA4B262DF11A5908EE048EFD3D2 xmp.did:C67F1174072068119109E40C65AF52D5 xmp.did:C72BB5B253DDDF11A4D5D54ADD1CE786 xmp.did:C95A7CC3AFA9E0119E7DE495A33FFAC7 xmp.did:C97F117407206811994CF132BC83D69A xmp.did:CB5A7CC3AFA9E0119E7DE495A33FFAC7 xmp.did:CBB4D1F9D22368118DBBF2DAAEBE3D62 xmp.did:CC0C567EB42168118F0FBB5DBDD97766 xmp.did:CD5A7CC3AFA9E0119E7DE495A33FFAC7 xmp.did:CF202C7400D011E18D96E08C37B82D61 xmp.did:CFB4D1F9D22368118DBBF2DAAEBE3D62 xmp.did:CFC659F89E20DF118A73D73207D10630 xmp.did:D1C13B2778B7DE11994196785E609050 xmp.did:D366EFA10A20681191098977F35DFB2C xmp.did:D4054EC11920681192B0BAA904DE0F8D xmp.did:D44404ACAED5E011A6FE9FC6A55C05A3 xmp.did:D4F431872BE011E1BD20A05C192A7A05 xmp.did:D883498B272068118DBBF11625A05A5C xmp.did:D8FF4BF0AE71E01192CC8DA08924FABB xmp.did:DABF1920E8E6E1119507C1B6640A63A6 xmp.did:DC5F1D7EB557DF11A6E5DB9F6F6C55FC xmp.did:DC6570B46458DF1191428977A047BDAA xmp.did:E4D11ACAE40FDE118598AD22A001510A xmp.did:E8FE6E6DE62E6811994C8EBF8F51C4A6 xmp.did:EA0D6809B52468119604BD563ECECA8D xmp.did:EA90CCE850216811AE56AF0821E747B2 xmp.did:EAD3D6971220681188C69B8C88BD3CC1 xmp.did:EC47EBE89857DF11A6E5DB9F6F6C55FC xmp.did:ECAA5F395A2368118F62F8E68BACEB90 xmp.did:ECD3D6971220681188C69B8C88BD3CC1 xmp.did:ED7F1174072068119457FF348A38AABA xmp.did:EE693A7E1C2068118DBBB9F63A3FE05F xmp.did:EED3D6971220681188C69B8C88BD3CC1 xmp.did:EEE453CD12206811871FC58FD6F55664 xmp.did:F0CA1CDE8020681192B0A9A85A8A7D16 xmp.did:F0D3D6971220681188C69B8C88BD3CC1 xmp.did:F0EC54C91EF0E011BF318C473C42BF32 xmp.did:F2D3D6971220681188C69B8C88BD3CC1 xmp.did:F37F1174072068118F62DDDDAFF10DFB xmp.did:F5C96B6611206811994C973DAB47318D xmp.did:F5F3271861E8E011A8B1E233584C880C xmp.did:F70C4FE61920681188C6E817E1445A54 xmp.did:F75D918A1120681192B08BEE29C75DD2 xmp.did:F77F1174072068118083EB83C62BD7C1 xmp.did:F77F117407206811871F867F3B44C780 xmp.did:F77F117407206811871FCCB4A2ADB235 xmp.did:F77F11740720681188C6B07CC95C0538 xmp.did:F77F1174072068118C14928747CA1A04 xmp.did:F77F1174072068118DBBBF093A1DAA97 xmp.did:F77F1174072068118DC196984EFEC09F xmp.did:F77F1174072068118F1CFECA782915C6 xmp.did:F77F1174072068118F62EEA207DB2DFF xmp.did:F77F1174072068119109CC85AE74B274 xmp.did:F77F1174072068119109CD214D5A7EFE xmp.did:F77F1174072068119109F8FE27718D5A xmp.did:F77F1174072068119457F53F102BBA12 xmp.did:F77F11740720681194FC8A3235E08E7E xmp.did:F77F11740720681195FEC1F5E62B59CE xmp.did:F77F11740720681195FEE3C51095942E xmp.did:F77F1174072068119B83CEEA27995AC4 xmp.did:F77F1174072068119C12FCC73F11446E xmp.did:F77F117407206811A7BACE4D918669F7 xmp.did:F77F117407206811A9F8A44324AE3979 xmp.did:F77F117407206811AA7CEE1FC8B15BD5 xmp.did:F77F117407206811AE56D6748533125F xmp.did:F87F1174072068118C1499CEFB83A67B xmp.did:F87F1174072068118DBBBF093A1DAA97 xmp.did:F87F117407206811B4E49E03AC4C228B xmp.did:F8B1200EC82068118F62B55C94B5F1CA xmp.did:F8C58836202368119AA4FC7100F2C672 xmp.did:F97F1174072068118083EB83C62BD7C1 xmp.did:F97F1174072068118DBBB19E0C24AE1C xmp.did:F99A94C85A2068119457B4E8E216C3A8 xmp.did:F9BD06E86176E011BBC0D959D25D44FD xmp.did:FA7F117407206811822AC411053758AF xmp.did:FAFBB512432668118DBBFC31635E93B6 xmp.did:FB1A20AB659BE011913BB35C5E38BF39 xmp.did:FB7F1174072068118603AD4B49AD7764 xmp.did:FB7F1174072068118F62B4C0222208FE xmp.did:FB7F11740720681192B0DC8DC9EE0D67 xmp.did:FB9AB60C0BE6DF119976D66446F575DC xmp.did:FBC4D2040A2068119109CC642C44EC0C xmp.did:FBF99FCCEA61DF11B23FC8C2DC80D41E xmp.did:FC7F1174072068118DBBF11625A05A5C xmp.did:FC7F1174072068118F62D51A6DC08DF3 xmp.did:FC9AB60C0BE6DF119976D66446F575DC xmp.did:FD7F117407206811A178B4862A3AC2C7 xmp.did:FD9AB60C0BE6DF119976D66446F575DC xmp.did:FE7F1174072068118083BAFDA65F8430 xmp.did:FE7F1174072068118F62DD804FF26847 xmp.did:FF7F11740720681192B0DCE86BF657A9 image/png 1 720000/10000 720000/10000 2 65535 230 69 +* cHRMz%u0`:o_F-IDATx}yչszgifaM]  (x17 x̍KbW7VYDDa}:ZTu0dַs-B)EZ]] b-XX3b-XX3b-XX3b-XX3b-.0 ! \. 6~h h8x 'qR"/-x/Xl L]*<ہI"o !\w)!d%|RDeP`/pQV!4Anf˻Yqg\069@-ͻ6=.0< ()p?|9ޠqƒ Gmϡ)%VwLgV4UPDќG&}ز׽>7[z;x*YܯaUmw|HopoçqH$``>|O;k|~!!xaBTk-(4A㡢28p> sBm^ڼ2"8ЄS*;nwLDŜ?Wfx'L N2EzWz%g[S &6Zc2BS+Vb6]P7`NP ">RJ { 63ҥKG[,n 4{88!5#C|:UOz -_wPFm֭Fk W̶4H5jԭOy@AaLJoj \ fXYng @mM-SL| $ -pXz;͊yoG%R52a4)55X9+ƚ؝NgrϞ=>,4 `JL D$&!!J&-cvAI-0ZZlz=I>rp6.a#9*~T=rG᣻{QRc/m}~TE.pARiRx* ??!HD'2-Jm_r4`PJψt*PvI BNy;@aCޝwsY[ 1`^!5gowMe 0%*RH_v%g)ogD@#ps̟:}&999 ڂUxՃU3Yav C=z18|LhyTXQL:v| ф P*Hۑ/gi0Ʌpyl =˗k1`F9}dvw,TA@a.ْ0I.&+!*B')вyyr>7!裏*=A|*B R\]`5; tzNn? {N Ƙ c`8pV~DS@~,]C0J/@ {s+b`2dD]5To A(#.I4'm!T=t{K~̀-L}]c}饗n0v8đ3Lav4 bQ V G9 \ۂhI!5=8PA_b*'Og 'AXpdu4ƀyXEBM>}ZZjØ #B8ʹE8Z(+/?WžN6@Qc?9$E@ LIE|B"BBC+CoU(*;g`}Lb, ؖ/_>C>)p M+D)eF$4z)Z|tJ,[z6j7nGm9$2Hf>i cIKС *_S9L K؋ZG̞XNl]9`IŋOZox ȐbDՈJ&DӼGy9,nW$dd-.y~K!9SGuld=#a:GtA\sslT_(IX7Ϙ1c|Sn7XSa"TU  j@L'&i뮻*rP(r Y4Lq\@6ΆPGKowI@%%2+<׋ۻ\@X{jp^N\SpUP:[ukģ-DVc۳x0pus (^z `2y_~JR9PøtNj{gaw:G/cm?_`%Z+_|HcЌd0x82fAŪMbD?gyQ. p|3zl/}I'IΜ_^8+.+.|EsrxP]:/Dc޾Vt{bO ym|k%FOզʪ2}V^=CsΏ֐.m|V>C_(#~) D; `]| f:k"Bm* t].H52=ݔ<훜sk'PϩOG5pJԆ_,(w`߬AJx|.wt%E[ [g8ן8(UtοE.Ԩ &('TMƊN瑩3W&\q6ԶzU^/º'1wDOرcxiڴiʪ"JZu#1-hI?YpW'4,|F  Lm_@E?La5ppŹl$0H54 f /+g$Pi<ݢ$K濒ت"3q},Rk_8jL---SePR ԵE󌡫p?rjSΝ;gJJJW({52j (g9 沨 n!U٧l󵯎+LMMcԨQ\.qV m;,ٕ=IJ).8{~-ZGS/};y_r7Z m;ckQÔ`0` .8~Xw0R$P|G`Mú/QQdm4I (ٳF^]Cg1xl <0|S dLP&-fLHHP&,qOV4q-SkwTqXq8L%6 oUYxfqHΪ2 c:{H^'VњF|SQ'fXh-U$$x}&H `LqqQQGqMoݶ__AJCuC eҿa BhQly|TTwʤ T@{ qk9c5%T R>B!/]Tr[@I M(^}UJF^f`+OYV%l%W6AFqP'wK~mG.1?HMw 4h<ƶ:D;vw=vӕk3)~yF7dqT惬*VBX&^Wչڵ-Wuxec~-~EӠQE$ %uT[nƴAyزnh'Qe1ji0 X].ŭm0%@U}vՋOLCsl޼yIPjQVY[C>LUp~:A"0لu??j@YkdukMȍBn&C󙁢hk~Pt ^1U -aJDP8|$${+,^xZJJb,?,l6gB!':P3ɀg=+GDjɊH4lĸ 08ǻ* 굯Ds v-R-]tj͕ B gar)(V|~eO݁[RX߅@СC /uXᑶU'u<&[jW]`%Ϝ9S)pdG5vFn?%T5d1Ca߶ǎMR1ePd͙[N +7*v{u JEjmŖLH=[(ѮOfJ݆9Y=6c;́k2&݉>Җ̑+InINB0SB D2{JN^MzY[192tmSޏl]8ZGybv=?t珒$ޯ_"#ֵ $Rf8m#U3v ,H>6 Qȑ-$8! 0Xtږn-&{dsS *_~7_畾ސ^bjOb˄F*k1kmQqeE\>is7aR$dLA0xdu F}y:D{62'T뻫1"|{0؎%5ll` v}_tI@nY9L&a]tReSYo8jFz(d9onۊ dE5f|^~rRC`˟`mh>Ha_ 8GyGYg6~הN >#ב,?'^ȁDٙ2@=t^U74qV{9Ҏ,!H0%.o|q AzRQ!ϚKjx I XiY;4Wv^xkaICBBB+^߿DJtB(!v޽/b(Y8[ȡ@eeq8N8N @ `ѣGhsw?~O+I{o({4X)wT՟+A]QGo!83Y enO#h ZNwP)rKm6찠ɭfUq_SY;szLإ}ي7TД hs%: S@?g}+W$%T$4]d,>;J;Jk\(((^Qׯ.3>9`{< %/f 70p˖-ՀQǒ pZ8~RG:08?sܹL57ܡ^2cB8hU7u8Zӈ>IT}^ KY*0W8EiHi{B vKţ1M _ĩ~%!.0/*.֗CFiYbDdk邒2nHu?CNQIVVRd :}J_2T+[!`/JUh U!P ĕ#H)H~|ZçU^նS>4#>.]d0@WW(f-t'[?|7N(iF&dIY6r̨wMUj-%#`pN*ƩrCeDQ^8?s0.ԮƪPIMK@O$O˂R8p0ɋVcr B`LZU}c?;|583<3@f>^1 ![xI:]0r[\Lop 9 糧'Wr.,3:M'NT`kFERNv=F1^(_~]䪬T'=W=0um&M8cFiPeV59DTuAD<&0<F'58X@a':}< _I9w> t:J@rK ࢁ')#I6 '”7B'TaƋ Oϛ~~R+OBH 0 L~:t$)& sY1e0׹23M<+11)waZ1)Sl_hm] UL R8pY]Pm^ nj/AU[@hI0vM)-IhljjѴXD)v:>?5c{ =ǀ^2#*v# >>T}v$jF6vP'9}EL؀DTC~I̾pzzyRy/?j$lBQ?],NO6w^%-K5nD`3p8`2IDR}m3Őmܸ?AS{]6F`4KyDT"LMuy8PVZJDB'ޫ+>dȐIZ5zԿu^mݻK"^*3 D(6"l$#$*RdIXwsA$ ⿬F}"[nB'xB]6c֬Y~cQ]3`I|@  h56sFqVP(I"+3όr8IPa_g +%u}}}urrrT7H%c;Nzֿ}IbKX`࿮VU-pe_rnO;d"j ehbFd=oJx&G`0'1:5w+ :\3)W6&XQQq۳g~ܼ|=Ϟcǎ/ _sE_D+\v|wĮT[ziR3y?)S(+>P}vųv@H ̒@eee[MtMvgnyRzU'1xJ䇧! eER7K,Y< Np&oz>/aر?`mp8n&R!Z{Y3)yXpbn$Z[[~8] \ 0~sxޤ,Zhdϟ teG#car8pnбvs\(L"cvv5j({PVE8E/xݝɺV)= Nʑm?X=/j/'O{0Ei%%%Ǵk/OazC[|h6\ . Hk׾";T|>Ν;KǍ K¾_.\C]*~vC zWۘ"ɊGqWOVun8AUyPNp\6N\a1p9'f.#]ʗd U؆'1gT#;oݺu=aٲe;-[6GT[܎\w~-Mg]ݰ+m>|r氡W*M9rȂhoQEĢw  oB 75H`&-A#!(1 ZT*beŋ4ȴYFY5 X a!:pѢEzG56[S*X0 m9x'!/Cӆ  𴴕ES-iӤeԻ9&)ez5ZUxhw7$$9slxg 7%rEb I?Cx/_~@?w^62O?pXt\ ?ϩ}GLǾ㳝, /ikk @\Hs)-yw{3=I%-$詍~3&'2-ßz˚@Bh_tq2*a1k Y卒V YֹRZRRrĉeǎuUhT?r=Ҳ=^]v)a Ō~t/Yp0(Ύf&wDߎcQ1 W01cƌPf6ɫGdDHuе |x|~Cȋ4gk4W&1#@ۖ-[ɋw-<CB)`! >= ޙ𮟶3g&?Mko*ͷ~~]aaLKb 6M6)òCjݺuL&jI!dj1 ;vP-ހWO#eWp+tu$OPv[ZGT FqY~~zs>}ѯ_wvڥdª/|bN W]?Z4=sJ2a10Q߿bT+֭[ [L 6#3LEb40*k|l mt ~`/kaU%~bObh իWO׿n  j3Vb1XM 6#8YMެ Gka!$0 2lвrJEΜ=Dsn** {^D5S70* ߱c@k_}va7 x_o(6'y 0D+++{@$}9~ڵE (=Gӣ境鶀2~4)ˆtAVK+ vKv3M6kmmd{h%V\y@-o2 N?=Z6T)Gx~4M%/d/wW>@?#[fo40 bѭ6444c /ORؘRXX{/~8v^pQ H⪌3K.]wbiDRfig?_-w^ >{ΖhFn),,_+~>(I&?:\t^*h0;r"HBpS^3I@.Nt/^G5 Lsu2%r_ ӼL'c:L! P X T$q>r+1Uu >vh^T̎v<ϪecA'a;ѯCCa IZxFi'.CNř19+Ѓxb:ؙ~ps.v/-ZpEjguX/c}g":}Ygv):`B޽S}ǂ'ھ3b-._b,X3b-bXal.SIENDB`!MdJ .G,smartSEO/aa-framework/images/ajax-loader.gif obGIF89a ...```"""JJJddd&&&NNN888򶶶!Created with ajaxload.info! ! NETSCAPE2.0, - di @85p{۸@ .s EB! , $`a`i©ҧX/(;! , 6 a,$ " cb(ϴ2[KӸNU *N! , 5 ET4b$I<uy; Ȅ>bG̑s9y֋*R!! , 2 diֲXDQHbRUEɴ]:^f_Q#cJ! , 7 di$q]biمah㢶m] a.M$4_-66ˠR! , / diDQr%R 5p Ěq^-4CY! , / diDQr%R 5p Ěq^-4CY;I oo*9 -smartSEO/aa-framework/images/bg/blueprint.png obPNG  IHDR00mkPLTEgtRNS "IDATc `ĸj;(E)tIENDB`O M *1smartSEO/aa-framework/images/breadcrumb-arrow.png obPNG  IHDR F%`IDATxڭ= 0 ꮛG{ۡS+ !sKc)Ug]1Z &u QBR?,X2,a_aC CuN:/ qdDIENDB`/L \\Z0smartSEO/aa-framework/images/button-gradient.png obPNG  IHDR TG#IDATc/ _0'DC?PI$.NIIENDB`(J m֓,smartSEO/aa-framework/images/chart-graph.png obPNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڤjQw&I4E%E0 D, bmO XXhXZ>vt"ktdwg9b2k h _qq.FU9ʱw_sHosuKHt>ݱD;`iE 4*p`" f8!d3N .h 2J22{RrWpPK%S]z@y&O}jeQzӅM(e OFiVˌ r&x={79UI(>"As 4~֖:W4D/Hh`߹ 9_H6T_M^QI?jS&B\1V#Im E.I`rŔST>Lfrڑw h l'tܛc6pE\sLٓ﫧K?n4el3WbB̵bET&15wakDh 0GοY*"fRIENDB`ݺMG KZ\)smartSEO/aa-framework/images/checkbox.png obPNG  IHDR&7֬tEXtSoftwareAdobe ImageReadyqe<&iTXtXML:com.adobe.xmp }*IDATxb4ѓa.K2ql OT1gO.d20cN\Ջ:T1aQ )M:tԂsG12i?CQ,K @vt?JPh?((E% (Jqs%1-`)qmT 5@ ; 2z iH|`ܤ6IENDB`CBH ?W*smartSEO/aa-framework/images/close_btn.png obPNG  IHDR:}  pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxoHqM_LED!Ղ HQHD*\d!*>`eI&NLbdN׃meY~pp|o^~?~DQd5 _8Lą:yo/LKG'lpUU% h6Gy-BA5ذ@x-*=B NI b /tAtt$zxX0/+xht|23efFǧd_yIsۀPsPV/aK.dpjlΞ @S>m@uM$Q5[z~FOYq>5UJ؎l!BYxX'Sc:=GMh~i*;Gk[6ԡ+t-dqbHet%<,X:8GG2cw(--!)QϐujCQHU)mn2ND֑Xܮm/A2H9!s44(}WAIAB|c MMKNfMDi#ulO66JH_#8~HGug=Hܞ~}oܖR EN=jM5ޝz"Tا3G˳{IP?u` fdG|kCu`wٹyc[< XR_<Ȼz1**G\IENDB`c*kJK  a΀-smartSEO/aa-framework/images/customizer-q.png obPNG  IHDR Vu\tEXtSoftwareAdobe ImageReadyqe<IDATxbtqqa8;6 &$6O@ ?^ 6A/q& 3 q@Ȁ0Cmօi1l` wfX~=*L3dnݺn1ᠰaΜ9 oƐcS9 2ACRRY/1 sl!R ӑpOb>V00? ΂b~ #b0׍ЕIENDB`a9TK TT~M/smartSEO/aa-framework/images/default-header.png obPNG  IHDR'}~IDATcId* ;h-IENDB`0 C jU%smartSEO/aa-framework/images/down.png obPNG  IHDR(-SPLTE'''''''''''''';!'''''''="=">#>#>#?#?#?#?#?#?#?#?#?#]D_GgP[BcKN3>#@$X?뗇U;왉eNZA?#O4P6V=dMkUly딄땅욋흎瞧Ļl\U#tRNSC 251B'H.9XIDATx^0@$X.\gvfn`DЯ0`V23`ʲ(T 'd*T5@(.OZܱɁs@kijJ׿rf=}77ϛEid=YVPB!\$YOmbzIENDB`L .smartSEO/aa-framework/images/dt-arrow-left.png obPNG  IHDR qIDATc`5ULmK&0 X_rO>PQ;o2|8\?6 >_jqG@ 4> ^IENDB`x[M Y%d/smartSEO/aa-framework/images/dt-arrow-right.png obPNG  IHDR nIDATcP8q^M|7 ^%]Oag2'O_aI[_Ojdy 5WAJ,BIENDB`:pO 0؀/smartSEO/aa-framework/images/envato_sprites.png obPNG  IHDRi pHYs  B/iTXtXML:com.adobe.xmp Adobe Photoshop CC (Windows) 2014-03-18T09:57:40+02:00 2014-03-18T09:57:43+02:00 2014-03-18T09:57:43+02:00 image/png xmp.iid:21cd02fb-8e8d-0440-a233-2339f44d9073 xmp.did:d093c495-014d-d945-9fc9-29fc3c76818c xmp.did:d093c495-014d-d945-9fc9-29fc3c76818c created xmp.iid:d093c495-014d-d945-9fc9-29fc3c76818c 2014-03-18T09:57:40+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:33b46c0a-2e5f-3542-899f-61c6604f2295 2014-03-18T09:57:43+02:00 Adobe Photoshop CC (Windows) / converted from application/vnd.adobe.photoshop to image/png derived converted from application/vnd.adobe.photoshop to image/png saved xmp.iid:21cd02fb-8e8d-0440-a233-2339f44d9073 2014-03-18T09:57:43+02:00 Adobe Photoshop CC (Windows) / xmp.iid:33b46c0a-2e5f-3542-899f-61c6604f2295 xmp.did:d093c495-014d-d945-9fc9-29fc3c76818c xmp.did:d093c495-014d-d945-9fc9-29fc3c76818c themeforest themeforest graphicriver graphicriver codecanyon codecanyon 3 1 720000/10000 720000/10000 2 65535 170 180 Im cHRMz%u0`:o_F(IDATxyƿ3;{˱r"@akbDImӬY3rssS6˘1ckJ Q 0k,&Ly(/gϞ5͛ӺukSo駟[.[ ꫯ2k,rsri*f9ْ6Uرcg hg$Ac#U~> `(QgԩSSVnYVGv|rmO^X 4:V5귂  Pson`޽{3i$.\ٰq#[lòo<1T;l݈Eټy cƌᩧ{{PΝ{y饗(h_6!Qmۦ*̪/>' PPPРW #G_ }[@!F"IJ,N6|.Jq~2t/Pw\zs(w&9:MI/xRu\/& amI?/4* #Rub9pHz'pgq}Kzi&Æ f.2v1An_? 2zhݧl5O>~{,;$³n!Q dql~IЧR4鮎7śx";T}?E[>)}1YbP$[b?Q&(_ocZ3bG}.S;,&<ך5s!퓷_WWL>ou6wbſf@mC3gMv!~uf+~t_Q]o֥Xxd!aMp٪{O\DݚDӎ;(/+#+ә_~-%;f~aki 3I)p.Ry(  5Y.]+W}V{$kS}'EY"Pqέ>_Ѡ H4؁!j,ò,hԩÇ25}[m~O!Qڽ!EJŎǩ+ "o=Wx"+f S$<|cWP y'7q"Zo=ҥKMyG]7הּ&Z6R{M'K~nV}XqO֖:vgӬ$Dua}lj[՞9`DD#iEt'Y&qL^NF'mzկ{t"F%M~ I6*$"7e*{ԂZ2I=e!N2쀓='/z`%)z)5̃^Iy7NV pROkm늓=<{7'v43{_M' o$#"*XУ:lj[nVHedWs/Nc7p2@ǵZqfWyH}*wlċ|ge\g^fDHb'aoNo6i78 S:'+vhw\w|='34wzvv{u>ӣ(ݧopiypPy %zKɈN ey:]Ւ7$=JR*,'̋[E-q}>U;R$ʏ>Gӫ_HvE?OoIyTtgzZ}M~/N8Mf8j1~ $\v+_# ;'/q>7DZ讼I};,  iIV젧d- +n9ߖei{ ⼶t'֭+D͐w\NJLv@R>Nj. ,xʦ }J9qO5Jogptv_Ѯe6#w4Nϑ[[RaVm8ݺ !MR!(ֱ-~:HךEY8; ?.o? 'X.vm۟> wx|? |-yRz(<+g8;J!_X"I(ofO#4P9_U] dr3Z +fWE8;4ΐO-gLEU{D᪷eOٻހ@\0d'?K=}Zуo͡^LfzXQQ2,+Ǫg-SY&B,GkO0fxѴ^aiRRrsJg.~(3i2#>u$N`,rp~פZ!)_EL*]ib8NP'6  qm} g{qvSdcFl8ެESfATrE"h|4cŦ*UIcS@1پ_|MJ M8ۑIkH|ȞH6KLѯqScXDzOg|g`[66 $_ yY^YkH)2DZ}^mRR (>9y`onwUۉb1b8x\S~oxʶm(z72h3(hzVXCYP ՜YvLAS ;c3skA^vЕv.Ͼ*|Аw(ԡ?ڏcoK^FX,F<'[3DVV(nK)_l.%w9F4Q_NN]:M\(Vm؉eYDUT8Q CT "TsJ'FXa޽!ASՏBшkCT}&700D500D50D500D500D50D500D50D500D500D50D500D500D50D500D500D50D500D500D50D500D50D500D500D50D500D500D50D500D500D50D500D50D500D500D50D500D500D5!l \L:6A}uT`N4uBNz!~n 1bwqgR505N5 mLNatҕ` @@Q^QN8#oQd8@fVM;#MKy')//g֬Y QDm ..**sNڶiK <>FYr ~@=V܁8rAuglˢ͚wٴ`X,253  !@@!kvNxScǟzq2;zg}Y0r[!آ pɝ>z}[Ƽ' =X Ěk3??XjAہ@ psVUWr-t<,6TQUrd:|gF*MEyNg|mA \0w&^Ba?Y_}d]bq}צQ`$&h~߬Ӷ]?|w^7&5z3 Qc7>۩Fv$'f8u@H `^Hmǁxk>V Y0@Ʋ&O A^`޻osymM+Ӝů{ H(Rp$k\`o[xO= y)戬\ xx_ׁIXU=nDG@}J 'zH{\9 Xz.ݚl\;FuzfՖz3UۑDu"6 yyy8l.>2Wvh"/Bv9p$,5=B fCM@ppD jBBE0`M&ڊ| XR?G R+ϓJ< dr5B} qoOn""\ӹVD_!GS`=>pu֘բ9gA%QdZye%U1vZZ:|phvMP;oFMLi2 ܩXr(jwU q$pw=JVJzd^Z')uKVDSħZ.uX=%_sRsWﱾյ"#zn,OZj zg|-iK[Fvt_mm۶ң#3V&jaZ]5 Tlz{$ik8ubh)5 8s$PX㹾IE %}L2V].)b4I@$$6[(=pe隋>W-EK+|^?DOm]-{Ѷ؃귧:eS.<`ZZjtHNzgnt+Y4vui/qC&F {E=Vu+A?5 3 V۶m 9#3V%p)-7O9dEsDZ/}~F~kgY bɂu^"ָ_=!ޒPIQۣ3]6+JʸKxxδHÊ(N[_%II")Wy&q7,-ݐ x\t0[g'H6_%CCeNnbaY6v"a,`#ॵi%Oߤ=mLSL4"I$[$dhb žh!4Mщ={̥l! ,@F;wrE1KUA6m 2ci=Hkp34J ʫH]KR$Ras"MW gn[@6)3eqjkjZ\2,Ft#۶Î_*ÿpzI%Rs#;yV^ Q|F k$YɛspvnDIVL|Ȍ<Tיmlbm NU+|zѫn]`llIR{c68 3;,90PxԽ?iC\T}Z1Jo|BE (_I+Ie׏)tKV| yNsf"Ox ZE"=lf}{?{%8 =roˬSNALInشV]ζlݚ7k7s; w]cc+w&Dw ιwHdW=yN&d(u6H,JyRw_|()Lv?Vi!}K3$>LpvzxXmru흦TS_ާOeTTnс.e6lrYp9֥+YY X/?wT ;ӫHiQ' )w #Ib%=a8O;5S*;X{"dĐ%7ь}pz~CإKv6FkK'|G溏96eYR6H98.G;bn>IGeC^uEK@̷6zbj7@(ײ WL*{Tu<τu,:z:v-TLTWRTsE4oނ%4XvҲ2&MTu27K%=sdng3֩[tU7

    O?횕]sOfiSo_!$Kۀۢ%o( pJ۱-r!r Q듔unh.IP(!,R'^\Qgm<0 #jRm M73M&QW,`6g"c:cug*ƳONg"*Eor 4{8g &=Zݽw~W+S&ٙ2DmJs.9*3D58XJֲ!!:g 14jsDIENDB`"NRH @8*smartSEO/aa-framework/images/error-pin.png obPNG  IHDR%%Ş 7IDATxڽX PUUM LP!D~дё'$#O3E?$A)IE ~dBuw[y󞌆cgfy<־sJ`t157U-p4iR@rrV1N;ڿIft4~V _yG^^:  >|X,)66BcuЇ<#/^6VbΠA>C@ =zz6od1N;ݻE䧎5ZmǏOE X`9娍o^Y[[&mIe1N;O x7:׺FS7O oA`qcccTUUղ{EDDjժ;v(+c1N;ӏ*y?v`ꉮIsY2KVy6/ݻ7[^\\0..n}hhhZQQ% z6svɣrĉ[G]lq Ѷoݺ: @q~'7n}ڵk7K)Noq=((h3GD0(7O'`N?+**ۧW^m8pLG^Sz} p&@qMM/j&pٲe֮].^P*ٙF(?}†3 TnP/'QNM۷oO 8 P#˽?  ʥٳ17ҳ% [FFFVHHHĮ]WVV! 0QWMj#wNP"ɕֹشi8Qغ͢[K<'Tn!dz~ƣ_O}ƍ999CW^6{Ϟ= TaP z@¶!Tn@= RW9p[r 5NN# yҥ"*%J_z?yȧrSz}sàǍm:l<->,Y2kc)RB+Wqx ܹrF;ökˑ#GG^Sz}e=` NI4R˧1:xŋCL)L=yР}Әիu666hO?唝mM>:]L5e$!/.슣 ޽{⨧)UpZ $ME?K>:ԣ~M;_ |ؒr~~~ܴ!soٲeNY&{9C=Oԡ3g `ΝxL5Ol)Č9;;MѣGL0!ў~zY$/#zn%_xQoooÇČhsy .Ӑ=+],^ 8a„(|5֏`1N;C>OѳP멹Lt+HČ[ڠءC1=UpyN2|~ ,iKcY jSL … V*@GOxۀP۶mK=ì}{ yӎ?yU-Eϔ/F iu܄h"0JAVbq#~^ơ\'^$^Ύ@7!pר5׭[=ǜhq"'e3ǮRZ` L2>LN+~R3IF0yroG21e}kR^OR=e >A7`/cYwYO[Z<]{yGY[7`ϭa/c[Yo g v %Uȸ35xf`32nS~M!Q IENDB`w<-L .smartSEO/aa-framework/images/header-bottom.png obPNG  IHDR7&:NIDATx @ Do^mV &b a@ >uV0=ٚܗja3?o7'L c(t;O.DIENDB`HC CCYĀ%smartSEO/aa-framework/images/help.png obPNG  IHDR00WQiCCPICC ProfilexYgXK Kfɰ3H9GXr A" TII` A}w~ygRXXpkm3P53"Lm9_Z/O Kx+3- =#@~c1a0F ! _`x{h/[kQH`:1C#=H^;|"-m'Ø#wGD(}<_u#>FytFk1: 59B @8܇q` t߽8$x$Py.xKM>Eq*~{;#+m+v@w,| $j'[h)!F:|nXEa_4YUZs//M+_3*<< }a eY(U 1 `8 lp\Š \5hm 1#X[` ,! D!H R Sr!_(T(ʇ j:!4% @"( BB lGxD QhE #&M$@R Hn8R @:#}DdYl@v"OwE"a;5D١3YY YY= ]rr~rr r/8\8Z N g %p k2? "[Cs)(E(u(]((PVSvSxM3>_QSIPQyQ%QPRMPRSSkQRSP7SRААhiJh:hh6iii-hishh.aѽG{ҧ_g0210d3`aXcccge,a8K@F B.͔4Ƭ͜|yyȢȒ*jzuuM͓-%;]ݚaMN0}+NM8ԹsZ&2A"b?qې;{{Gǎ'&^y^5>.>3zJ~m̂FBBG* cKD""~"%"QQRq1XXؔ8xxAT"EMbUOY2OrPrOJ^*H+i:icN/2"22%2dIrrr3{*(*+4(,))+^RRbPTQRF+k+')w)WQPTiR*ZxHީ*fՉ$J^U ZZZ׵VõokoEf36DNqy+7741)6yk*bni036;gڜ<ļXYxc)hyҪꃵu M͖m+;!(^{j{Zm]|YGI㎏XڝUΛ_8<"#]Y]\Qܚu?HJҦ%5OBϏ^^罖ռ||}}|.ilZV9 & v   K=rѵp(HD{$G EV.cK;'䄹Z+D$ޤ'jqɁORRS:vqH{wd}:UzxTjF))S#3eKedytZt3>gFrr/Ŝ 99sva\AY!0pȴ"ųOhܼ~)vWe eee;W0W|juҵ*֪쪟!ճ55uu.nhooI} ܊ɤYmYPk\Z_lSxqGoj;wJ2ͽvo~ߞwn[ =75xHmÎGJ+}Ivϧ\f_XrՉYoh̰T%Yٻssom޾z?>?,p-.,v-/-^qw%KB-5?9ͯ`٨*wrsf+xkw;˷Jwvvc~`ٹgz?x?N j8ps1pݿs_p(,,Z =Cd<䓸L 5Uz?u Vv("c/!ɞyk67\Dn"&(o I~/]A>!Вfr\x@I)GikCY39Gy7d&qm5nu3NEX~:CQSKJ K#Ru[mSO9otv!xXy{=;3H68 "QBQıȦqg$ k&%Uܟ2=i}<3Os?ayϩZYxD񇒽R˂eJFΕ>WB]+jYݯg.uôfƺ-6vN;'޾7~+g7pXu½O6)i'2N*ϼ2i\ݳ.yQg՟0]RZ,Vvɼr`Ydyfŵ;W~Ѯ%%\o1ڰz (ФݒvjöBRW{=}Zo ?tqpܓQ#NOMM?735ϖͥ {>h>CBbRrGOGV?[}ʺIޞ6NnŸ{#3 Z=¢ddpb)dJq4*iC4 Et&t H7S7s0 ;6naX^q.AI nai 8w]C`HhĘdT,܄|Bb % VKWd5ݥsU7W/APHܘ..M?貼au:mQG/'gö.G\ݝHAa^>f~: "A|!P0QpH(hX8xc mNIvMqIuIs¼yۄ "K?[5^ݠ،~~kpEM8y  :& A<x$BJD3Н*?f+~$$k!$ _9()*7r  kZ6v. ?a挏&5vfE6YVi֛ll8L8&98W"nn8[M߂*JFEbECb$$e%KJJi s f-ʏUZUekii9h[*99C#yc5}8jq6̱o3emT<>"Bze7X4vjLd\T U}ܥ'R:'I ;fYM9F乞c9?\Zxq4L|՘*څnF7z4Vh#wWcWր CG?-M|}c+7|jQn9peu{]m#ysNg0 ח@'@P4`~!b0"P$Z ]ՔOX?[2w#38<\XgR*%Xck7ĐǨti*+$vC3K"r9+Ļ_ (#DZMsWDJK=!S(,#opHQZIQYMES萃I=P#Z3UvNnޤGCiYy++mCQ)yЅk[W_g *6"kѪHؘcr e$c)re'ң3^ed؟˓s>pb` ۥ˞W1T ՜S_qWpjˍָvN;_o]7{HI!p:0kmNE#k85)H|CˑpYɂf(̚m6d_3~GD&svO*/&xW_IҴ+ےO@"&jG72NJ)jalI#?7IS*3D/B)򧅀?(ԴB# epG '~r?j\ P(῜!ʉOZ*Rxo,y+%./@'/ܽhn͕#=shL<޺c9"#>4%TI4$Q/NIho " 4-p,wFk\ZzPQ|mN oz%p꜒4f͋Jh55\*>T-0ă;{a<;~/[t^Me$}0;>x Bݣ1WgDxKvj #.y"x`*KL7Hr&Y(q<=PQlg4g A!ZI| V(N: a(TQ0f((` rwwR8^s>.qX~m~Q9?(^:cTcJY!(`S>/K'ޑrк{ݛL)C!梧K`uٕE%!oxM,Hw0!$BY_2²J=KsWz;>:4~?T AmXXNcm3?_P(?/ë+]G}z>9G?Lx?u֭7m14֔ <n_pzo :huw1ڛ>>Z鸇fIr3FjW9~ C[r+IENDB`$nI P+smartSEO/aa-framework/images/ico-delete.png obPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<]IDAT8˥KSa[nQP2wܦγL[,biaA\Cv_2MlZFjסNMjmkʷ`&.#z<ϓ bVPT3%I{GqRivȅ tz#E6EddJ`DR2<]N ;4Ѿ;m>78ɀQe6LIt殷cq!z |v j/Xi@ %1|hl !|! Y#uUNw]˼ H3u t]E>k%IfoRD:0`~ | (r on3oG0!$V *[W0_-+ dW&2ZfMFVJpiF&B > Rg- ~ CmڴER ឫ p5ްy+21Kawh` #aZ񽞆TZoLѓ`"(?'ˎJvKކ|:G9[aw82 Jw f'ymzsӘTsw__ιIrIENDB`t.C 7 %smartSEO/aa-framework/images/icon.png obPNG  IHDRasBIT|dIDAT8œMlejECm҈Q41B$hIwbn!}z$ծdtHL;:e}XGRH-T(B*mV;YI1<3OyM! 0-0![3X繹HhP&6>eZض9JjZX x+d׳H)IR?aP< $ZkѺ538^م*܃X$c,Ck#l`jD 5{.aa&&!MS|߿7$a||W^ݝ=>0?~?Ξqo{ťۍN|ۮV rYiJVcll,<75ur8-kɟk-R>evSq_G` H_%$?.[IENDB`M]c d̀EsmartSEO/aa-framework/images/jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png obPNG  IHDR(ddrz{IDATh1 17Y$t3;_TUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTüŝc)IENDB`6d YoFsmartSEO/aa-framework/images/jquery-ui/ui-bg_flat_75_ffffff_40x100.png obPNG  IHDR(ddrzyIDATh1 R 7(ȚV`%X V`%X V`%X V`%X V`%X V`%X V`%X V`%X V`%X V`%X V`%X V`%X Vj)2NIENDB`^Xb xx;\FsmartSEO/aa-framework/images/jquery-ui/ui-bg_glass_55_fbf9ee_1x400.png obPNG  IHDRoX ?IDAT81 0Bѯl`6Cs<]:[&BA e7lQJŜQY*IENDB`Rέ,b iiFsmartSEO/aa-framework/images/jquery-ui/ui-bg_glass_65_ffffff_1x400.png obPNG  IHDRoX 0IDAT8! + ̼JHR)[lk=O_(<` H"IENDB``b ooۇFsmartSEO/aa-framework/images/jquery-ui/ui-bg_glass_75_dadada_1x400.png obPNG  IHDRoX 6IDAT8cx&Qb%-7(`bbBf!؈(1Jc ܠIENDB`vb nn-nFsmartSEO/aa-framework/images/jquery-ui/ui-bg_glass_75_e6e6e6_1x400.png obPNG  IHDRoX 5IDAT81 yUXHa@[{UUu@7 DFIENDB`yb wweFsmartSEO/aa-framework/images/jquery-ui/ui-bg_glass_95_fef1ec_1x400.png obPNG  IHDRoX >IDAT81 0Cџ $CB}1@)e_ƅ`I8-%cM0 )" LIENDB`k ee,XIOsmartSEO/aa-framework/images/jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100.png obPNG  IHDRdG,Z`,IDATcx&!DJqш/Cc ;:*COIENDB`=Ek` ""7BsmartSEO/aa-framework/images/jquery-ui/ui-icons_222222_256x240.png obPNG  IHDRIJPLTE$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$ÈNtRNS2P."Tp@f` <BHJZ&0R,4j8D|($ blߝF>n~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?sn~hhH_IDATx] c۶JZgv,ٲ&{?:-[3Ү3qJOptB }6x9s SmCXȸR<QήF ?SHf+&ytSE-G8>Am٪d ~Z#sկ6'аfN( 0%#r(DXXKQL^J*KʱzTA~yd-TLieSS(Kň< bۜE%NS~._c$QUb=+C5>W-Z8BHؗ+$~ǫ+e9*9J*VDoq@.i ovR~SH6w_v cU˂5y@~Rת#J9"!ꎾJ:d$. 3@nVew%w>#vSv ᤵ #,e]T q/|cթbfppߋbH1FS s L(?"#YP)C6C\$V-A$b ߏ3R4m`G\~ c:C.UasuC]7<e7,4 ʯUW-Cv7uT{%*9"VzOFU8ь)Y~+%X4STaWDSWeju^ѓIMg/_Moe"&~m ' sOW7-;3xf7yr#C+9ckM].8qYd#R`kaU^k#/P?*u$~HY52֟^|b{|a,?kE/vkL?o=;dxlE{A:?aM2$GqB+hC>te_O8d0wPlE` AAɂ[.zdaVĀ#O4&k?V `]ْP#NJ7Ybe7,H[F24eYSۉ|B&]KR˥Ŷ ATS6?h{9 "\vr9U{qvk/0W+?q"GW˨`wͤWAF-`ae]n"bMB]p+5޿ 3G]SÎ.1Yax)Ã[<+> smT؆*sɴ,K۶\ij`erY9yaЩ L|Ϟ)L[ T7GRPP$/0*vStWFCE/2:htL?8;>l fYd6ɩ}{ZiukDJӟS\^z L,uFtKyh}jdrf$3:Cd.Uٽ{AojRN 簐џQ S/]VTq _G9sE$Zwa͏FUH# e G1ZwV7>naO[+ʀ4HF^ ׆ONfTpza ƀV@O//S]SύwxTnځZG#N"a]s՜X7 `G{v´?VW_FYͩi+U'4 V 7%yT`뇪rXfOo@Ao>W n2K*fǦMh:75M+ЏyN<ÊP Lon> h:ǙvI~9畺K 5f dķc=8983K4jvyi|@v0cNv+̩1WrJ<=Qm[=(A3LJLX H˦6:խziJc'f&Ltv}15 |%۶%2oCm _x\c)VaF3p[oǽ$\FFO"v p30Fz8L&2pG>0V~XQO~!E  0t${  F0{F「{bZ),\(<`0o%JVA=#J֟߆ L 4lO /ܫbĪ (X&ܮ`XZw222>*Dg) 0ݱ*ouJ(=M^ 8IV },f>+!>? @ejBD8pOagd|PTqg$Ǐ8i)s0,C~\ :UV6U \`77`V1c@fN/ɪǿfPʃV]*h w.藢{7iHu}Jn3@ vebd?wPyW˂ErٵyI*RV2~ET~=N8e! *{,F- :.Yg (^!.j4^6Ե5o B}|~[ ];CU [R)aT>7/{Ky&Ϥ{QOy)#ârύ~a!&Wz Z졽TץRҥ_s]4"oEDAwUT8Hvo%sn\Hy$ȴhz4qR;yu5:??@V'.vlcl77^W QgZ-&5_D?1EBT NN ٞqJ/ {^b!#{ ~M{x/-Jn)Qljk=%46}t yX3KȊ7D:m{μ0-2TULPĆX@ ׎|M#D/vzXp< %#_%=/9(@C@ YMkf#-r@Cʭd8aG@ƌ<@޻@Fƃǃ~?lldž/wlTLdžRnFWbA%Igש½'39R^MRV֡UuC +0i=YS}!uۖ,V/B5, .C|r Z^;0p&h"?ȏo7~olap,lr_UaFH\zh+G_mB[޶CշjSz322`t裇:{GC@{E :\^ ?*;ۢ9/BAo_ @[@ ] Ql uf;sIENDB`;j` ""5BsmartSEO/aa-framework/images/jquery-ui/ui-icons_454545_256x240.png obPNG  IHDRIJPLTEDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDm:NtRNS2P."Tp@f` <BHJZ&0R,4j8D|($ blߝF>n~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?sn~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?s"` ""wBsmartSEO/aa-framework/images/jquery-ui/ui-icons_cd0a0a_256x240.png obPNG  IHDRIJPLTE FcNtRNS2P."Tp@f` <BHJZ&0R,4j8D|($ blߝF>n~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?seVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_FIDATxڴ[h]U߾KrsZ"TSo82HQs38j""AQԀT2ACۤ6II-쳳^fL'>lެ׏'JqoSs.vOX mYXgmCCI5%)#J'&NgPEL,R :??[kuz1n~ؕg55HfI%tp+3׏ zwV#o6ζ\?@.bhB ٻB>O=^K1o.n' D-iV35Uh%NNycTYř:;;8847mCɬ hQw-A9 {tQ|O?rR⟊.0_=r"N /vНg8#g 08Q 9<'a 2c HVlUR.bCn؄WN?L3#@lp]2Dll`mnm(+Z!A2@6j 2;h{TMHI@Lū),HۣD˜VXp^N;ۛh Wp4'F!=Nyz8mvyɎ.ᩙIj^߱fvC{r4&uf3V"w'!<՞kZ<=D}>N}&Dfrq@pژi k_5j,)#g#)XU$ډUc{_ 1!-&-fsW`Sx0M\4ް4y}ͻbמ[I~ܼ~qp#V\ѩ虓oD ?zobQUMsJ%-Jz9SUUZjTbN4;:皴Ʈ+bM68TjsMZhv|ܹl6K>'""^=d5 1X뺕[y t!ˑfXi.Nٳ9}9p 5:p&.Cqmf`ve`j“ 6.4p h$ h4IENDB`hD ԅA&smartSEO/aa-framework/images/light.png obPNG  IHDRa pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_FEIDATxtkSA7 MMHZ.\dW>U.KЅn\`E+ؕ]bGJ_D&7Mqam9CD8tr3Z{"(r-ί$#/6E[;γ3=7v߬r "{+2߫DZ*K&jRIejUܲ3.qΠ\+h{Z\j z;<> 1~VP?5% c, TAɻBbva,,v>(5n ou|e]JEpB,  1 _*pbR$|6FwM?TʷiF5Аέ؄B$N@1>샱xAq%sMz7zS£c}NƑ9 ~*\X|cf!S ;p|jU2[v2Imo`{c:6 >#NKB>h  3B>h 8G彭hwHssde%nfS"J}L&#k@ ưa{.z̟I~5IENDB`rC #%smartSEO/aa-framework/images/link.png obPNG  IHDRaIDATx^!0E9@EˑP(; $+wILG4cp#EaR8ݸwv%ٶ 'sQ۶,˂PumvpQ4LӄuM;gBHyf]WٕUU2H@- Adobe Photoshop CC 2017 (Windows) 2017-08-17T16:54:32+03:00 2017-08-17T17:33+03:00 2017-08-17T17:33+03:00 image/png xmp.iid:1d7de7f8-3f3e-9148-a7fd-8ce88b5919dc adobe:docid:photoshop:f34891c0-8358-11e7-96f7-bcb121203287 xmp.did:cbd32841-19bb-fe4d-8fed-72acc09e2db4 created xmp.iid:cbd32841-19bb-fe4d-8fed-72acc09e2db4 2017-08-17T16:54:32+03:00 Adobe Photoshop CC 2017 (Windows) saved xmp.iid:9b31b0fc-dbd5-254f-9b3c-45eecf3b88f8 2017-08-17T17:33+03:00 Adobe Photoshop CC 2017 (Windows) / converted from application/vnd.adobe.photoshop to image/png derived converted from application/vnd.adobe.photoshop to image/png saved xmp.iid:1d7de7f8-3f3e-9148-a7fd-8ce88b5919dc 2017-08-17T17:33+03:00 Adobe Photoshop CC 2017 (Windows) / xmp.iid:9b31b0fc-dbd5-254f-9b3c-45eecf3b88f8 xmp.did:cbd32841-19bb-fe4d-8fed-72acc09e2db4 xmp.did:cbd32841-19bb-fe4d-8fed-72acc09e2db4 smart smart 3 1 720000/10000 720000/10000 2 65535 38 37 ̨ cHRMz%u0`:o_FbIDATx_UU{fLj%$T)fj$&IQ9feIA#h*`Qd6F ՃSR!35-hwV/ߖ={;s&)7l8w^{[k}k ̌KeD0`0h.쿰kzG5j)X):p0!`w;ϚyWF < 6zvXl`pxhvzKj,/2bf/Y̬̦ٻf֪9[vϾ̦a^=i 3ff10w2fo68@-WVkˁoPR(v&_TquWj^^l(qAiuFPω=@n Bmݚk:XI\-"u#=Rk%Y-\VUNWKVNh]sb+ (6iim3 Ms_9=^wKIz`t*nkyIߩu+$W>?Xz`!$;\ C0'Ub[N@v#er_9Kg$=YGXcڨxY 2tJBŕ߆(Zy^m"EүHX |&=Z \%/[bZvhݜصɊӼٺC+(XWjcvQTyA j>嚎 j_5II,Cm@d_1Vぬ l+!^PUq]+F1UuvXm|:vQ0>c/!EGeX&, s yA *q NJʼ? ޠPq]BOUʺb1;,ئ{zʽxM@w*QMmPaˤS# u0M.:KX&zmn%9̋:.ͻrދ?(J}yTCmvKsɑUXhL?lIE};D:x= cb% X(Lłwux.2+S @ESIENDB`T!E `B%smartSEO/aa-framework/images/logo.png obPNG  IHDR[P pHYs  @iTXtXML:com.adobe.xmp Adobe Photoshop CC 2017 (Windows) 2017-08-17T16:54:32+03:00 2017-08-17T17:06:52+03:00 2017-08-17T17:06:52+03:00 image/png xmp.iid:fc064fd5-5315-f644-b0f2-44488509e92b adobe:docid:photoshop:4d6dc6b9-8355-11e7-96f7-bcb121203287 xmp.did:cbd32841-19bb-fe4d-8fed-72acc09e2db4 created xmp.iid:cbd32841-19bb-fe4d-8fed-72acc09e2db4 2017-08-17T16:54:32+03:00 Adobe Photoshop CC 2017 (Windows) saved xmp.iid:41a549cb-2dde-3e4d-8803-e5cfca04a008 2017-08-17T17:06:52+03:00 Adobe Photoshop CC 2017 (Windows) / converted from application/vnd.adobe.photoshop to image/png derived converted from application/vnd.adobe.photoshop to image/png saved xmp.iid:fc064fd5-5315-f644-b0f2-44488509e92b 2017-08-17T17:06:52+03:00 Adobe Photoshop CC 2017 (Windows) / xmp.iid:41a549cb-2dde-3e4d-8803-e5cfca04a008 xmp.did:cbd32841-19bb-fe4d-8fed-72acc09e2db4 xmp.did:cbd32841-19bb-fe4d-8fed-72acc09e2db4 smart smart 3 1 720000/10000 720000/10000 2 65535 223 91 }} cHRMz%u0`:o_F IDATxyleU?w R-IQaKq)nA'PiE0!4T1HH  30ͽ.ܤgy瞞w#BγLU ''BBBH|BH|BOOO! ! !$>!$>!''([A` <L<#c'-q5ۀU@onn6HD Y`p'pp#JqԦ@h[7W7):~8pu ~`y\ݚaEO~|N~ nk#'3Y\F?YdD|غ)4ɫM8Uo8Up0 @_^Yo |Kuq^l I$ɕ,YqO^1f7pU`]JZl(P1A.[ =ag eZ_^Ib~UGӁ;mbV!g RG;",ziVT/v 2GS;iS,G#a7+1P7m6 ā~} O+;K$>Qan@^3{;2HoitRlWI,Fe|&\@+awbQl?~,DT^v7!l3pONQak\bY(_h>6 LC܅ׁ,?fV$>Q=Sdo:VH|B`xT1'O 9Oj0]CeٿK|bYf]?8WTeX\u;3mfsιPg62m3IIk:FStv4g>#f^1gh8 '5Tp%q'$zI>7+nC4` ;?Z&΍֠r6~F`n5a5'5v5ڤ K?[P,ؓ&Ⴂ64w*~笎4IœB9o#[8&sSYL|ι峸&c29Xk+Ϧq!6[G b ^9.vsnY|/sɔsH7QΫiV7x5N^[CT˘ʓ؈35օm~ւ/I|us0%nurh8c Xh]4k;bcs((~vZ&(Pi&&an+;;!dYh#@#hD69I+&Θa?ImҼ1J%I]ιauj<_Hz+kS]V/?xb7ab<̵aAtQ{v3❁R+U# 5ûb xjq xLQA{;'6Z7j3- 6]QDi;Ygo zz"yҠy`Ԭ-4JbvF⥇(ru {vK4=J$E_+ͳsnXk"ضQtKHsh -SnEcNEQl!{Hx6G֐Ҝe|"l^IPX1{ï邅^{l{FNܟ'x3:*nGZMc |loap meIٍc~v)C,Y2"yWQ C{eP/o˵m8%Iw @ @ 5{R 6^Ͱkk\9HFQ4g3et'C^v+3/ o~yH/^li aºI_ uT+>:42f['p)mq N/>mx=~iwr:''B 88 88]Ưݎnm[;8tQx>kh93gk\e0r+p1'DnBBBH|BH|BOO! ! !$>!$>!$>UBBBH|BH|Bo/X}{`|IENDB`c>CL t.smartSEO/aa-framework/images/menu-bulb-off.png obPNG  IHDR ZIDATx;BAEDFf=l*{)ȏ#Xv.ڻl6O1e\`0fZV<}F Rl6gbjzn6kt:r~QGX,ޭ!3;y >׼IENDB`6}uK "h&-smartSEO/aa-framework/images/menu-bulb-on.png obPNG  IHDRW?PLTE+697Ptswm攳ˆ簲ɗᰴɣ`abcdqrs_ŸƣǢstZ_Ϭiتvزݬݯ߬ݷ޻z %tRNS #&&'(7;;@ChmhIDATuбN@E;;c! QhiiR#uݡ@nW#^Ax A=aFSJ9;H0mA5vQF j]O%m=a|/ ]-9"V5a]]ķI] V4֩\6e pٷm*?[&Auغƞ!]^N^;4FAԊaЁ"0&Dtv<] 2?8#lIENDB`G DD7+smartSEO/aa-framework/images/menu-hover.png obPNG  IHDR  IDATc`LqVIENDB`6BL  m.smartSEO/aa-framework/images/message-error.png obPNG  IHDRw=PIDATx^UmlS~=ڭ[׍ֱ†L0:ĉ&  /F#|,Q "J$ D.lc L6`m}ǜ1>/y<>w^ \Ig10 kZT(i[c#_垵fG~ ՑhI K1yߏ@g=HC 4utcWc κlKf=U՜+KAZi c%0:{ہֵwip*/Zfe-jc0K&ƦGDPV#k^5qs78&LCH3sU^ڼ" E eUM SK!kK_YJfxOCVKC+krd*#p$dF!)9AV rؕpzp9ri@&[im o[akgq! 9񾴮*6޽5.PA~yIGP칠>AH#ȶLuwA6ȱd[uVWb-Dۺ489BE2hC\{{D4.v;&   lripsDAD)vZ%.1kt%APB0LX0]穜 ȨF4 "W=n$(orN)2,N!@7ג@EÁ1>H0:Ӏfa0 .fqVuc@@)JD#ј>6} >TT0ן QU@Q@ **Ahq/WT^:ٌHk FFF!jzXԠ͆F `tQߡ/WtכS\1> p w#qd͍@=1̀يߞ5u[n3=0T((!Aqe(x_JCcqB75aXnM^D 5*[ z*"09RYu;8'uY%ܤVtlٻk:dM7ˊKjkX,`CFS%džèDS;lG=-P-?l޹@`SSՎ<))IDB2( e`UzicӝM6=,>4ɝ56Ӗ\S՚: 1Ƙ}x'C7/۟TC"(5:! QA/()wo' ۜl˲{{`|{2Ii;qPe:G(xw7IENDB`ƺK  .=-smartSEO/aa-framework/images/message-info.png obPNG  IHDRw=IDATx^UklULwvwٶTZр`QcPc$< QH4!F h"$< ZjA@c>Xvvii}uZ"b<ɜ|;jo8 VZ N)@A A$|4u;.`B^ΆJ%%Yg D@(8Fpސ;MMP~^SU%E< Ճ?#*{eiqzzƻݽe6>0oG]8}D㠗xo.?Yf p U.AM[!Do5nrַt b@) J9F 'b8XcF t_z=L n.v?g"B4l m\:Y6ƈoKݦ;޾|[/]Q;@A@8!U02Q18A02i ů9p5{5ݮNSL?RxIE0&h `4ǎ3ِD0ˇ;t|Y;Xn[spG*8ߊ6cJ3鬗t0R&˥>@Yמ9S~hSn yzG X*@U(U7n?ny84\@=,gs~X?wFmњKPʆ(( uo>:} D&0qryZCEncŶ={LlmxVgs,aYbIq9{؟%=F.[IENDB`~CN  }|р0smartSEO/aa-framework/images/message-success.png obPNG  IHDRw=IDATxڝ}Lu?:b%%A*&IԆXG9e p,0̰0@$3K}>{~}>=ШRҬ]%&ӻwZl/,w,?Hh˜m4ƭ%TڛR(l؀S>k8Z}Gh | M%1&RheC|}KPf@i{Nυv0] »yXqPp NnWǙak#jpm.lY͏R)xD4s֧ \HA~%Ա/Zl=7*hE})v+u蓮OJ;T htٺAo~ W艈>#"?(G0w K[p 'C7 !)r]Gka:q38Nr&5R+ CX4τo6%?5|2;a3iY˞rJF aiAd:H'xqYhVtg;#afZLjV21HO WʏɱoeOΤFj%̎Yl~u8JXOŲ=9gL5 Z2_=&CIENDB`bBJN r0smartSEO/aa-framework/images/message-warning.png obPNG  IHDRשPLTE68 G]V8-B31D<=e+c+N%N&EEE b'_+\+],b-l.l.n-s.t/|4{9=ƆDƆEɆ<ɇAΑK֙Jؤ`إc֞TޥLߧHQ\NIߧGAEI߬[gO_.n;=w::\=;LDFBkJ[PfaWOpRa[[aSXe[^s`d_gffmjkimoro`rpqsQwuettv|zkyy}{L~pvTS֛B؝CFG &(/. &3,786;'?,E?/CTV3HuGMwHNR7NM[Y\2ж-)6R!ΦdЕfs55jg# 03n Pv 4662}Bg2D\H/h̬̾@OHC7EMbs%# A`YR@ ls}0˅0Lsd &e%Y1 IYF3IENDB`q.M 00&/smartSEO/aa-framework/images/meta-box-icons.png obPNG  IHDR-ፊ pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F IDATx{pTyggW+f@@& 0PIl:I4.%LĤq;{2Bd0`nf4F.svϥJV<3;;绝[={Y {o:1g^]3:z)K^4mE8# :E~=j6P+?' :;;A4A@uAv%%%ہ~ Zȩ/o^Τ &E@bI`{$Ax<8Hxg83#9ږMC7ojP-6@BE*++16h . ]蠮AvyjrJ|>߰NN:E"1ov5e' Am4>n0˲L("!2$ŰX^H8/,_||>˗/gw{ܠIx^,js!$IBEQ$ 1'߉njjjvO(J9&&NbUUa61/EQsef3Fw"gRdF,nƶT<*KǮQh@^ՊiQӴA-r8߉ie|/=9ׁt)\_E`piڨ8nYC$CQy͛9i7oﰳ[iTO29ޓϠKF'b{(6TWWZ0EN0|0dӬZ*cӧ .15G]5ПVVn,iχBj`NkF$aƌH0)18{,ǎq;ٳgK`,u |ϠKaBtң%%%EQwtt Icit]GeTUe@oo[-Zil @{əFI$x^~?V3wgM#&#2 ;PWWKE;k,W8p8,Y̙3s-326tNdDMftdu]4O_744\hll,Ub _Z[[?;aXXj+Wxws&hNd˓ 2| N2|dbwYwIf=(6K< aلݢ(8l^7V,$[7˩/Lh@ÎϤ E@⡒le:Ds2_]fj>U_H$ܒM\֥ j[7 .$VCČSfsӓ66>~T-~X2q7TxL<8[e0NynzOj,kLkk͆s`+.Lې#M)t)V$-s|wIpb3~qXzw<Ģ`Izfae? ` MMV  hdXa%oA`/b|})U̼{*nwϼ{*S*3E4 sx(E$Il{ zc->,6dx;\-IS;W{p9j(ٶ~ +H ӡV{҇صP;2UUs 6+XR6GV ,h$V$&-צ;)m)G9NW]Dǘ@ԑw gU;UI C7,7̥OpBO(>@1l$$I)I$JTI%)$IO9ĎOrT]Of^OWƨeR֗q0bVHզ]e$]IN{op*?"-W&?a`de[ OUTFE0ZGұz6ID\S@g\0 _1'2Zstk2*48u 6=wXjw/hq,v$*Qo7ˏu2I$j$IOTI%)$INVgO.̜C !K/_<lȭSLYE١X״Azu/s)stmaxph;W:? Q_NW˓/ӺEFUF$zֽi{{Umߢc>$q1C9k'1!)I$I$TI%)$IJI$RI$I%)$IJI$STʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$HH0221ld,Photoshop 3.08BIMZ%G XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@      dl  s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?v*UثWb]v*UثWv*UثWb]v*UثWv*UثWb]v*UثWv*UثWb]v*UثWv*Uo?0O/ߙWyw֚,ZT6 #A%iYrMPPTSxw^` qVAoesOO^rk]o K<FnU^O>y+H\t]cko_n{Kk}9|U8Wb]v*U/JsrX.S\Uf`8Wzޓ`~4늳4ٖW9O%"~Y]T5_F]v*v*U~N-+MIM>ҡe+e3b^e֧>+Orj~U^aզѣ<Ũ[[}/՘lquU5Gja#2#koy$;;m^q< {>֋`6 'V.Huw7q^[ UPwr6q4vwy}:Lqc|O Hr>DO31ӻv*Uثv*U|_XdRִO.t̰g Er݁_=C8d2[y{aߘ?>B|}m}*R8f20 Qy@Fav >I@O˗ &=_h`Ó'俘0@4*X\Mi躵2<-K8ߓwNpqeCat#"G.ɧ͓)28 D"Ȯ[g%tGR~-em>#qhcAALßLL˄A_9#  @^$xx#G7(߫U&j (n' P|ч' %aCWb_v*U~nͺ|eyHky, l0j}}vU#C܋V_GJ5/2h }CHmelK$RSH,p g zrmriG.)p2.!^O-KjLvZ]†Dњu y泰sb~ haz#[D)&iGfF}ll!a N5#7rd%8si0e2 Adobe Photoshop CC (Windows) 2014-03-18T12:50:26+02:00 2014-03-18T12:50:26+02:00 2014-03-18T12:50:26+02:00 xmp.iid:6db3917e-9035-944b-88c6-66072c7313e2 xmp.did:f09a03b7-8191-3c4f-964d-4e00e8bd2e8a xmp.did:f09a03b7-8191-3c4f-964d-4e00e8bd2e8a created xmp.iid:f09a03b7-8191-3c4f-964d-4e00e8bd2e8a 2014-03-18T12:50:26+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:6db3917e-9035-944b-88c6-66072c7313e2 2014-03-18T12:50:26+02:00 Adobe Photoshop CC (Windows) / 5 5 3 image/png 1 720000/10000 720000/10000 2 65535 31 31  cHRMz%u0`:o_F+IDATxVo02MӾT -$hd%Ql߻{g'9|V5kͬ312)3z@ `x 7}Wf${bpLlV(H&/N>ML|(<"m[Jz}Rmw$Yf9$&h)efQ\|zB%4J2l`KNy@z_{f-mf}/5!K\_;{ILgy}1?%q$@o1"{y4xm=.`Oeo]1ۤ^3%&u[K ">X&:>n Ȗj-'{}n NFԹ9hw̌5Hc:H&*Wj5΅Bc^ t&Yfv[j\?pXuEf;ݙt7ZRI3ۤ;ܞIENDB`PqSK QQbk/smartSEO/aa-framework/images/scrollbar-grip.png obPNG  IHDRRWIDATxcHIIl&<`I %(KIENDB`f7O OOﻌf3smartSEO/aa-framework/images/scrollbar-thumb-bg.png obPNG  IHDR()IDATc ?8CU IENDB`C=O SSDk3smartSEO/aa-framework/images/scrollbar-track-bg.png obPNG  IHDRXIDATxcصk_N2>q'*t,IENDB`J J2,smartSEO/aa-framework/images/search-icon.png obPNG  IHDRw=IDATxc`\\\$m._H+Rp+ X no@)

    `$NgPB-_D$!%9 hdoG2ԲTE ːPANe@O 8>eJ]ZBF Ns*qqtIENDB`u5G   7@)smartSEO/aa-framework/images/seotitle.jpg obExifII*Duckyd/http://ns.adobe.com/xap/1.0/ AdobedX  ?zS;gH;x"&#,-]Rwe)puHP^ \Ǖ,^dmύ 5$#QWk+4f4hPUyBr4{WMVg.!n8~t]z7 qPF6s?RZ,XBmSVmF6z̨H 9) @*{YIENDB`E pp+I)smartSEO/aa-framework/images/sort_asc.png obPNG  IHDRl7IDATxc` ,<I 9C  A4!j,IENDB`LF pp*smartSEO/aa-framework/images/sort_desc.png obPNG  IHDRl7IDATxc` >f P@Jk 97, ]IENDB`Į C ''ڀ%smartSEO/aa-framework/images/star.gif obGIF89a6&&m*RC2f[R)9Yv pJyk1hzK 1rK&C)D* b%>"-5&jiM&:=/#tp51GR-7+y8#5?<}#1W/8.1A1LsQ߂&9߁2?>S#5c\ h! NETSCAPE2.0! XMP DataXMP ~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!  ! ,р~'z}p}}}Xff}f??z%'ôQzX}F~ނQQ[[đd\KtH?q Ԯ vda HLܦzaHga$M<,T!Kΰ!EE>zaV@! ,Q%p[ * %  MMkXM//M Xbb[zQXb bXF /**E؟* A33 ɫ'2h7H"TµH!,3SHDHLvb"#7HEH4Rʉ ;~RS YHÇd䗫}33ҁZfIt'X5n3PNjPNkB&kD<]S&ݒXS aK!8iDz>T$FXB5]ġ0'# ! ,WzIhU00%JSv<e+=:xPAxx OgvS)w4ct: lڎ{*{jQV@t71̨TVKx,W/x$6y<$ Сd璐: YkR ! ,sNL""!@2!7cc72  C 9##C,#--#,Zmr--rm!d9 .. 9dnZ2@w ,r :5: r w@LC!2"9r:5. #9X,^}s@# a AEIhr,(efčl1!HPLp, -0N̑ Q2`̓C$)LG, 0',091YY-kr|e 1 nˠӘe-Xr H!X,'GQdҚS1 fc8E8;``ZKDDHhJ~D bU$ w*EM]@! ,l`H{66{`K++K>+oG^^G 7^;;^7 &\\&Ce\OO\eCqq $"7&e8OO8e&>G$|ojo6T&^))\;e^>kw _>d៏%6ڹ; GC`Ⰻ"C0EԬH,Ȇ͞a(_Y|XrKxSM *OvвIY1AƦ gh,[eoCbcYbՍb2 Q$0T0=/&ʍ qwsh*"cD||Z:I RsFJ  nj! ,Ѐ~'z}p}}}Xff}f??z%'ôQzX}F~ނQQ[[đd\KtH?q Ԯ vda HLܦzaHga$M<,T!Kΰ!EE>zaP ! ,Q%p[ * %  MMkXM//M Xbb[zQXb bXF /**E؟* A33 ɫ'2h7H"TµH!,3SHDHLvb"#7HEH4Rʉ ;~RS YHÇd䗫}33ҁZfIt'X5n3PNjPNkB&kD<]S&ݒXS aK!8iDz>T$FXB5]ġ0'# ! ,WzIhU00%JSv<e+=:xPAxx OgvS)w4ct: lڎ{*{jQV@t71̨TVKx,W/x$6y<$ Сd璐: YkR ! ,sNL""!@2!7cc72  C 9##C,#--#,Zmr--rm!d9 .. 9dnZ2@w ,r :5: r w@LC!2"9r:5. #9X,^}s@# a AEIhr,(efčl1!HPLp, -0N̑ Q2`̓C$)LG, 0',091YY-kr|e 1 nˠӘe-Xr H!X,'GQdҚS1 fc8E8;``ZKDDHhJ~D bU$ w*EM]@! ,l`H{66{`K++K>+oG^^G 7^;;^7 &\\&Ce\OO\eCqq $"7&e8OO8e&>G$|ojo6T&^))\;e^>kw _>d៏%6ڹ; GC`Ⰻ"C0EԬH,Ȇ͞a(_Y|XrKxSM *OvвIY1AƦ gh,[eoCbcYbՍb2 Q$0T0=/&ʍ qwsh*"cD||Z:I RsFJ  nj;kM I؀-smartSEO/aa-framework/images/stars_sprite.png obPNG  IHDRP_G@x pHYs  9iTXtXML:com.adobe.xmp Adobe Photoshop CC (Windows) 2014-03-18T10:57:22+02:00 2014-03-18T10:57:22+02:00 2014-03-18T10:57:22+02:00 xmp.iid:95fb20c1-d02d-e440-ba58-6887158d54e6 xmp.did:1b0b087e-5197-e648-85cf-aac1e609cb04 xmp.did:1b0b087e-5197-e648-85cf-aac1e609cb04 created xmp.iid:1b0b087e-5197-e648-85cf-aac1e609cb04 2014-03-18T10:57:22+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:95fb20c1-d02d-e440-ba58-6887158d54e6 2014-03-18T10:57:22+02:00 Adobe Photoshop CC (Windows) / image/png 3 1 720000/10000 720000/10000 2 65535 80 95 p cHRMz%u0`:o_FIDATxml[8Qu@Zl-0Rg-ԱvT u "iixěIc*{Ҵ!*b@lHBh PUJ 4E)!pEFS^{d"vs}~Ɗoh&|;x3D $͐}58~όcBv^xNk&"p P ѿoFܣ'@/(@2n.X+{A}Oh4)`o~#[e| "`\r}3zYoxX@FdX2.2z^BJ`s`~Γ$>!^v>+}ΈHoΛ,5oI/ex x C`fā׀P6^}x/ _Qx"@ 5T ` &5m׀xWjnkyy\&î#x'e՞D\|wy ?xMN7K/+vBG63u.+Yxy}f G"vzK }ϕݦQN6#6a=iU>[/ǴO#>}cmN#ڇ3#`7Z5"kS 2Mf% e:(w6rs>r`'ufp }ϓnx^[$oAK>(xְHz d\|q~tݻ>#dzuwC+2tLk7`ZYnCfHNzPP?p (_0se }p@κSz5:25ح|ir5zΪfs lNRY)qVЌd21L^|7ށf$4$?\|R:(eLZv͸/l,puNfQHl6Z혎mg\oM$_m `9͍ٶb&˲H$$ H&2bE(J88 PJMROkגdqq4;UcBP(v(GA|*ϟ?"|ޖ;qVAbg~dRgdXsss`ضdY>ұXlCZLMM~ԩSEQqVR\)R855uR|*8̶q_+RIƝeΏ굠$gyֻ1 ~t(Q<U9 R>yL)iL# L3<}4%R尝e}y`Pf[=kiF{`،51,/@Cˋzr{`)3jXRtP(HXeU*-,k恦hy:|G<"47@o{ H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F,IDATxb```?2f``@Ql l<h%IENDB`(K JJ%i/smartSEO/aa-framework/images/submenu-shadow.png obPNG  IHDRԭ IDATc oPLTEDJIB|D>wAzFEIFJK;BBCDEFDGFHHHIKJMN,Z`9RbMmNQRz}a#tRNS '.1259BCH"IDAT;RAyXV)'f&D-pgw1 EBX! M9@]-})qfgSz|զ^^gw(1x:76l7;g2J*9T 2B̜sH(p{Rf߇#jsCl!_IENDB`VWN g0smartSEO/aa-framework/images/user-drop-arrow.png obPNG  IHDR٫^GIDATxc` ėcW4A|cjah42Pfc6jğ4X,%E=3j^;IENDB`,D B &smartSEO/aa-framework/images/_logo.png obPNG  IHDRJ4tEXtSoftwareAdobe ImageReadyqe<&iTXtXML:com.adobe.xmp j6IDATx[q0Şk)K%\.%\g߬&rfv&ۏ4MQ@` : : ّ]D8L{7 \9¦!@dah7\mwt;ViFrN!BCd>V !ܧ2Je)Cx>"t0LH5jף9DvQ[ "_"^wTA:r CC._aƄ>6*ulj#xz@hOD5EAn z򞖹7A>+A*-7Dǟ$tK$3S<<`HBh|X;zJuoÍHon'PH]| ;;\VA* }'K'@_Fl!ʺvys=h"JdqA垊kEځ7 #X :ݺ rj5OR iWͤ ДMG0ms.KQ&:"K [eOy55^Q]etѳF;r5P5\mh>55ya l[rOyrGg9|5k^1so:%WKuXo]M}Tk"}@7YIO܇x lXI,#<1|g_zn-Z9dV(g*\t0ߪ9'_~y}$QQZ>"%LԠ*lP ]'v@xrG}hlfF‡*&t?gY*ü`IX8@ '+(|+t~¦\Ѹ2GC9LHt](0 C<Ƿ$oA;evHn;RSXpFZ纨ʁM e,[cjxBA&0jٞÇ0^Ix]C!Zэ67Dd}r;\> }cL[7s%fqX [^hiOaK!| 5ǹ>IENDB`w#jA TO'!smartSEO/aa-framework/js/admin.js ob/* Document : aaFreamwork Created on : August, 2013 Author : Andrei Dinca, AA-Team http://codecanyon.net/user/AA-Team */ // Initialization and events code for the app pspFreamwork = (function ($) { "use strict"; var t = null, ajaxBox = null, loading = null, in_loading_section = null, maincontainer = null, mainloading = null, lightbox = null, section = 'dashboard', // menu main section subsection = '', // menu sub-section subistab = '', // menu section tab (not sub-section) subsectgo = '', // menu sub-section as for css class topMenu = null, debug_level = 0; var upload_popup_parent = null; // init function, autoload (function init() { // load the triggers $(document).ready(function(){ t = $("div.psp" ), ajaxBox = t.find('#psp-ajax-response'); topMenu = t.find('nav.psp-nav'); // menu already setted if ( topMenu.find('>ul').length ) { var currentnav = topMenu.find('>ul').data('currentnav') || ''; currentnav = $.trim(currentnav); if ( '' != currentnav ) { menuSetSection( currentnav ); } } // plugin depedencies if default! if ( $("li#psp-nav-depedencies").length > 0 ) { section = 'depedencies'; } maincontainer = $("div.psp-content"); mainloading = $("#psp-main-loading"); lightbox = $("#psp-lightbox-overlay"); triggers(); fixLayoutHeight(); }); })(); function setCookie(cname, cvalue, exdays) { var d = new Date(); d.setTime(d.getTime() + (exdays*24*60*60*1000)); var expires = "expires="+ d.toUTCString(); document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; } function getCookie(cname) { var name = cname + "="; var decodedCookie = decodeURIComponent(document.cookie); var ca = decodedCookie.split(';'); for(var i = 0; i

    ' + ( label ) + ''); ajaxBox.html(loading); } function take_over_ajax_loader( label, target ) { loading = $('
    ' + ( label ) + '
    '); if( typeof target != 'undefined' ) { target.append(loading); }else{ t.append(loading); } } function take_over_ajax_loader_close() { $('.psp-sidebar').css('display','table-cell'); t.find(".psp-loader-holder-take-over").remove(); } //:: PLUGIN MENU function menuSetSection( ss ) { if ( typeof ss !== 'undefined' ) { if ( $.trim(ss) != '' ) { section = $.trim(ss); } } var __tmp = section.indexOf('#'); if ( __tmp == -1 ) { subsection = ''; } else { // found subsection block! subsection = section.substr( __tmp+1 ); section = section.slice( 0, __tmp ); } if ( subsection != '' ) { subistab = ''; var __re = /tab:([0-9a-zA-Z_-]*)/gi; //new RegExp("tab:([0-9a-zA-Z_-]*)", "gi"); if ( __re.test(subsection) ) { var __match = subsection.match(__re); //__re.exec(subsection); //null; subistab = typeof (__match[0]) != 'undefined' ? __match[0].replace('tab:', '') : ''; } } subsectgo = ''; if ( subsection != '' ) { subsectgo = '--' + subsection; if ( subistab != '' ) { subsectgo = '--' + subistab; switch (section) { } } } var ret = { 'section' : section, 'subsection' : subsection, 'subistab' : subistab, 'subsectgo' : subsectgo } //console.log( 'menuSetSection//', ret ); //console.log( 'global//menuSetSection//', section, subsection, subistab, subsectgo ); return ret; } function menuTriggers() { if( getCookie('psp_sidebar_collapsed_active') == 'true' ) { $('.psp-section-collapse_menu').click(); } // responsive??? $('.psp-responsive-menu').toggle(function() { $('nav.psp-nav').show(); }, function() { $('nav.psp-nav').hide(); }); // click on menu links topMenu.on("click", "a", function(e){ var that = $(this), href = that.attr("href"); var current_open = topMenu.find("li.active"); if( !that.parent('li').eq(0).hasClass('active') ) { $('.psp-sidebar').hasClass('psp-sidebar-collapsed') ? that.parent("li").eq(0).find(".psp-sub-menu").show() : that.parent("li").eq(0).find(".psp-sub-menu").slideDown(250); that.parent("li").eq(0).addClass("active"); } // is top menu item? if ( href == "javascript: void(0)" ) { // close previous open menu $('.psp-sidebar').hasClass('psp-sidebar-collapsed') ? current_open.find(".psp-sub-menu").hide() : current_open.find(".psp-sub-menu").slideUp(350); current_open.removeClass("active"); } }); /*topMenu.find('li').hover(function(){ if( !$(this).hasClass('psp-section-collapse_menu') ) { $(this).addClass('hover_active'); $(this).find('a').click(); } }, function(){ if( !$(this).hasClass('psp-section-collapse_menu') ) { if( !$(this).hasClass('hover_active') ) { $(this).find('a').click(); } } }); topMenu.on('mouseout', 'li ul', function() { $(this).parent('li').eq(0).removeClass('hover_active');//find('a').click(); });*/ } function menuActiveSection( callback ) { var callback = callback || false; if( !$('.psp-sidebar').hasClass('psp-sidebar-collapsed') ) { // find new current menu to become open var new_open = topMenu.find( '.psp-section-' + section + subsectgo ); var in_submenu = new_open.parent('.psp-sub-menu'); var in_subsubmenu = new_open.parent('.psp-sub-sub-menu'); // check if is into a sub submenu if ( in_subsubmenu.size() > 0 ) { in_submenu = in_subsubmenu.parent('li').parent('.psp-sub-menu'); } //console.log( 'menuActiveSection//', [new_open, in_submenu, in_subsubmenu] ); // close previous open menu var current_open = topMenu.find("> li.active"); if ( current_open != in_submenu.parent('li') ) { current_open.find(".psp-sub-menu").slideUp(250); current_open.removeClass("active").find('.active').removeClass("active"); } // open current menu in_submenu.find('.active').removeClass('active'); new_open.addClass('active'); // check if is into a submenu if ( in_submenu.size() > 0 ) { if ( ! in_submenu.parent('li').hasClass('active') ) { in_submenu.slideDown(100); } in_submenu.parent('li').addClass('active'); } // is dashboard? if ( section == 'dashboard' ) { topMenu.find(".psp-sub-menu").slideUp(250); topMenu.find('.active').removeClass('active'); topMenu.find('li#psp-nav-' + section).addClass('active'); } } // callback - subsection! if ( $.isArray(callback) && $.isFunction( callback[0] ) ) { if ( callback.length == 1 ) { callback[0](); } else if ( callback.length == 2 ) { callback[0]( callback[1] ); } } } function makeRequest( callback ) { // fix for duble loading of js function if( in_loading_section == section ){ $('.psp-sidebar').css('display','table-cell'); //if( !$('.psp-sidebar').hasClass('psp-sidebar-collapsed') ) { menuActiveSection( callback ); //} return false; } in_loading_section = section; // do not expect the request if we are not into our ajax request pages if( ajaxBox.size() == 0 ) return false; ajax_loading( "Loading section: " + section ); var data = { 'action' : 'pspLoadSection', 'section' : section, 'subsection' : subsection }; // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php $.post(ajaxurl, data, function(response) { if(response.status == 'ok'){ $("h1.psp-section-headline").html(response.headline); ajaxBox.html(response.html); makeTabs(); if( !$('.psp-sidebar').hasClass('psp-sidebar-collapsed') ) { menuActiveSection( callback ); } if( typeof pspDashboard != "undefined" ){ pspDashboard.init(); } multiselect_left2right(); init_custom_checkbox(); $('.psp-sidebar').css('display','table-cell'); } }, 'json'); } function importSEOData($btn) { var theForm = $btn.parents('form').eq(0), value = $btn.val(), statusBoxHtml = theForm.find('div.psp-message'); // replace the save button value with loading message $btn.val('import settings ...').removeClass('blue').addClass('gray'); if(theForm.length > 0) { // serialiaze the form and send to saving data var data_nb = { 'action' : 'pspimportSEOData', 'options' : theForm.serialize(), 'from' : theForm.find('#from').val(), 'subaction' : 'nbres' }; // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php $.post(ajaxurl, data_nb, function(response) { var nbrows = response.nbposts; //parseInt( response.nbrows ); if(response.status == 'valid' && nbrows > 0 ) { statusBoxHtml.removeClass('psp-error').addClass('psp-success').html(response.html).fadeIn(); //importSEOData_loop($btn, 0, nbrows); importSEOData_loop($btn, 0); } else { statusBoxHtml.delay(15000).fadeOut(); } }, 'json'); } } //importSEOData_loop($btn, step, nbrows) function importSEOData_loop($btn, last_id) { //var step_increase = 10; // DEBUG var theForm = $btn.parents('form').eq(0), value = $btn.val(), statusBoxHtml = theForm.find('div.psp-message'); //if ( nbrows <= step ) { if ( last_id == -1 ) { statusBoxHtml.delay(30000).fadeOut(); // replace the save button value with default message $btn.val( value ).removeClass('gray').addClass('blue'); //return false; // DEBUG! setTimeout(function(){ window.location.reload(); }, 30000); return true; } // serialiaze the form and send to saving data var data = { 'action' : 'pspimportSEOData', 'options' : theForm.serialize(), 'from' : theForm.find('#from').val(), //'step' : step, //'rowsperstep' : step_increase 'last_id' : last_id }; // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php $.post(ajaxurl, data, function(response) { var __oldResHtml = statusBoxHtml.html(), __newResHtml = __oldResHtml + '
    ' + response.html; if(response.status == 'valid'){ statusBoxHtml.removeClass('psp-error').addClass('psp-success').html(__newResHtml).fadeIn(); }else{ statusBoxHtml.removeClass('psp-success').addClass('psp-error').html(__newResHtml).fadeIn(); } last_id = response.last_id; //importSEOData_loop($btn, step + step_increase, nbrows); setTimeout(function() { importSEOData_loop($btn, last_id); }, 1000); }, 'json'); } function installDefaultOptions($btn) { var theForm = $btn.parents('form').eq(0), value = $btn.val(), statusBoxHtml = theForm.find('div.psp-message'); // replace the save button value with loading message $btn.val('installing default settings ...').removeClass('blue').addClass('gray'); if(theForm.length > 0) { // serialiaze the form and send to saving data var data = { 'action' : 'pspInstallDefaultOptions', 'options' : theForm.serialize() }; // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php $.post(ajaxurl, data, function(response) { if(response.status == 'ok'){ statusBoxHtml.addClass('psp-success').html(response.html).fadeIn().delay(3000).fadeOut(); setTimeout(function(){ var currentLoc = window.location.href, newLoc = currentLoc.indexOf('#') > 0 ? currentLoc.replace(/#.*$/, '#modules_manager') : currentLoc + '#modules_manager'; window.location.replace( newLoc ); window.location.reload(); }, 1000); }else{ statusBoxHtml.addClass('psp-error').html(response.html).fadeIn().delay(13000).fadeOut(); } // replace the save button value with default message $btn.val( value ).removeClass('gray').addClass('blue'); }, 'json'); } } function saveOptions($btn) { var theForm = $btn.parents('form').eq(0), theForm_id = theForm.attr('id'), value = $btn.val(), statusBoxHtml = theForm.find('div#psp-status-box'); // replace the save button value with loading message $btn.val('saving setings ...').removeClass('green').addClass('gray'); multiselect_left2right(true); var options = theForm.serializeArray(); //console.log( $.param( options ) ); return false; // Because serializeArray() ignores unset checkboxes and radio buttons, also empty selects var el = { inputs: null, selects: null }; el.inputs = theForm.find('input[type=checkbox]:not(:checked)'); el.selects = theForm.find('select:not(:selected)'); el.selects_m = theForm.find('select[multiple]:not(:selected)'); //for (var kk = 0, arr = ['inputs', 'selects'], len = arr.length; kk < len; kk++) { // var vv = arr[kk], $vv = el[vv]; for (var kk in el) { if ( 'psp_title_meta_format' == theForm_id ) { continue; } if ( $.inArray(kk, ['selects_m']) > -1 ) { options = options.concat(el[kk].map( function() { return {"name": this.name, "value": this.value} }).get() ); } } //console.log( $.param( options ) ); return false; if(theForm.length > 0) { // serialiaze the form and send to saving data var data = { 'action' : 'pspSaveOptions', 'options' : $.param( options ), //theForm.serialize(), 'opt_nosave' : ['last_status', 'profile_last_status'] }; // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php $.post(ajaxurl, data, function(response) { if(response.status == 'ok'){ statusBoxHtml.addClass('psp-success').html(response.html).fadeIn().delay(3000).fadeOut(); if(section == 'synchronization'){ updateCron(); } // special cases! - local seo if(section == 'local_seo'){ // refresh to view the saved slug! window.location.reload(); } } // replace the save button value with default message $btn.val( value ).removeClass('gray').addClass('green'); }, 'json'); } } function moduleChangeStatus($btn) { var module = $btn.attr('rel'), value = $btn.text(), the_status = $btn.hasClass('psp_activate') ? 'true' : 'false'; // replace the save button value with loading message $btn.text('saving setings ...'); var data = { 'action' : 'pspModuleChangeStatus', 'module' : $btn.attr('rel'), 'the_status' : the_status }; // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php $.post(ajaxurl, data, function(response) { if(response.status == 'ok'){ // title & meta format activation => save its options if ( 'title_meta_format' == module && 'true' == the_status ) { var currentLoc = window.location.href, newLoc = currentLoc.indexOf('#') > 0 ? currentLoc.replace(/#.*$/, '#title_meta_format#tab:__tab1') : currentLoc + '#title_meta_format#tab:__tab1'; window.location.replace( newLoc ); function _check_loaded() { // _max_step & _interval => verify for maximum _interval * _max_step seconds ( mili seconds / 1000 ) var _check_el = null, _timer = null, _max_step = 50, _current_step = 0, _interval = 600; // in miliseconds function _check() { _timer = setTimeout(function() { _check_el = $('body .psp-saveOptions'); _current_step++; if ( ! _check_el.length && _current_step < _max_step ) { _check(); } else { clearTimeout( _timer ); _timer = null; _check_el.trigger('click'); } }, _interval); }; _check(); }; _check_loaded(); } else { window.location.reload(); } } }, 'json'); } function updateCron() { var data = { 'action' : 'pspSyncUpdate' }; // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php $.post(ajaxurl, data, function(response) {}, 'json'); } function fixLayoutHeight() { var win = $(window), pspWrapper = $(".psp-content"), minusHeight = 70, winHeight = win.height(); // show the freamwork wrapper and fix the height pspWrapper.css('height', parseInt(winHeight - minusHeight)).show(); $("div#psp-ajax-response").css('min-height', parseInt(winHeight - minusHeight - 240)).show(); $("#wpbody-content").css('padding-bottom', '40px'); $("#wpfooter").css('border', 'none'); } function activatePlugin( $that ) { var requestData = { 'ipc' : $('#productKey').val(), 'email' : $('#yourEmail').val() }; if(requestData.ipc == ""){ alert('Please type your Item Purchase Code!'); return false; } $that.replaceWith('Validating your IPC ( ' + ( requestData.ipc) + ' ) and activating Please be patient! (this action can take about 10 seconds)'); var data = { 'action' : 'pspTryActivate', 'ipc' : requestData.ipc, 'email' : requestData.email }; // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php $.post(ajaxurl, data, function(response) { if(response.status == 'OK') { var currentLoc = window.location.href, newLoc = currentLoc.indexOf('#') > 0 ? currentLoc.replace(/#.*$/, '#modules_manager') : currentLoc + '#modules_manager'; window.location.replace( newLoc ); window.location.reload(); } else{ alert(response.msg); return false; } }, 'json'); } function ajax_list() { var make_request = function( action, params, callback ){ take_over_ajax_loader('Loading...'); // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php $.post(ajaxurl, { 'action' : 'pspAjaxList', 'ajax_id' : $(".psp-table-ajax-list").find('.psp-ajax-list-table-id').val(), 'sub_action' : action, 'params' : params }, function(response) { if( response.status == 'valid' ) { $("#psp-table-ajax-response").html( response.html ); init_custom_checkbox(); take_over_ajax_loader_close(); //special cases var ajax_id = $(".psp-table-ajax-list").find('.psp-ajax-list-table-id').val(); if ( 'pspSERPKeywords' == ajax_id ) { pspSERP.wait_time(); } else if ( 'pspPageOptimization' == ajax_id ) { pspOnPageOptimization.multi_keywords.load({}); } } }, 'json'); } $(".psp-table-ajax-list").on('change', 'select[name=psp-post-per-page]', function(e){ e.preventDefault(); make_request( 'post_per_page', { 'post_per_page' : $(this).val() } ); }) .on('change', 'select[name=psp-filter-post_type]', function(e){ e.preventDefault(); make_request( 'post_type', { 'post_type' : $(this).val() } ); }) .on('click', 'a.psp-jump-page', function(e){ e.preventDefault(); make_request( 'paged', { 'paged' : $(this).attr('href').replace('#paged=', '') } ); }) .on('click', '.psp-post_status-list a', function(e){ e.preventDefault(); make_request( 'post_status', { 'post_status' : $(this).attr('href').replace('#post_status=', '') } ); }) .on('change', 'select.psp-filter-general_field', function(e){ e.preventDefault(); var $this = $(this), filter_name = $this.data('filter_field'), filter_val = $this.val(); make_request( 'general_field', { 'filter_name' : filter_name, 'filter_val' : filter_val } ); }) .on('click', 'ul.psp-filter-general_field a', function(e){ e.preventDefault(); var $this = $(this), $parent_ul = $this.parents('ul').first(), filter_name = $parent_ul.data('filter_field'), filter_val = $this.data('filter_val'); make_request( 'general_field', { 'filter_name' : filter_name, 'filter_val' : filter_val } ); }) .on('click', 'input[name=psp-search-btn]', function(e){ e.preventDefault(); make_request( 'search', { 'search_text' : $(this).parent().find('#psp-search-text').val() } ); }); } function googleAuthorizeApp() { $('body').on('click', ".psp-google-authorize-app", function(e){ e.preventDefault(); var $this = $(this), saveform = $this.data('saveform') || 'yes'; var ajaxPms = { 'action' : 'pspGoogleAuthorizeApp', 'saveform' : saveform }; if ( typeof saveform != 'undefined' && saveform == 'yes' ) { var form = $this.parents('form').eq(0), client_id = form.find("#client_id").val(), client_secret = form.find("#client_secret").val(); // Check if user has client ID and client secret key if( client_id == '' || client_secret == '' ){ alert('Please add your Client ID / Secret for authorize your app.'); return false; } ajaxPms.params = form.serialize() } $.post(ajaxurl, ajaxPms, function(response) { if( response.status == 'valid' ) { var newwindow = window.open( response.auth_url ,'Google Authorize App','height=400,width=550' ); } }, 'json'); }); } function facebookAuthorizeApp() { $('body').on('click', ".psp-facebook-authorize-app", function(e){ e.preventDefault(); var $this = $(this), saveform = $this.data('saveform') || 'yes'; var ajaxPms = { 'action' : 'pspFacebookAuthorizeApp', 'saveform' : saveform }; if ( typeof saveform != 'undefined' && saveform == 'yes' ) { var form = $this.parents('form').eq(0), client_id = form.find("#app_id").val(), client_secret = form.find("#app_secret").val(); // Check if user has client ID and client secret key if( client_id == '' || client_secret == '' ){ alert('Please add your Client ID / Secret for authorize your app.'); return false; } ajaxPms.params = form.serialize() } $.post(ajaxurl, ajaxPms, function(response) { if( response.status == 'valid' ) { var newwindow = window.open( response.auth_url ,'Facebook Authorize App','height=400,width=550' ); } }, 'json'); }); } function makeTabs() { // tabs $('ul.psp-tabs-header').each(function() { var child_tab = '', child_tab_s = ''; // For each set of tabs, we want to keep track of // which tab is active and it's associated content var $active, $content, $links = $(this).find('a'); var $content_sub; // If the location.hash matches one of the links, use that as the active tab. // If no match is found, use the first link as the initial active tab. var __tabsWrapper = $(this), __currentTab = $(this).find('li.tabsCurrent').attr('title'); $active = $( $links.filter('[title="'+__currentTab+'"]')[0] || $links[0] ); $active.addClass('active'); // subtabs per tab! var __child_tab = makeTabs_subtabs( $active ); child_tab = __child_tab.child_tab; if ( child_tab != '' ) child_tab_s = '.'+child_tab; $content = $( '.'+($active.attr('title')) ); if ( child_tab != '' ) { $content_sub = $( '.'+($active.attr('title')) + child_tab_s ); } // Hide the remaining content $links.not($active).each(function () { $( '.'+($(this).attr('title')) ).hide(); }); if ( child_tab != '' ) $( '.'+($active.attr('title')) ).not( 'ul.subtabsHeader,'+child_tab_s ).hide(); // Bind the click event handler $(this).on('click', 'a', function(e){ // Make the old tab inactive. $active.removeClass('active'); // subtabs per tab! var __child_tab = makeTabs_subtabs( $active ); child_tab = __child_tab.child_tab; if ( child_tab != '' ) child_tab_s = '.'+child_tab; $content.hide(); if ( child_tab != '' ) $content_sub.hide(); // Update the variables with the new link and content __currentTab = $(this).attr('title'); __tabsWrapper.find('li.tabsCurrent').attr('title', __currentTab); $active = $(this); // subtabs per tab! var __child_tab = makeTabs_subtabs( $active ); child_tab = __child_tab.child_tab; if ( child_tab != '' ) child_tab_s = '.'+child_tab; $content = $( '.'+($(this).attr('title')) ); if ( child_tab != '' ) $content_sub = $( '.'+($(this).attr('title')) + child_tab_s ); // Make the tab active. $active.addClass('active'); if ( child_tab != '' ) $content_sub.show(); else $content.show(); // Prevent the anchor's default click action e.preventDefault(); }); }); // subtabs $('ul.subtabsHeader').each(function() { var parent_tab = $(this).data('parent'), parent_tab_s = '.'+parent_tab; // For each set of tabs, we want to keep track of // which tab is active and it's associated content var $active_sub, $content_sub, $links_sub = $(this).find('a'); // If the location.hash matches one of the links, use that as the active tab. // If no match is found, use the first link as the initial active tab. var __tabsWrapper = $(this), __currentTab = $(this).find('li.tabsCurrent').attr('title'); $active_sub = $( $links_sub.filter('[title="'+__currentTab+'"]')[0] || $links_sub[0] ); $active_sub.addClass('active'); $content_sub = $(parent_tab_s + '.'+($active_sub.attr('title'))); // Bind the click event handler $(this).on('click', 'a', function(e){ // Make the old tab inactive. $active_sub.removeClass('active'); $content_sub.hide(); // Update the variables with the new link and content __currentTab = $(this).attr('title'); __tabsWrapper.find('li.tabsCurrent').attr('title', __currentTab); $active_sub = $(this); $content_sub = $( parent_tab_s + '.'+($(this).attr('title')) ); // Make the tab active. $active_sub.addClass('active'); $content_sub.show(); // Prevent the anchor's default click action e.preventDefault(); }); }); } function makeTabs_subtabs( active_tab ) { var ret = { 'child_tab': "" }; var $subtabsWrapper = $('ul.subtabsHeader').filter(function(i) { return ( $(this).data('parent') == active_tab.attr('title') ); }); $('ul.subtabsHeader').hide(); if ( $subtabsWrapper.length > 0 ) { $subtabsWrapper.show(); // For each set of tabs, we want to keep track of // which tab is active and it's associated content var $active, $links = $subtabsWrapper.find('a'); // If the location.hash matches one of the links, use that as the active tab. // If no match is found, use the first link as the initial active tab. var __tabsWrapper = $subtabsWrapper, __currentTab = $subtabsWrapper.find('li.tabsCurrent').attr('title'); $active = $( $links.filter('[title="'+__currentTab+'"]')[0] || $links[0] ); $active.addClass('active'); ret.child_tab = $active.attr('title'); } return ret; } function send_to_editor() { if( window.send_to_editor != undefined ) { // store old send to editor function window.restore_send_to_editor = window.send_to_editor; } window.send_to_editor = function(html){ var thumb_id = $('img', html).attr('class').split('wp-image-'); thumb_id = parseInt(thumb_id[1]); $.post(ajaxurl, { 'action' : 'pspWPMediaUploadImage', 'att_id' : thumb_id }, function(response) { if (response.status == 'valid') { var upload_box = upload_popup_parent.parents('.psp-upload-image-wp-box').eq(0); upload_box.find('input').val( thumb_id ); var the_preview_box = upload_box.find('.upload_image_preview'), the_img = the_preview_box.find('img'); the_img.attr('src', response.thumb ); the_img.show(); the_preview_box.show(); upload_box.find('.psp-prev-buttons').show(); upload_box.find(".upload_image_button_wp").hide(); } }, 'json'); tb_remove(); if( window.restore_send_to_editor != undefined ) { // store old send to editor function window.restore_send_to_editor = window.send_to_editor; } } } function removeWpUploadImage( $this ) { var upload_box = $this.parents(".psp-upload-image-wp-box").eq(0); upload_box.find('input').val(''); var the_preview_box = upload_box.find('.upload_image_preview'), the_img = the_preview_box.find('img'); the_img.attr('src', ''); the_img.hide(); the_preview_box.hide(); upload_box.find('.psp-prev-buttons').hide(); upload_box.find(".upload_image_button_wp").fadeIn('fast'); } function removeHelp() { $("#psp-help-container").remove(); } function showHelp( that ) { removeHelp(); var help_type = that.data('helptype'); var html = $('
    '); html.append("Close HELP") if( help_type == 'remote' ){ var url = that.data('url'); var content_wrapper = $("#psp-content"); html.append( '' ) content_wrapper.append(html); } } function multiselect_left2right( autselect ) { var $allListBtn = $('.multisel_l2r_btn'); var autselect = autselect || false; if ( $allListBtn.length > 0 ) { $allListBtn.each(function(i, el) { var $this = $(el), $multisel_available = $this.prevAll('.psp-multiselect-available').find('select.multisel_l2r_available'), $multisel_selected = $this.prevAll('.psp-multiselect-selected').find('select.multisel_l2r_selected'); if ( autselect ) { $multisel_selected.find('option').each(function() { $(this).prop('selected', true); }); $multisel_available.find('option').each(function() { $(this).prop('selected', false); }); } else { $this.on('click', '.moveright', function(e) { e.preventDefault(); $multisel_available.find('option:selected').appendTo($multisel_selected); }); $this.on('click', '.moverightall', function(e) { e.preventDefault(); $multisel_available.find('option').appendTo($multisel_selected); }); $this.on('click', '.moveleft', function(e) { e.preventDefault(); $multisel_selected.find('option:selected').appendTo($multisel_available); }); $this.on('click', '.moveleftall', function(e) { e.preventDefault(); $multisel_selected.find('option').appendTo($multisel_available); }); } }); } } function hashChange() { if ( location.href.indexOf("psp#") != -1 ) { // Alerts every time the hash changes! if(location.hash != "") { menuSetSection( location.hash.replace("#", '') ); if ( subistab != '' ) { makeRequest([ function (s) { $('.psp-tabs-header').find('a[title="'+s+'"]').click(); }, subistab ]); } else if ( subsection != '' ) { makeRequest([ function (s) { scrollToElement( s ) }, '#'+subsection ]); } else { makeRequest(); } } return false; } if ( location.href.indexOf("=psp") != -1 ) { makeRequest(); return false; } } function init_custom_checkbox() { $('.psp-main input[type="checkbox"]').each(function() { var $this = $(this); if( !$this.prev().hasClass('psp-custom-checkbox') ) { $this.wrap('
    '); } }); $('.psp-custom-checkbox').each(function() { var $this = $(this); if( !$this.find('input[type="checkbox"]').hasClass('input-hidden') ) { $this.prepend(''); $this.find('input[type="checkbox"]').addClass('input-hidden').hide(); } }); } function check_checkbox(elm) { var $this = elm; if( !$this.hasClass('checked') ) { $this.addClass('checked'); $this.parent().find('input').prop('checked', true); $this.parent().find('input').attr('checked','checked'); }else{ $this.removeClass('checked'); $this.parent().find('input').prop('checked', false); $this.parent().find('input').removeAttr('checked'); } } function triggers() { menuTriggers(); googleAuthorizeApp(); facebookAuthorizeApp(); init_custom_checkbox(); multikw_tabs.triggers(); //multikw_tabs.load( '.psp-multikw' ); $('body').on('click', '.psp-custom-checkbox .checkbox', function(e) { e.preventDefault(); var $this = $(this); if( typeof $this.parent().find('input').attr('id') != 'undefined' && $this.parent().find('input').attr('id').search('check-all') > 0 ) { if( $this.hasClass('checked') ) { $(this).parents('table').find('.psp-custom-checkbox').each(function() { $(this).find('.checkbox').removeClass('checked'); $(this).find('input').prop('checked', false); $(this).parent().find('input').removeAttr('checked'); }); }else{ $(this).parents('table').find('.psp-custom-checkbox').each(function() { $(this).find('.checkbox').addClass('checked'); $(this).find('input').prop('checked', true); $(this).parent().find('input').attr('checked','checked'); }); } }else{ check_checkbox( $this ); } }); $('body').on('click', '.upload_image_button_wp, .change_image_button_wp', function(e) { e.preventDefault(); upload_popup_parent = $(this); var win = $(window); send_to_editor(); tb_show('Select image', 'media-upload.php?type=image&height=' + ( parseInt(win.height() / 1.2) ) + '&width=610&post_id=0&from=aaframework&TB_iframe=true'); }); $('body').on('click', '.remove_image_button_wp', function(e) { e.preventDefault(); removeWpUploadImage( $(this) ); }); if ( typeof jQuery.fn.tipsy != "undefined" ) { // verify tipsy plugin is defined in jQuery namespace! $('a.aa-tooltip').tipsy({ gravity: 'e' }); } $(window).resize(function() { fixLayoutHeight(); }); $("body").on('mousemove', '.psp-loader-holder, .psp-loader-holder-take-over', function( event ) { var pageCoords = "( " + event.pageX + ", " + event.pageY + " )"; var clientCoords = "( " + event.clientX + ", " + event.clientY + " )"; var parent = $(this).parent(); var parentPos = parent.position(); event.pageY = event.pageY - 85; if( typeof parent != 'undefined' && !parent.hasClass('psp') ) { event.pageY = event.pageY - ( parentPos.top + (parent.height() / 2) + 50 ); } $(this).find(".psp-loader").css( 'margin-top', event.pageY + 'px' ); }); $('body').on('click', '.psp_activate_product', function(e) { e.preventDefault(); activatePlugin($(this)); }); $('body').on('click', '.psp-saveOptions', function(e) { e.preventDefault(); saveOptions($(this)); }); $('body').on('click', '.psp-installDefaultOptions', function(e) { e.preventDefault(); installDefaultOptions($(this)); }); $('body').on('click', '.psp-ImportSEO', function(e) { e.preventDefault(); importSEOData($(this)); }); $("body").on('click', '.psp-section-modules_manager a.psp_action_button', function(e) { e.preventDefault(); moduleChangeStatus($(this)); }); $('body').on('click', 'ins.iCheck-helper', function(){ var that = $(this), checkboxes = $('#psp-list-table-posts input.psp-item-checkbox'); if( that.is(':checked') ){ checkboxes.prop('checked', true); checkboxes.addClass('checked'); } else{ checkboxes.prop('checked', false); checkboxes.removeClass('checked'); } }); // Bind the hashchange event. $(window).on('hashchange', function(){ hashChange(); }); hashChange(); ajax_list(); $("body").on('click', "a.psp-show-docs-shortcut", function(e){ e.preventDefault(); $("a.psp-show-docs").click(); }); $("body").on('click', "a.psp-show-docs", function(e){ e.preventDefault(); showHelp( $(this) ); }); $("body").on('click', "a#psp-close-help", function(e){ e.preventDefault(); removeHelp(); }); multiselect_left2right(); /* $('body').on('click', 'input#psp-item-check-all', function(){ var that = $(this), checkboxes = $('#psp-list-table-posts input.psp-item-checkbox'); if( that.is(':checked') ){ checkboxes.prop('checked', true); } else{ checkboxes.prop('checked', false); } }); */ $("body").on("click", "#psp-list-rows a", function(e){ e.preventDefault(); $(this).parent().find('table').toggle("slow"); }); // publish / unpublish row $('body').on('click', ".psp-do_item_publish", function(e){ e.preventDefault(); var that = $(this), row = that.parents('tr').eq(0), id = row.data('itemid'); do_item_action( id, 'publish', row ); }); // delete row $('body').on('click', ".psp-do_item_delete", function(e){ e.preventDefault(); var that = $(this), row = that.parents('tr').eq(0), id = row.data('itemid'); //row.find('code').eq(0).text() if(confirm('Delete row with ID# '+id+' ? This action cannot be rollback !' )){ do_item_action( id, 'delete', row ); } }); $('body').on('click', '#psp-do_bulk_delete_rows', function(e){ e.preventDefault(); if (confirm('Are you sure you want to delete the selected rows ? This action cannot be rollback !')) do_bulk_delete_rows(); }); //all checkboxes are checked by default! $('.psp-form .psp-table input.psp-item-checkbox').attr('checked', 'checked'); // inline edit inline_edit(); } function do_item_action( itemid, sub_action, row ) { var sub_action = sub_action || ''; lightbox.fadeOut('fast'); //mainloading.fadeIn('fast'); take_over_ajax_loader( "Loading..." ); row_loading(row, 'show'); jQuery.post(ajaxurl, { 'action' : 'pspAjaxList_actions', 'itemid' : itemid, 'sub_action' : sub_action, 'ajax_id' : $(".psp-table-ajax-list").find('.psp-ajax-list-table-id').val(), 'debug_level' : debug_level }, function(response) { row_loading(row, 'hide'); if( response.status == 'valid' ){ //mainloading.fadeOut('fast'); take_over_ajax_loader_close(); //window.location.reload(); $("#psp-table-ajax-response").html( response.html ); init_custom_checkbox(); return false; } //mainloading.fadeOut('fast'); take_over_ajax_loader_close(); alert('Problems occured while trying to execute action: '+sub_action+'!'); }, 'json'); } function do_bulk_delete_rows() { var ids = [], __ck = $('.psp-form .psp-table input.psp-item-checkbox:checked'); __ck.each(function (k, v) { ids[k] = $(this).attr('name').replace('psp-item-checkbox-', ''); }); ids = ids.join(','); if (ids.length<=0) { alert('You didn\'t select any rows!'); return false; } lightbox.fadeOut('fast'); //mainloading.fadeIn('fast'); take_over_ajax_loader( "Loading..2." ); jQuery.post(ajaxurl, { 'action' : 'pspAjaxList_actions', 'id' : ids, 'sub_action' : 'bulk_delete', 'ajax_id' : $(".psp-table-ajax-list").find('.psp-ajax-list-table-id').val(), 'debug_level' : debug_level }, function(response) { if( response.status == 'valid' ){ //mainloading.fadeOut('fast'); take_over_ajax_loader_close(); //window.location.reload(); $("#psp-table-ajax-response").html( response.html ); init_custom_checkbox(); return false; } //mainloading.fadeOut('fast'); take_over_ajax_loader_close(); alert('Problems occured while trying to execute action: '+'bulk_delete_rows'+'!'); }, 'json'); } // inline edit fields var inline_edit = function() { function make_request( pms ) { var pms = pms || {}, replace = misc.hasOwnProperty( pms, 'replace' ) ? pms.replace : null, itemid = misc.hasOwnProperty( pms, 'itemid' ) ? pms.itemid : 0, table = misc.hasOwnProperty( pms, 'table' ) ? pms.table : '', field = misc.hasOwnProperty( pms, 'field' ) ? pms.field : '', new_val = misc.hasOwnProperty( pms, 'new_val' ) ? pms.new_val : '', el_type = misc.hasOwnProperty( pms, 'el_type' ) ? pms.el_type : '', new_text = misc.hasOwnProperty( pms, 'new_text' ) ? pms.new_text : ''; //console.log( row, itemid, field_name, field_value ); return false; loading( replace, 'show' ); jQuery.post(ajaxurl, { 'action' : 'pspAjaxList_actions', 'itemid' : itemid, 'sub_action' : 'edit_inline', 'table' : table, 'field_name' : field, 'field_value' : new_val, 'ajax_id' : $(".psp-table-ajax-list").find('.psp-ajax-list-table-id').val(), 'debug_level' : debug_level }, function(response) { loading( replace, 'close' ); var orig = replace.prev('.psp-edit-inline'), just_new = 'input' == el_type ? new_val : new_text; orig.html( just_new ); // success if( response.status == 'valid' ){ replace.hide(); orig.show(); return false; } // error replace.hide(); orig.show(); //alert('Problems occured while trying to execute action: '+sub_action+'!'); }, 'json'); }; function loading( row, status ) { if ( 'close' == status ) { row.find('i.psp-edit-inline-loading').remove(); } else { row.prepend( $('') ); } }; $(document).on( { mouseenter: function(e) { $(this).addClass('psp-edit-inline-hover'); }, mouseleave: function(e) { $(this).removeClass('psp-edit-inline-hover'); } }, '.psp-edit-inline' ); $(document).on('click', '.psp-edit-inline', function(e) { var that = $(this), replace = that.next('.psp-edit-inline-replace'); that.hide(); replace.show().focus(); replace.find('input,select').focus(); }); function change_and_blur(e) { var that = $(this); clearTimeout(change_and_blur.timeout); change_and_blur.timeout = null; change_and_blur.timeout = setTimeout(function(){ __(); }, 200); function __() { //var that = $(this); var parent = that.parent(), row = that.parents('tr').first(), itemid = row.data('itemid'), table = parent.data('table'), field = that.prop('name').replace('psp-edit-inline[', '').replace(']', ''), new_val = that.val(), el_type = e.target.tagName.toLowerCase(), new_text = 'select' == el_type ? that.find('option:selected').text() : ''; make_request({ 'replace' : parent, 'itemid' : itemid, 'table' : table, 'field' : field, 'new_val' : new_val, 'el_type' : el_type, 'new_text' : new_text }); } } // $(document).on('change', '.psp-edit-inline-replace input, .psp-edit-inline-replace select', change_and_blur); $(document).on('blur', '.psp-edit-inline-replace input, .psp-edit-inline-replace select', change_and_blur); }; /* Multi Keywords - sub tabs */ var multikw_tabs = (function() { var mkwtabs = { main : null, preload : null, box : null, boxmenu : null, boxcontent : null }; function triggers() { $('body').on('click', '.psp-multikw .psp-multikw-tab-menu a', function(e) { e.preventDefault(); var that = $(this); mkwtabs.main = that.parents(".psp-multikw:first"); if ( mkwtabs.main && mkwtabs.main.length ) { mkwtabs.preload = mkwtabs.main.find(".psp-multikw-meta-box-preload:first"); mkwtabs.box = mkwtabs.main.find(".psp-multikw-meta-box-container:first"); } if ( mkwtabs.box && mkwtabs.box.length ) { mkwtabs.boxmenu = mkwtabs.box.find(".psp-multikw-tab-menu:first"); mkwtabs.boxcontent = mkwtabs.box.find(".psp-multikw-tab-container:first"); } //console.log( 'admin', mkwtabs ); if ( mkwtabs.box && mkwtabs.box.length ) ; else return false; var open = mkwtabs.boxmenu.find("a.open"), href = that.attr('href').replace('#', ''); mkwtabs.box.hide(); mkwtabs.boxcontent.find("#psp-tab-div-id-" + href ).show(); // close current opened tab var rel_open = open.attr('href').replace('#', ''); mkwtabs.boxcontent.find("#psp-tab-div-id-" + rel_open ).hide(); mkwtabs.preload.show(); mkwtabs.preload.hide(); mkwtabs.box.fadeIn('fast'); open.removeClass('open'); that.addClass('open'); }); } function load( container ) { if ( container && container.length ) { mkwtabs.preload = container.find(".psp-multikw-meta-box-preload:first"); mkwtabs.box = container.find('.psp-multikw-meta-box-container:first'); //console.log( 'admin', mkwtabs ); mkwtabs.preload.hide(); mkwtabs.box.fadeIn('fast'); } } return { 'triggers' : triggers, 'load' : load }; })(); function scrollToElement(selector, time, verticalOffset) { time = typeof(time) != 'undefined' ? time : 1000; verticalOffset = typeof(verticalOffset) != 'undefined' ? verticalOffset : 0; var element = jQuery(selector); if ( element.length <= 0 ) return false; var offset = element.offset(); var offsetTop = parseInt( parseInt(offset.top) + parseInt(verticalOffset) ); $('html, body').animate({ scrollTop: offsetTop }, time); } // UTF8 / UTF-8 related! function encode_utf8( s ) { return unescape( encodeURIComponent( s ) ); } function substr_utf8_bytes(str, startInBytes, lengthInBytes) { /* this function scans a multibyte string and returns a substring. * arguments are start position and length, both defined in bytes. * * this is tricky, because javascript only allows character level * and not byte level access on strings. Also, all strings are stored * in utf-16 internally - so we need to convert characters to utf-8 * to detect their length in utf-8 encoding. * * the startInBytes and lengthInBytes parameters are based on byte * positions in a utf-8 encoded string. * in utf-8, for example: * "a" is 1 byte, "ü" is 2 byte, and "你" is 3 byte. * * NOTE: * according to ECMAScript 262 all strings are stored as a sequence * of 16-bit characters. so we need a encode_utf8() function to safely * detect the length our character would have in a utf8 representation. * * http://www.ecma-international.org/publications/files/ecma-st/ECMA-262.pdf * see "4.3.16 String Value": * > Although each value usually represents a single 16-bit unit of * > UTF-16 text, the language does not place any restrictions or * > requirements on the values except that they be 16-bit unsigned * > integers. */ var resultStr = ''; var startInChars = 0; // scan string forward to find index of first character // (convert start position in byte to start position in characters) var ch; for (var bytePos = 0; bytePos < startInBytes; startInChars++) { // get numeric code of character (is >128 for multibyte character) // and increase "bytePos" for each byte of the character sequence ch = str.charCodeAt(startInChars); bytePos += (ch < 128) ? 1 : encode_utf8(str[startInChars]).length; } // now that we have the position of the starting character, // we can built the resulting substring // as we don't know the end position in chars yet, we start with a mix of // chars and bytes. we decrease "end" by the byte count of each selected // character to end up in the right position var end = startInChars + lengthInBytes - 1; for (var n = startInChars; startInChars <= end; n++) { // get numeric code of character (is >128 for multibyte character) // and decrease "end" for each byte of the character sequence ch = str.charCodeAt(n); end -= (ch < 128) ? 1 : encode_utf8(str[n]).length; resultStr += str[n]; } return resultStr; } function row_loading( row, status ) { if( status == 'show' ){ if( row.size() > 0 ){ if( row.find('.psp-row-loading-marker').size() == 0 ){ var row_loading_box = $('
    ') row_loading_box.find('div.psp-row-loading').css({ 'width': row.width(), 'height': row.height() }); row.find('td').eq(0).append(row_loading_box); } row.find('.psp-row-loading-marker').fadeIn('fast'); } }else{ row.find('.psp-row-loading-marker').fadeOut('fast'); } } // external usage return { 'scrollToElement' : scrollToElement, 'substr_utf8_bytes' : substr_utf8_bytes, 'makeTabs' : makeTabs, 'to_ajax_loader' : take_over_ajax_loader, 'to_ajax_loader_close' : take_over_ajax_loader_close, 'init_custom_checkbox' : init_custom_checkbox, 'multiselect_left2right' : multiselect_left2right, 'multikw_tabs_load' : multikw_tabs.load, 'row_loading' : row_loading } })(jQuery); function pspPopUpClosed() { window.location.reload(); }31F h&smartSEO/aa-framework/js/ajaxupload.js ob/** * AJAX Upload ( http://valums.com/ajax-upload/ ) * Copyright (c) Andris Valums * Licensed under the MIT license ( http://valums.com/mit-license/ ) * Thanks to Gary Haran, David Mark, Corey Burns and others for contributions */ (function () { /* global window */ /* jslint browser: true, devel: true, undef: true, nomen: true, bitwise: true, regexp: true, newcap: true, immed: true */ /** * Wrapper for FireBug's console.log */ function log(){ if (typeof(console) != 'undefined' && typeof(console.log) == 'function'){ Array.prototype.unshift.call(arguments, '[Ajax Upload]'); console.log( Array.prototype.join.call(arguments, ' ')); } } /** * Attaches event to a dom element. * @param {Element} el * @param type event name * @param fn callback This refers to the passed element */ function addEvent(el, type, fn){ if (el.addEventListener) { el.addEventListener(type, fn, false); } else if (el.attachEvent) { el.attachEvent('on' + type, function(){ fn.call(el); }); } else { throw new Error('not supported or DOM not loaded'); } } /** * Attaches resize event to a window, limiting * number of event fired. Fires only when encounteres * delay of 100 after series of events. * * Some browsers fire event multiple times when resizing * http://www.quirksmode.org/dom/events/resize.html * * @param fn callback This refers to the passed element */ function addResizeEvent(fn){ var timeout; addEvent(window, 'resize', function(){ if (timeout){ clearTimeout(timeout); } timeout = setTimeout(fn, 100); }); } // Needs more testing, will be rewriten for next version // getOffset function copied from jQuery lib (http://jquery.com/) if (document.documentElement.getBoundingClientRect){ // Get Offset using getBoundingClientRect // http://ejohn.org/blog/getboundingclientrect-is-awesome/ var getOffset = function(el){ var box = el.getBoundingClientRect(); var doc = el.ownerDocument; var body = doc.body; var docElem = doc.documentElement; // for ie var clientTop = docElem.clientTop || body.clientTop || 0; var clientLeft = docElem.clientLeft || body.clientLeft || 0; // In Internet Explorer 7 getBoundingClientRect property is treated as physical, // while others are logical. Make all logical, like in IE8. var zoom = 1; if (body.getBoundingClientRect) { var bound = body.getBoundingClientRect(); zoom = (bound.right - bound.left) / body.clientWidth; } if (zoom > 1) { clientTop = 0; clientLeft = 0; } var top = box.top / zoom + (window.pageYOffset || docElem && docElem.scrollTop / zoom || body.scrollTop / zoom) - clientTop, left = box.left / zoom + (window.pageXOffset || docElem && docElem.scrollLeft / zoom || body.scrollLeft / zoom) - clientLeft; return { top: top, left: left }; }; } else { // Get offset adding all offsets var getOffset = function(el){ var top = 0, left = 0; do { top += el.offsetTop || 0; left += el.offsetLeft || 0; el = el.offsetParent; } while (el); return { left: left, top: top }; }; } /** * Returns left, top, right and bottom properties describing the border-box, * in pixels, with the top-left relative to the body * @param {Element} el * @return {Object} Contains left, top, right,bottom */ function getBox(el){ var left, right, top, bottom; var offset = getOffset(el); left = offset.left; top = offset.top; right = left + el.offsetWidth; bottom = top + el.offsetHeight; return { left: left, right: right, top: top, bottom: bottom }; } /** * Helper that takes object literal * and add all properties to element.style * @param {Element} el * @param {Object} styles */ function addStyles(el, styles){ for (var name in styles) { if (styles.hasOwnProperty(name)) { el.style[name] = styles[name]; } } } /** * Function places an absolutely positioned * element on top of the specified element * copying position and dimentions. * @param {Element} from * @param {Element} to */ function copyLayout(from, to){ var box = getBox(from); addStyles(to, { position: 'absolute', left : box.left + 'px', top : box.top + 'px', width : from.offsetWidth + 'px', height : from.offsetHeight + 'px' }); } /** * Creates and returns element from html chunk * Uses innerHTML to create an element */ var toElement = (function(){ var div = document.createElement('div'); return function(html){ div.innerHTML = html; var el = div.firstChild; return div.removeChild(el); }; })(); /** * Function generates unique id * @return unique id */ var getUID = (function(){ var id = 0; return function(){ return 'ValumsAjaxUpload' + id++; }; })(); /** * Get file name from path * @param {String} file path to file * @return filename */ function fileFromPath(file){ return file.replace(/.*(\/|\\)/, ""); } /** * Get file extension lowercase * @param {String} file name * @return file extenstion */ function getExt(file){ return (-1 !== file.indexOf('.')) ? file.replace(/.*[.]/, '') : ''; } function hasClass(el, name){ var re = new RegExp('\\b' + name + '\\b'); return re.test(el.className); } function addClass(el, name){ if ( ! hasClass(el, name)){ el.className += ' ' + name; } } function removeClass(el, name){ var re = new RegExp('\\b' + name + '\\b'); el.className = el.className.replace(re, ''); } function removeNode(el){ el.parentNode.removeChild(el); } /** * Easy styling and uploading * @constructor * @param button An element you want convert to * upload button. Tested dimentions up to 500x500px * @param {Object} options See defaults below. */ window.AjaxUpload = function(button, options){ this._settings = { // Location of the server-side upload script action: 'upload.php', // File upload name name: 'userfile', // Additional data to send data: {}, // Submit file as soon as it's selected autoSubmit: true, // The type of data that you're expecting back from the server. // html and xml are detected automatically. // Only useful when you are using json data as a response. // Set to "json" in that case. responseType: false, // Class applied to button when mouse is hovered hoverClass: 'hover', // Class applied to button when AU is disabled disabledClass: 'disabled', // When user selects a file, useful with autoSubmit disabled // You can return false to cancel upload onChange: function(file, extension){ }, // Callback to fire before file is uploaded // You can return false to cancel upload onSubmit: function(file, extension){ }, // Fired when file upload is completed // WARNING! DO NOT USE "FALSE" STRING AS A RESPONSE! onComplete: function(file, response){ } }; // Merge the users options with our defaults for (var i in options) { if (options.hasOwnProperty(i)){ this._settings[i] = options[i]; } } if ( typeof button=='undefined' ) { return false; } // button isn't necessary a dom element if (button.jquery){ // jQuery object was passed button = button[0]; } else if (typeof button == "string") { if (/^#.*/.test(button)){ // If jQuery user passes #elementId don't break it button = button.slice(1); } button = document.getElementById(button); } if ( ! button || button.nodeType !== 1){ throw new Error("Please make sure that you're passing a valid element"); } if ( button.nodeName.toUpperCase() == 'A'){ // disable link addEvent(button, 'click', function(e){ if (e && e.preventDefault){ e.preventDefault(); } else if (window.event){ window.event.returnValue = false; } }); } // DOM element this._button = button; // DOM element this._input = null; // If disabled clicking on button won't do anything this._disabled = false; // if the button was disabled before refresh if will remain // disabled in FireFox, let's fix it this.enable(); this._rerouteClicks(); }; // assigning methods to our class AjaxUpload.prototype = { setData: function(data){ this._settings.data = data; }, disable: function(){ addClass(this._button, this._settings.disabledClass); this._disabled = true; var nodeName = this._button.nodeName.toUpperCase(); if (nodeName == 'INPUT' || nodeName == 'BUTTON'){ this._button.setAttribute('disabled', 'disabled'); } // hide input if (this._input){ // We use visibility instead of display to fix problem with Safari 4 // The problem is that the value of input doesn't change if it // has display none when user selects a file this._input.parentNode.style.visibility = 'hidden'; } }, enable: function(){ removeClass(this._button, this._settings.disabledClass); this._button.removeAttribute('disabled'); this._disabled = false; }, /** * Creates invisible file input * that will hover above the button *
    */ _createInput: function(){ var self = this; var input = document.createElement("input"); input.setAttribute('type', 'file'); input.setAttribute('name', this._settings.name); addStyles(input, { 'position' : 'absolute', // in Opera only 'browse' button // is clickable and it is located at // the right side of the input 'right' : 0, 'margin' : 0, 'padding' : 0, 'fontSize' : '480px', 'cursor' : 'pointer' }); var div = document.createElement("div"); addStyles(div, { 'display' : 'block', 'position' : 'absolute', 'overflow' : 'hidden', 'margin' : 0, 'padding' : 0, 'opacity' : 0, // Make sure browse button is in the right side // in Internet Explorer 'direction' : 'ltr', //Max zIndex supported by Opera 9.0-9.2 'zIndex': 2147483583 }); // Make sure that element opacity exists. // Otherwise use IE filter if ( div.style.opacity !== "0") { if (typeof(div.filters) == 'undefined'){ throw new Error('Opacity not supported by the browser'); } div.style.filter = "alpha(opacity=0)"; } addEvent(input, 'change', function(){ if ( ! input || input.value === ''){ return; } // Get filename from input, required // as some browsers have path instead of it var file = fileFromPath(input.value); if (false === self._settings.onChange.call(self, file, getExt(file))){ self._clearInput(); return; } // Submit form when value is changed if (self._settings.autoSubmit) { self.submit(); } }); addEvent(input, 'mouseover', function(){ addClass(self._button, self._settings.hoverClass); }); addEvent(input, 'mouseout', function(){ removeClass(self._button, self._settings.hoverClass); // We use visibility instead of display to fix problem with Safari 4 // The problem is that the value of input doesn't change if it // has display none when user selects a file input.parentNode.style.visibility = 'hidden'; }); div.appendChild(input); document.body.appendChild(div); this._input = input; }, _clearInput : function(){ if (!this._input){ return; } // this._input.value = ''; Doesn't work in IE6 removeNode(this._input.parentNode); this._input = null; this._createInput(); removeClass(this._button, this._settings.hoverClass); }, /** * Function makes sure that when user clicks upload button, * the this._input is clicked instead */ _rerouteClicks: function(){ var self = this; // IE will later display 'access denied' error // if you use using self._input.click() // other browsers just ignore click() addEvent(self._button, 'mouseover', function(){ if (self._disabled){ return; } if ( ! self._input){ self._createInput(); } var div = self._input.parentNode; copyLayout(self._button, div); div.style.visibility = 'visible'; }); // commented because we now hide input on mouseleave /** * When the window is resized the elements * can be misaligned if button position depends * on window size */ //addResizeEvent(function(){ // if (self._input){ // copyLayout(self._button, self._input.parentNode); // } //}); }, /** * Creates iframe with unique name * @return {Element} iframe */ _createIframe: function(){ // We can't use getTime, because it sometimes return // same value in safari :( var id = getUID(); // We can't use following code as the name attribute // won't be properly registered in IE6, and new window // on form submit will open // var iframe = document.createElement('iframe'); // iframe.setAttribute('name', id); var iframe = toElement(''; $netUrl = ''; $netUrl = $this->buildButtonUrl( $netUrl, 'facebook' ); return $netUrl; } /** * Twitter * https://dev.twitter.com/docs/tweet-button * */ public function twitter_btn() { // $netUrl = ''; $netUrl = ''; $netUrl = $this->buildButtonUrl( $netUrl, 'twitter' ); return $netUrl; } /** * Google Plus / Google+ * https://developers.google.com/+/web/+1button/ */ public function plusone_btn() { // $netUrl = '
    '; $netUrl = ''; $netUrl = $this->buildButtonUrl( $netUrl, 'plusone' ); return $netUrl; } /** * Linkedin * https://developer.linkedin.com/plugins/share-plugin-generator */ public function linkedin_btn() { // $netUrl = ''; // @not working // $netUrl = ''; $netUrl = ''; $netUrl = $this->buildButtonUrl( $netUrl, 'linkedin' ); return $netUrl; } /** * StumbleUpon * http://www.stumbleupon.com/dt/badges/create */ public function stumbleupon_btn() { // $netUrl = ''; // $netUrl = ''; $netUrl = ''; $netUrl = $this->buildButtonUrl( $netUrl, 'stumbleupon' ); return $netUrl; } /** * Digg */ public function digg_btn() { // $netUrl = ''; $netUrl = ''; $netUrl = $this->buildButtonUrl( $netUrl, 'digg' ); return $netUrl; } /** * Delicious * @custom button */ public function delicious_btn() { // $netUrl = '0'; //$netUrl = ''; $netUrl = ''; $netUrl = $this->buildButtonUrl( $netUrl, 'delicious' ); return $netUrl; } /** * Pinterest * http://business.pinterest.com/widget-builder/#do_pin_it_button * https://developers.pinterest.com/pin_it/ */ public function pinterest_btn() { // $netUrl = ''; $netUrl = ''; $netUrl = $this->buildButtonUrl( $netUrl, 'pinterest' ); return $netUrl; } /** * Xing * https://dev.xing.com/plugins/share_button * @custom button */ public function xing_btn() { // $netUrl = ''; // @not working // $netUrl = ''; $netUrl = ''; $netUrl = $this->buildButtonUrl( $netUrl, 'xing' ); return $netUrl; } /** * Buffer * https://bufferapp.com/extras/button */ public function buffer_btn() { // $netUrl = 'Buffer'; $netUrl = ''; $netUrl = $this->buildButtonUrl( $netUrl, 'buffer' ); return $netUrl; } /** * Flattr * http://developers.flattr.net/button/ * @custom button */ public function flattr_btn() { // $netUrl = ''; // @not working // $netUrl = ''; $netUrl = ''; $netUrl = $this->buildButtonUrl( $netUrl, 'flattr' ); return $netUrl; } /** * Tumblr * http://www.tumblr.com/buttons */ public function tumblr_btn() { // $netUrl = 'Share on Tumblr'; $netUrl = ''; $netUrl = $this->buildButtonUrl( $netUrl, 'tumblr' ); return $netUrl; } /** * Reddit * http://www.reddit.com/buttons/ * @custom button */ public function reddit_btn() { // $netUrl = ' submit to reddit '; $netUrl = ''; $netUrl = $this->buildButtonUrl( $netUrl, 'reddit' ); return $netUrl; } /** * UTILS */ private function get_property( $key, $type='string', $default='' ) { $opt = $this->plugin_settings; switch ($type) { case 'string' : $prop = isset($opt["$key"]) ? $opt["$key"] : ( !empty($default) ? $default : '' ); break; case 'array' : $prop = isset($opt["$key"]) && is_array($opt["$key"]) ? $opt["$key"] : ( !empty($default) ? $default : array() ); break; } return $prop; } } } // Initialize the pspSocialSharingButtons class //$pspSocialSharingButtons = new pspSocialSharingButtons(); gRYM k51F-smartSEO/aa-framework/utils/twitter_cards.php obthe_plugin = $parent; $this->plugin_settings = $this->the_plugin->get_theoption( $this->the_plugin->alias . '_title_meta_format' ); $this->localizationName = $this->the_plugin->localizationName; $this->card_types(); } /** * Singleton pattern * * @return pspFileEdit Singleton instance */ static public function getInstance() { if (!self::$_instance) { self::$_instance = new self; } return self::$_instance; } /** * Twitter Cards */ public function card_types() { $twc = array(); // Summary $twc['summary'] = array( 'required' => array('title', 'description'), 'title' => 'Summary Card', 'dev_url' => 'https://dev.twitter.com/docs/cards/types/summary-card', 'fields' => array( 'title' => array( 'type' => 'text', 'meta' => 'twitter:title', 'maxlen' => 70, 'title' => __('Title', $this->localizationName), 'desc' => __('Title should be concise and will be truncated at 70 characters.', $this->localizationName) ), 'description' => array( 'type' => 'textarea', 'meta' => 'twitter:description', 'maxlen' => 200, 'title' => __('Description', $this->localizationName), 'desc' => __('A description that concisely summarizes the content of the page, as appropriate for presentation within a Tweet. Do not re-use the title text as the description, or use this field to describe the general services provided by the website. Description text will be truncated at the word to 200 characters.', $this->localizationName) ), 'image' => array( 'type' => 'upload_image', 'meta' => 'twitter:image', 'minsize' => '120x120', // width X height 'filesize' => '1048576', // bytes 'title' => __('Image', $this->localizationName), 'desc' => __('URL to a unique image representing the content of the page. Do not use a generic image such as your website logo, author photo, or other image that spans multiple pages. The image must be a minimum size of 120x120px. Images larger than 120x120px will be resized and cropped square based on its longest dimension. Images must be less than 1MB in size.', $this->localizationName) ) ) ); // Summary Card with Large Image $twc['summary_large_image'] = array_replace_recursive($twc['summary'], array( 'required' => array('title', 'description'), 'title' => 'Summary Card with Large Image', 'dev_url' => 'https://dev.twitter.com/docs/cards/large-image-summary-card', 'fields' => array( //'image_src' => array( // 'type' => 'upload_image', // 'meta' => 'twitter:image', //'twitter:image:src', // 'minsize' => '280x150', // width X height // 'filesize' => '1048576', // bytes // 'title' => __('Image', $this->localizationName), // 'desc' => __('URL to a unique image representing the content of the page. Do not use a generic image such as your website logo, author photo, or other image that spans multiple pages. Images for this Card should be at least 280px in width, and at least 150px in height. Image must be less than 1MB in size.', $this->localizationName) //) 'image' => array( 'minsize' => '280x150', // width X height 'filesize' => '1048576', // bytes 'desc' => __('URL to a unique image representing the content of the page. Do not use a generic image such as your website logo, author photo, or other image that spans multiple pages. Images for this Card should be at least 280px in width, and at least 150px in height. Image must be less than 1MB in size.', $this->localizationName) ) ) )); //unset($twc['summary_large_image']['fields']['image']); // Photo Card $twc['photo'] = array_replace_recursive($twc['summary'], array( 'required' => array('image'), 'title' => 'Photo Card', 'dev_url' => 'https://dev.twitter.com/docs/cards/types/photo-card', 'fields' => array( 'title' => array( 'desc' => __('The title of your content as it should appear in the card. You may specify an empty string if you wish no title to render.', $this->localizationName) ), 'image' => array( 'meta' => 'twitter:image', 'minsize' => '280x150', // width X height 'maxsize' => array( '435x375' => 'Web: maximum height of 375px, maximum width of 435px', '280x375' => 'Mobile (non-retina displays): maximum height of 375px, maximum width of 280px', '560x750' => 'Mobile (retina displays): maximum height of 750px, maximum width of 560px' ), 'desc' => __('A URL to the image representing the content. Image must be less than 1MB in size.', $this->localizationName) ), 'image_width' => array( 'type' => 'text', 'meta' => 'twitter:image:width', 'title' => __('Image Width', $this->localizationName), 'desc' => __('Providing width in px helps us more accurately preserve the aspect ratio of the image when resizing.', $this->localizationName) ), 'image_height' => array( 'type' => 'text', 'meta' => 'twitter:image:height', 'title' => __('Image Height', $this->localizationName), 'desc' => __('Providing height in px helps us more accurately preserve the aspect ratio of the image when resizing.', $this->localizationName) ) ) )); unset($twc['photo']['fields']['description']); // Gallery Card $twc['gallery'] = array_replace_recursive($twc['summary'], array( 'required' => array('image0', 'image1', 'image2', 'image3'), 'title' => 'Gallery Card', 'dev_url' => 'https://dev.twitter.com/docs/cards/types/gallery-card', 'fields' => array( 'title' => array( 'desc' => __('The title of your content as it should appear in the card. You may specify an empty string if you wish no title to render.', $this->localizationName) ), 'image0' => array( 'type' => 'upload_image', 'meta' => 'twitter:image0', 'minsize' => '120x120', // width X height 'filesize' => '1048576', // bytes 'title' => __('Image 0', $this->localizationName), 'desc' => __('A URL to the image representing the first photo in your gallery. Image must be less than 1MB in size.', $this->localizationName) ), 'image1' => array( 'type' => 'upload_image', 'meta' => 'twitter:image1', 'minsize' => '120x120', // width X height 'filesize' => '1048576', // bytes 'title' => __('Image 1', $this->localizationName), 'desc' => __('A URL to the image representing the first photo in your gallery. Image must be less than 1MB in size.', $this->localizationName) ), 'image2' => array( 'type' => 'upload_image', 'meta' => 'twitter:image2', 'minsize' => '120x120', // width X height 'filesize' => '1048576', // bytes 'title' => __('Image 2', $this->localizationName), 'desc' => __('A URL to the image representing the first photo in your gallery. Image must be less than 1MB in size.', $this->localizationName) ), 'image3' => array( 'type' => 'upload_image', 'meta' => 'twitter:image3', 'minsize' => '120x120', // width X height 'filesize' => '1048576', // bytes 'title' => __('Image 3', $this->localizationName), 'desc' => __('A URL to the image representing the first photo in your gallery. Image must be less than 1MB in size.', $this->localizationName) ) ) )); unset($twc['gallery']['fields']['image']); // Player Card $twc['player'] = array_replace_recursive($twc['summary'], array( 'required' => array('title', 'description', 'image', 'player', 'player_width', 'player_height'), 'title' => 'Player Card', 'dev_url' => 'https://dev.twitter.com/docs/cards/types/player-card', 'fields' => array( 'image' => array( 'minsize' => array('262x262', '350x196'), // width X height 'desc' => __('Image to be displayed in place of the player on platforms that don\'t support iframes or inline players. You should make this image the same dimensions as your player. Images with fewer than 68,600 pixels (a 262x262 square image, or a 350x196 16:9 image) will cause the player card not to render. Image must be less than 1MB in size.', $this->localizationName) ), 'player' => array( 'type' => 'text', 'meta' => 'twitter:player', 'title' => __('Player', $this->localizationName), 'desc' => __('HTTPS URL to iFrame player. This must be a HTTPS URL which does not generate active mixed content warnings in a web browser. The audio or video player must not require plugins such as Adobe Flash.', $this->localizationName) ), 'player_width' => array( 'type' => 'text', 'meta' => 'twitter:player:width', 'title' => __('Player width', $this->localizationName), 'desc' => __('Width of IFRAME specified in twitter:player in pixels', $this->localizationName) ), 'player_height' => array( 'type' => 'text', 'meta' => 'twitter:player:height', 'title' => __('Player height', $this->localizationName), 'desc' => __('Height of IFRAME specified in twitter:player in pixels', $this->localizationName) ), 'player_stream' => array( 'type' => 'text', 'meta' => 'twitter:player:stream', 'title' => __('Player stream', $this->localizationName), 'desc' => __('URL to raw stream that will be rendered in Twitter\'s mobile applications directly. If provided, the stream must be delivered in the MPEG-4 container format (the .mp4 extension). The container can store a mix of audio and video with the following codecs: Video: H.264, Baseline Profile (BP), Level 3.0, up to 640 x 480 at 30 fps. Audio: AAC, Low Complexity Profile (LC)', $this->localizationName) ), 'player_stream_content_type' => array( 'type' => 'text', 'meta' => 'twitter:player:stream:content_type', 'title' => __('Player stream content type', $this->localizationName), 'desc' => __('The MIME type/subtype combination that describes the content contained in twitter:player:stream. Takes the form specified in RFC 6381. Currently supported content_type values are those defined in RFC 4337 (MIME Type Registration for MP4).', $this->localizationName) ) ) )); // Product Card $twc['product'] = array_replace_recursive($twc['summary'], array( 'required' => array('title', 'description', 'image', 'data1', 'label1', 'data2', 'label2'), 'title' => 'Product Card', 'dev_url' => 'https://dev.twitter.com/docs/cards/types/product-card', 'fields' => array( 'image' => array( 'desc' => __('A URL to the image representing the content. Image must be less than 1MB in size.', $this->localizationName) ), 'image_width' => array( 'type' => 'text', 'meta' => 'twitter:image:width', 'title' => __('Image width', $this->localizationName), 'desc' => __('Providing width in px helps us more accurately preserve the the aspect ratio of the image when resizing.', $this->localizationName) ), 'image_height' => array( 'type' => 'text', 'meta' => 'twitter:image:height', 'title' => __('Image height', $this->localizationName), 'desc' => __('Providing height in px helps us more accurately preserve the the aspect ratio of the image when resizing.', $this->localizationName) ), 'data1' => array( 'type' => 'text', 'meta' => 'twitter:data1', 'title' => __('Data 1', $this->localizationName), 'desc' => __('This field expects a string, and you can specify values for labels such as price, items in stock, sizes, etc.', $this->localizationName) ), 'label1' => array( 'type' => 'text', 'meta' => 'twitter:label1', 'title' => __('Label 1', $this->localizationName), 'desc' => __('This field also expects a string, and allows you to specify the types of data you want to offer (price, country, etc.).', $this->localizationName) ), 'data2' => array( 'type' => 'text', 'meta' => 'twitter:data2', 'title' => __('Data 2', $this->localizationName), 'desc' => __('This field expects a string, and you can specify values for labels such as price, items in stock, sizes, etc.', $this->localizationName) ), 'label2' => array( 'type' => 'text', 'meta' => 'twitter:label2', 'title' => __('Label 2', $this->localizationName), 'desc' => __('This field also expects a string, and allows you to specify the types of data you want to offer (price, country, etc.).', $this->localizationName) ) ) )); // App Card $twc['app'] = array_replace_recursive($twc['summary'], array( 'required' => array('app_id_iphone', 'app_id_ipad', 'app_id_googleplay'), 'title' => 'App Card', 'dev_url' => 'https://dev.twitter.com/docs/cards/types/app-card', 'fields' => array( 'app_description' => array( 'type' => 'textarea', 'meta' => 'twitter:description', 'maxlen' => 200, 'title' => __('Description', $this->localizationName), 'desc' => __('You can use this as a more concise description than what you may have on the app store. This field has a maximum of 200 characters.', $this->localizationName) ), 'app_name_iphone' => array( 'type' => 'text', 'meta' => 'twitter:app:name:iphone', 'title' => __('App Name Iphone', $this->localizationName), 'desc' => __('Your app\'s name.', $this->localizationName) ), 'app_name_ipad' => array( 'type' => 'text', 'meta' => 'twitter:app:name:ipad', 'title' => __('App Name Ipad', $this->localizationName), 'desc' => __('Your app\'s name.', $this->localizationName) ), 'app_name_googleplay' => array( 'type' => 'text', 'meta' => 'twitter:app:name:googleplay', 'title' => __('App Name Googleplay', $this->localizationName), 'desc' => __('Your app\'s name.', $this->localizationName) ), 'app_id_iphone' => array( 'type' => 'text', 'meta' => 'twitter:app:id:iphone', 'title' => __('App Id Iphone', $this->localizationName), 'desc' => __('String value, and should be the numeric representation of your app ID in the App Store (.i.e. "307234931")..', $this->localizationName) ), 'app_id_ipad' => array( 'type' => 'text', 'meta' => 'twitter:app:id:ipad', 'title' => __('App Id Ipad', $this->localizationName), 'desc' => __('String value, should be the numeric representation of your app ID in the App Store (.i.e. "307234931"). .', $this->localizationName) ), 'app_id_googleplay' => array( 'type' => 'text', 'meta' => 'twitter:app:id:googleplay', 'title' => __('App Id Googleplay', $this->localizationName), 'desc' => __('String value, and should be the numeric representation of your app ID in Google Play (.i.e. "com.android.app").', $this->localizationName) ), 'app_url_iphone' => array( 'type' => 'text', 'meta' => 'twitter:app:url:iphone', 'title' => __('App Url Iphone', $this->localizationName), 'desc' => __('Your app\'s custom URL scheme (you must include "://" after your scheme name).', $this->localizationName) ), 'app_url_ipad' => array( 'type' => 'text', 'meta' => 'twitter:app:url:ipad', 'title' => __('App Url Ipad', $this->localizationName), 'desc' => __('Your app\'s custom URL scheme.', $this->localizationName) ), 'app_url_googleplay' => array( 'type' => 'text', 'meta' => 'twitter:app:url:googleplay', 'title' => __('App Url Googleplay', $this->localizationName), 'desc' => __('Your app\'s custom URL scheme.', $this->localizationName) ), 'app_country' => array( 'type' => 'text', 'meta' => 'twitter:app:country', 'title' => __('Country', $this->localizationName), 'desc' => __('If your application is not available in the US App Store, you must set this value to the two-letter country code for the App Store that contains your application.', $this->localizationName) ) ) )); unset($twc['app']['fields']['description']); unset($twc['app']['fields']['title']); unset($twc['app']['fields']['image']); $this->cardTypes = $twc; return $twc; } public function set_options( $defaults=array(), $pms=array() ) { if( !is_array($defaults) ) $defaults = array(); extract($pms); if ( empty($card_type) ) $card_type = 'summary'; $currentCard = $this->cardTypes["$card_type"]; $currentCardFields = $currentCard['fields']; $boxId = 'title_meta_format'; $boxTitle = ''; switch ($page) { case 'home': $boxId = 'title_meta_format'; $boxTitle = 'Homepage'; break; case 'app': $boxId = 'title_meta_format'; $boxTitle = 'App'; break; case 'post': case 'post-app': $boxId = 'twittercards_meta'; // change box ID so that settings file will not use db option values! $boxTitle = 'Box'; break; } $__options = array(); foreach ($currentCardFields as $k => $v) { $key = self::$prefixFields . $k; $__options["$key"] = array( 'type' => $v['type'], 'size' => 'large', 'title' => $v['title'] . ':', 'std' => '', 'desc' => (in_array($k, $currentCard['required']) ? '(required) ' : '') . $v['desc'] ); if ( $v['type'] == 'upload_image' ) { $__imgSize = array(0, 0); if ( isset($v['minsize']) ) $__imgSize = explode('x', (string) $v['minsize'][0]); $__options["$key"] = array_merge($__options["$key"], array( 'value' => __('Upload image', $this->localizationName), 'thumbSize' => array( 'w' => isset($__imgSize[0]) && $__imgSize[0] > 0 ? "'".$__imgSize[0]."'" : '100', 'h' => isset($__imgSize[1]) && $__imgSize[1] > 0 ? "'".$__imgSize[1]."'" : '100', 'zc' => '2', ) )); } } $options = array( array( /* define the form_sizes box */ $boxId => array( 'title' => '
    ' . __( $boxTitle . ' Twitter Card Options', $this->localizationName) . '
    ', 'size' => 'grid_4', // grid_1|grid_2|grid_3|grid_4 'header' => false, // true|false 'toggler' => false, // true|false 'buttons' => false, // true|false 'style' => 'panel', // panel|panel-widget // create the box elements array 'elements' => $__options ) ) ); // setup the default value base on array with defaults if(count($defaults) > 0){ foreach ($options as $option){ foreach ($option as $box_id => $box) { //if(in_array($box_id, array_keys($defaults))){ foreach ($box['elements'] as $elm_id => $element){ if(isset($defaults[$elm_id])){ $option[$box_id]['elements'][$elm_id]['std'] = $defaults[$elm_id]; } } //} } } // than update the options for returning $options = array( $option ); } return $options; } public function build_options($pms=array()) { extract($pms); // load the settings template class require_once( $this->the_plugin->cfg['paths']['freamwork_dir_path'] . 'settings-template.class.php' ); // Initalize the your psp_aaInterfaceTemplates $psp_aaInterfaceTemplates = new psp_aaInterfaceTemplates($this->the_plugin->cfg); $options = array(); switch ($page) { case 'home': $options = $this->plugin_settings; break; case 'app': $options = $this->plugin_settings; break; case 'post': $box_taxonomy = isset($box_taxonomy) ? (string) $box_taxonomy : 'post'; $box_termid = isset($box_termid) ? (int) $box_termid : 0; if ( 'post' != $box_taxonomy ) { $__objTax = (object) array('term_id' => $box_termid, 'taxonomy' => $box_taxonomy); $psp_current_taxseo = $this->the_plugin->__tax_get_post_meta( null, $__objTax ); if ( is_null($psp_current_taxseo) || !is_array($psp_current_taxseo) ) $psp_current_taxseo = array(); $post_meta = $this->the_plugin->get_psp_meta( $__objTax, $psp_current_taxseo ); } else { $post_meta = $this->the_plugin->get_psp_meta( $post_id ); } $options = $post_meta; break; case 'post-app': $box_taxonomy = isset($box_taxonomy) ? (string) $box_taxonomy : 'post'; $box_termid = isset($box_termid) ? (int) $box_termid : 0; if ( 'post' != $box_taxonomy ) { $__objTax = (object) array('term_id' => $box_termid, 'taxonomy' => $box_taxonomy); $psp_current_taxseo = $this->the_plugin->__tax_get_post_meta( null, $__objTax ); if ( is_null($psp_current_taxseo) || !is_array($psp_current_taxseo) ) $psp_current_taxseo = array(); $post_meta = $this->the_plugin->get_psp_meta( $__objTax, $psp_current_taxseo ); } else { $post_meta = $this->the_plugin->get_psp_meta( $post_id ); } // if ( is_array($post_meta) && !empty($post_meta) && isset($post_meta['psp_twc_app_description']) ) $options = $post_meta; break; } // then build the html, and return it as string $html_options = $psp_aaInterfaceTemplates->bildThePage( $this->set_options( $options, $pms ) , $this->the_plugin->alias, array(), false); $html_options = str_replace('', '', $html_options); return $html_options; } public function save_meta($pms=array()) { extract($pms); $card_type = isset($_REQUEST['psp_twc_post_cardtype']) ? strtolower($_REQUEST['psp_twc_post_cardtype']) : 'none'; $app_card_type = isset($_REQUEST['psp_twc_app_isactive']) ? strtolower($_REQUEST['psp_twc_app_isactive']) : 'no'; $thumbsize = isset($_REQUEST['psp_twc_post_thumbsize']) ? $_REQUEST['psp_twc_post_thumbsize'] : 'none'; $post_cardtypes = array(); if ( isset($card_type) && !empty($card_type) && !in_array($card_type, array('default', 'none')) ) { $post_cardtypes[] = $card_type; } if ( isset($app_card_type) && !empty($app_card_type) && $app_card_type=='yes' ) { $post_cardtypes[] = 'app'; } $__options = array(); $__options['psp_twc_post_cardtype'] = $card_type; $__options['psp_twc_app_isactive'] = $app_card_type; $__options['psp_twc_post_thumbsize'] = $thumbsize; if ( empty($post_cardtypes) ) return $__options; foreach ($post_cardtypes as $kk=>$vv) { $currentCard = $this->cardTypes["$vv"]; $currentCardFields = $currentCard['fields']; foreach ($currentCardFields as $k => $v) { $key = self::$prefixFields . $k; $__options["$key"] = trim( $_REQUEST["$key"] ); } } return $__options; } public function get_frontend_meta($meta=array(), $default=array(), $page='', $post=null) { $opt = $this->plugin_settings; //$this->the_plugin->get_theoption('psp_title_meta_format') $__options = array(); $app_changemeta = false; switch ($page) { case 'home': $card_type = isset($meta['psp_twc_home_type']) ? $meta['psp_twc_home_type'] : ''; //wp_options psp_title_meta_format $app_card_type = isset($meta['psp_twc_home_app']) ? $meta['psp_twc_home_app'] : ''; //wp_options psp_title_meta_format break; case 'post': case 'taxonomy': if ( 'post' == $page ) { $post_type = is_object($post) && isset($post->post_type) ? $post->post_type : ''; $key_cardtype = 'psp_twc_cardstype_default'; $key_app = 'psp_twc_apptype_default'; } else { $post_type = is_object($post) && isset($post->taxonomy) ? $post->taxonomy : ''; $post_type = in_array($post_type, array('category', 'post_tag')) ? $post_type : '_custom_taxonomy'; $key_cardtype = 'psp_twc_cardstype_default_taxonomy'; $key_app = 'psp_twc_apptype_default_taxonomy'; } $card_type = isset($meta['psp_twc_post_cardtype']) ? $meta['psp_twc_post_cardtype'] : ''; //wp_postmeta psp_meta if ( empty($card_type) || ( 'default' == $card_type ) ) { $card_type = 'none'; if ( isset($opt["$key_cardtype"], $opt["$key_cardtype"]["$post_type"]) && !empty($opt["$key_cardtype"]) ) { //wp_options psp_title_meta_format $card_type = $opt["$key_cardtype"]["$post_type"]; } } $app_card_type = isset($meta['psp_twc_app_isactive']) ? $meta['psp_twc_app_isactive'] : ''; //wp_postmeta psp_meta if ( empty($app_card_type) || in_array($app_card_type, array('default', 'default2')) ) { //default = Use Website Generic App Twitter Card Type / compatibility with old version! if ( 'default' == $app_card_type ) { $app_card_type = 'no'; // we've created a Generic App Twitter Card Type if ( isset($opt['psp_twc_site_app']) && !empty($opt['psp_twc_site_app']) && $opt['psp_twc_site_app']=='yes' ) { //wp_options psp_title_meta_format $app_card_type = 'yes'; } } // the new and real default! else { $app_card_type = 'no'; if ( isset($opt["$key_app"], $opt["$key_app"]["$post_type"]) && !empty($opt["$key_app"]) ) { //wp_options psp_title_meta_format $app_card_type = $opt["$key_app"]["$post_type"]; } } // default & allowed => override wp_postmeta psp_meta with wp_options psp_title_meta_format if ( 'yes' == $app_card_type ) { $app_changemeta = true; } } break; } //var_dump('
    ',$card_type, $app_card_type,'
    '); $post_cardtypes = array(); if ( isset($card_type) && !empty($card_type) && $card_type!='none' ) { $post_cardtypes[] = $card_type; $__options['twitter:card'] = $card_type; } if ( isset($app_card_type) && !empty($app_card_type) && ( 'yes' == $app_card_type ) ) { $post_cardtypes[] = 'app'; if ( !isset($__options['twitter:card']) || empty($__options['twitter:card']) ) { $__options['twitter:card'] = 'app'; } } if ( empty($post_cardtypes) ) return $__options; $cc = 0; foreach ($post_cardtypes as $kk=>$vv) { $currentCard = $this->cardTypes["$vv"]; $currentCardFields = $currentCard['fields']; $theMeta = $meta; if ( $vv=='app' && $app_changemeta ) { $theMeta = $opt; } foreach ($currentCardFields as $k => $v) { $key = self::$prefixFields . $k; $meta_key = $v['meta']; // don't overwrite with app tag if tag is already set if ( $vv=='app' && isset($__options["$meta_key"]) && !empty($__options["$meta_key"]) ) ; // do it else { $__options["$meta_key"] = isset($theMeta["$key"]) ? trim( $theMeta["$key"] ) : ''; if ( $cc && ( 'psp_twc_app_description' == $key ) ) { $__options["$meta_key"] = ''; } } } $cc++; } //var_dump('
    ', $__options, '
    '); echo __FILE__ . ":" . __LINE__;die . PHP_EOL; return $__options; } } } // Initialize the pspTwitterCards class //$pspTwitterCards = new pspTwitterCards(); EC ccClDt%smartSEO/aa-framework/utils/utils.php obthe_plugin = $parent; } /** * Singleton pattern * * @return Singleton instance */ static public function getInstance( $parent ) { if (!self::$_instance) { self::$_instance = new self($parent); } return self::$_instance; } /** * Cache */ //use cache to limits search accesses! public function needNewCache($filename, $cache_life) { // cache file needs refresh! if (($statCache = $this->isCacheRefresh($filename, $cache_life))===true || $statCache===0) { return true; } return false; } // verify cache refresh is necessary! public function isCacheRefresh($filename, $cache_life) { // cache file exists! if ($this->verifyFileExists($filename)) { $verify_time = time(); // in seconds $file_time = filemtime($filename); // in seconds $mins_diff = ($verify_time - $file_time) / 60; // in minutes if($mins_diff > $cache_life){ // new cache is necessary! return true; } // cache is empty! => new cache is necessary! if (filesize($filename)<=0) return 0; // NO new cache! return false; } // cache file NOT exists! => new cache is necessary! return 0; } // write content to local cached file public function writeCacheFile($filename, $content, $use_lock=false) { $folder = dirname($filename); if ( empty($folder) || $folder == '.' || $folder == '/' ) return false; // cache folder! if ( !$this->makedir($folder) ) return false; if ( !is_writable($folder) ) return false; $has_wrote = false; if ( $use_lock ) { $fp = @fopen($filename, "wb"); if ( @flock($fp, LOCK_EX, $wouldblock) ) { // do an exclusive lock $has_wrote = @fwrite($fp, $content); @flock($fp, LOCK_UN, $wouldblock); // release the lock } @fclose( $fp ); } else { $wp_filesystem = $this->the_plugin->wp_filesystem; $has_wrote = $wp_filesystem->put_contents( $filename, $content ); if ( !$has_wrote ) { $has_wrote = file_put_contents($filename, $content); } } return $has_wrote; } // cache file public function getCacheFile($filename) { if ($this->verifyFileExists($filename)) { $wp_filesystem = $this->the_plugin->wp_filesystem; $has_wrote = $wp_filesystem->get_contents( $filename ); if ( !$has_wrote ) { $has_wrote = file_get_contents($filename); } $content = $has_wrote; return $content; } return false; } // delete cache public function deleteCache($filename) { if ($this->verifyFileExists($filename)) { return unlink($filename); } return false; } // verify if file exists! public function verifyFileExists($file, $type='file') { clearstatcache(); if ($type=='file') { if (!file_exists($file) || !is_file($file) || !is_readable($file)) { return false; } return true; } else if ($type=='folder') { if (!is_dir($file) || !is_readable($file)) { return false; } return true; } // invalid type return 0; } // make a folder! public function makedir($fullpath) { clearstatcache(); if(file_exists($fullpath) && is_dir($fullpath) && is_readable($fullpath)) { return true; }else{ $stat1 = @mkdir($fullpath, 0777, true); // recursive $stat2 = @chmod($fullpath, 0777); if (!empty($stat1) && !empty($stat2)) return true; } return false; } // get file name/ dot indicate if a .dot will be put in front of image extension, default is not public function fileName($fullname) { $return = substr($fullname, 0, strrpos($fullname, ".")); return $return; } // get file extension public function fileExtension($fullname, $dot=false) { $return = "";; if( $dot == true ) $return .= "."; $return .= substr(strrchr($fullname, "."), 1); return $return; } public function append_contents( $filename, $contents, $mode = '0777' ) { $folder = dirname($filename); if ( empty($folder) || $folder == '.' || $folder == '/' ) return false; // cache folder! if ( !$this->makedir($folder) ) return false; if ( !is_writable($folder) ) return false; if ( !($fp = @fopen($filename, 'ab')) ) { return false; } $stat1 = @fwrite($fp, $contents); @fclose($fp); $stat2 = @chmod($filename, $mode); if (!empty($stat1) && !empty($stat2)) return true; return false; } public function put_contents_gzip( $filename, $contents ) { if ( !function_exists('gzcompress') ) return false; //$gzip = @gzopen($filename, "w9"); //if ( $gzip ){ // gzwrite($gzip, $contents); // gzclose($gzip); //} $gzip = @fopen( $filename, 'w' ); if ( $gzip ) { //$contents = @gzcompress($contents, 9); //zlib (http deflate) $contents = @gzencode($contents, 9); //gzip //$contents = @gzdeflate($contents, 1); //raw deflate encoding @fwrite($gzip, $contents); @fclose($gzip); } return true; } public function get_folder_files_recursive($path) { if ( !$this->verifyFileExists($path, 'folder') ) return 0; $size = 0; $ignore = array('.', '..', 'cgi-bin', '.DS_Store'); $files = scandir($path); foreach ($files as $t) { if (in_array($t, $ignore)) continue; if (is_dir(rtrim($path, '/') . '/' . $t)) { $size += $this->get_folder_files_recursive(rtrim($path, '/') . '/' . $t); } else { $size++; } } return $size; } public function createFile($filename, $content='') { $has_wrote = false; if ( $fp = @fopen($filename,'wb') ) { $has_wrote = @fwrite($fp, $content); @fclose($fp); } return $has_wrote; } public function filesize($path) { $size = filesize($path); $units = array( 'B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'); $power = $size > 0 ? floor(log($size, 1024)) : 0; return number_format($size / pow(1024, $power), 2, '.', ',') . ' ' . $units[$power]; } // Replace last occurance of a String public function str_replace_last( $search , $replace , $str ) { if ( ( $pos = strrpos( $str , $search ) ) !== false ) { $search_length = strlen( $search ); $str = substr_replace( $str, $replace, $pos, $search_length ); } return $str; } /** * Pretty-prints the difference in two times. * * @param time $older_date * @param time $newer_date * @return string The pretty time_since value * @original link http://binarybonsai.com/code/timesince.txt */ public function time_since( $older_date, $newer_date ) { return $this->interval( $newer_date - $older_date ); } public function interval( $since ) { // array of time period chunks $chunks = array( array(60 * 60 * 24 * 365 , _n_noop('%s year', '%s years', $this->the_plugin->localizationName)), array(60 * 60 * 24 * 30 , _n_noop('%s month', '%s months', $this->the_plugin->localizationName)), array(60 * 60 * 24 * 7, _n_noop('%s week', '%s weeks', $this->the_plugin->localizationName)), array(60 * 60 * 24 , _n_noop('%s day', '%s days', $this->the_plugin->localizationName)), array(60 * 60 , _n_noop('%s hour', '%s hours', $this->the_plugin->localizationName)), array(60 , _n_noop('%s minute', '%s minutes', $this->the_plugin->localizationName)), array( 1 , _n_noop('%s second', '%s seconds', $this->the_plugin->localizationName)), ); if( $since <= 0 ) { return __('now', $this->the_plugin->localizationName); } // we only want to output two chunks of time here, eg: // x years, xx months // x days, xx hours // so there's only two bits of calculation below: // step one: the first chunk for ($i = 0, $j = count($chunks); $i < $j; $i++) { $seconds = $chunks[$i][0]; $name = $chunks[$i][1]; // finding the biggest chunk (if the chunk fits, break) if (($count = floor($since / $seconds)) != 0) { break; } } // set output var $output = sprintf(_n($name[0], $name[1], $count, $this->the_plugin->localizationName), $count); // step two: the second chunk if ($i + 1 < $j) { $seconds2 = $chunks[$i + 1][0]; $name2 = $chunks[$i + 1][1]; if (($count2 = floor(($since - ($seconds * $count)) / $seconds2)) != 0) { // add to output var $output .= ' '.sprintf(_n($name2[0], $name2[1], $count2, $this->the_plugin->localizationName), $count2); } } return $output; } // convert relative URLs to absolute URLs function rel2abs( $rel, $base ) { if ( empty($rel) ) { return $rel; } // parse base URL and convert to local variables: $scheme, $host, $path extract( parse_url( $base ) ); if ( strpos( $rel,"//" ) === 0 ) { return $scheme . ':' . $rel; } // return if already absolute URL if ( parse_url( $rel, PHP_URL_SCHEME ) != '' ) { return $rel; } // queries and anchors if ( $rel[0] == '#' || $rel[0] == '?' ) { return $base . $rel; } // remove non-directory element from path $path = preg_replace( '#/[^/]*$#', '', $path ); // destroy path if relative url points to root if ( $rel[0] == '/' ) { $path = ''; } // dirty absolute URL $abs = $host . $path . "/" . $rel; // replace '//' or '/./' or '/foo/../' with '/' $abs = preg_replace( "/(\/\.?\/)/", "/", $abs ); $abs = preg_replace( "/\/(?!\.\.)[^\/]+\/\.\.\//", "/", $abs ); // fix if base was site home $abs = preg_replace( "/\/\.\.\//", "/", $abs ); // absolute URL is ready! return $scheme . '://' . $abs; } } };4 ^smartSEO/changelog.txt ob# Change Log All notable changes to this project will be documented in this file. * 27.08.2017 - Version 3.0 * New release Autocheck Current Post / Page / Custom Taxonomy smartSeo Score smartSEO Score on Posts/ Pages / Custom taxonomies Listings Multiple Focus Keywords! AutoComplete Page Meta - with Snippet Preview Parse Shortcodes (compatible with Visual Composer) Custom Title & Meta Formats - Meta Description, Meta keywords & Meta Robots Custom SEO Rules and Settings - Choose what rules you wish to use Import SEO Settings from other SEO Plugins -------------------- * bug fix: * * ---- 14.12.2012 * 1. Fix for wp 3.5 * * Major update: * 1. Allow to use smart seo on any public post types * * * bug fix: * * ---- 27.08.2012 * 1. Quote escape and html load parser. * * * * bug fix: * * ---- 05.04.2011 - 22.58 * 1. modify from GET request to POST request - GET have size limit * 2. stop request api.php from each dashboard pages * ŠM92 xxo&smartSEO/icon_16.png obPNG  IHDRa pHYs  :iTXtXML:com.adobe.xmp Adobe Photoshop CC 2017 (Windows) 2017-08-17T17:36:39+03:00 2017-08-17T17:36:39+03:00 2017-08-17T17:36:39+03:00 xmp.iid:10020f46-89b6-f541-92eb-1dc0bf2ed202 adobe:docid:photoshop:7adac9aa-8359-11e7-96f7-bcb121203287 xmp.did:eea5056f-842b-8d44-af7f-29cd4c1de6ea created xmp.iid:eea5056f-842b-8d44-af7f-29cd4c1de6ea 2017-08-17T17:36:39+03:00 Adobe Photoshop CC 2017 (Windows) saved xmp.iid:10020f46-89b6-f541-92eb-1dc0bf2ed202 2017-08-17T17:36:39+03:00 Adobe Photoshop CC 2017 (Windows) / xmp.did:cbd32841-19bb-fe4d-8fed-72acc09e2db4 3 image/png 1 720000/10000 720000/10000 2 65535 16 16 yl^ cHRMz%u0`:o_F=IDATxӿKajMJn.8w898*4 $\ЛOC%h9<-7C<:p+ZMSbzEȪUm.ax=/bMqWaua3+c| j>|IΓ\|%ivdd'9ID_h[/IENDB`ڝ. s_6ʀsmartSEO/index.php ob
    {serp_email_title}

    {table_title}

    {table_content}
    {Focus Keyword} {URL} {Google Rank}
    {Current Rank} {Previous Rank}
    {Start Date} {Visits}

    {website_name} - {plugin_name}

    ݑAD h_Ԁ&smartSEO/lib/scripts/facebook/auth.php obgetUser(); // We may or may not have this data based on whether the user is logged in. // // If we have a $user id here, it means we know the user is logged into // Facebook, but we don't know if the access token is valid. An access // token is invalid if the user logged out of Facebook. if ($user) { try { // Proceed knowing you have a logged in user who's authenticated. $user_profile = $facebook->api('/me'); } catch (psp_FacebookApiException $e) { error_log($e); $user = null; } } Lm`O Ia/smartSEO/lib/scripts/facebook/base_facebook.php ob */ class psp_FacebookApiException extends Exception { /** * The result from the API server that represents the exception information. */ protected $result; /** * Make a new API Exception with the given result. * * @param array $result The result from the API server */ public function __construct($result) { $this->result = $result; $code = 0; if (isset($result['error_code']) && is_int($result['error_code'])) { $code = $result['error_code']; } if (isset($result['error_description'])) { // OAuth 2.0 Draft 10 style $msg = $result['error_description']; } else if (isset($result['error']) && is_array($result['error'])) { // OAuth 2.0 Draft 00 style $msg = $result['error']['message']; } else if (isset($result['error_msg'])) { // Rest server style $msg = $result['error_msg']; } else { $msg = 'Unknown Error. Check getResult()'; } $msg = substr($msg, 0, 150); parent::__construct($msg, $code); } /** * Return the associated result object returned by the API server. * * @return array The result from the API server */ public function getResult() { return $this->result; } /** * Returns the associated type for the error. This will default to * 'Exception' when a type is not available. * * @return string */ public function getType() { if (isset($this->result['error'])) { $error = $this->result['error']; if (is_string($error)) { // OAuth 2.0 Draft 10 style return $error; } else if (is_array($error)) { // OAuth 2.0 Draft 00 style if (isset($error['type'])) { return $error['type']; } } } return 'Exception'; } /** * To make debugging easier. * * @return string The string representation of the error */ public function __toString() { $str = $this->getType() . ': '; if ($this->code != 0) { $str .= $this->code . ': '; } return substr(($str . $this->message), 0, 150); } } /** * Provides access to the psp_Facebook Platform. This class provides * a majority of the functionality needed, but the class is abstract * because it is designed to be sub-classed. The subclass must * implement the four abstract methods listed at the bottom of * the file. * * @author Naitik Shah */ abstract class Basepsp_Facebook { /** * Version. */ const VERSION = '3.2.2'; /** * Signed Request Algorithm. */ const SIGNED_REQUEST_ALGORITHM = 'HMAC-SHA256'; /** * Default options for curl. */ public static $CURL_OPTS = array( CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 60, CURLOPT_USERAGENT => 'facebook-php-3.2', ); /** * List of query parameters that get automatically dropped when rebuilding * the current URL. */ protected static $DROP_QUERY_PARAMS = array( 'code', 'state', 'signed_request', ); /** * Maps aliases to psp_Facebook domains. */ public static $DOMAIN_MAP = array( 'api' => 'https://api.facebook.com/', 'api_video' => 'https://api-video.facebook.com/', 'api_read' => 'https://api-read.facebook.com/', 'graph' => 'https://graph.facebook.com/', 'graph_video' => 'https://graph-video.facebook.com/', 'www' => 'https://www.facebook.com/', ); /** * The Application ID. * * @var string */ protected $appId; /** * The Application App Secret. * * @var string */ protected $appSecret; /** * The ID of the psp_Facebook user, or 0 if the user is logged out. * * @var integer */ protected $user; /** * The data from the signed_request token. */ protected $signedRequest; /** * A CSRF state variable to assist in the defense against CSRF attacks. */ protected $state; /** * The OAuth access token received in exchange for a valid authorization * code. null means the access token has yet to be determined. * * @var string */ protected $accessToken = null; /** * Indicates if the CURL based @ syntax for file uploads is enabled. * * @var boolean */ protected $fileUploadSupport = false; /** * Indicates if we trust HTTP_X_FORWARDED_* headers. * * @var boolean */ protected $trustForwarded = false; /** * Initialize a psp_Facebook Application. * * The configuration: * - appId: the application ID * - secret: the application secret * - fileUpload: (optional) boolean indicating if file uploads are enabled * * @param array $config The application configuration */ public function __construct($config) { $this->setAppId($config['appId']); $this->setAppSecret($config['secret']); if (isset($config['fileUpload'])) { $this->setFileUploadSupport($config['fileUpload']); } if (isset($config['trustForwarded']) && $config['trustForwarded']) { $this->trustForwarded = true; } $state = $this->getPersistentData('state'); if (!empty($state)) { $this->state = $state; } } /** * Set the Application ID. * * @param string $appId The Application ID * @return Basepsp_Facebook */ public function setAppId($appId) { $this->appId = $appId; return $this; } /** * Get the Application ID. * * @return string the Application ID */ public function getAppId() { return $this->appId; } /** * Set the App Secret. * * @param string $apiSecret The App Secret * @return Basepsp_Facebook * @deprecated Use setAppSecret instead. */ public function setApiSecret($apiSecret) { $this->setAppSecret($apiSecret); return $this; } /** * Set the App Secret. * * @param string $appSecret The App Secret * @return Basepsp_Facebook */ public function setAppSecret($appSecret) { $this->appSecret = $appSecret; return $this; } /** * Get the App Secret. * * @return string the App Secret * @deprecated Use getAppSecret instead. */ public function getApiSecret() { return $this->getAppSecret(); } /** * Get the App Secret. * * @return string the App Secret */ public function getAppSecret() { return $this->appSecret; } /** * Set the file upload support status. * * @param boolean $fileUploadSupport The file upload support status. * @return Basepsp_Facebook */ public function setFileUploadSupport($fileUploadSupport) { $this->fileUploadSupport = $fileUploadSupport; return $this; } /** * Get the file upload support status. * * @return boolean true if and only if the server supports file upload. */ public function getFileUploadSupport() { return $this->fileUploadSupport; } /** * Get the file upload support status. * * @return boolean true if and only if the server supports file upload. * @deprecated Use getFileUploadSupport instead. */ public function useFileUploadSupport() { return $this->getFileUploadSupport(); } /** * Sets the access token for api calls. Use this if you get * your access token by other means and just want the SDK * to use it. * * @param string $access_token an access token. * @return Basepsp_Facebook */ public function setAccessToken($access_token) { $this->accessToken = $access_token; //$this->setExtendedAccessToken(); return $this; } /** * Extend an access token, while removing the short-lived token that might * have been generated via client-side flow. Thanks to http://bit.ly/b0Pt0H * for the workaround. */ public function setExtendedAccessToken() { try { // need to circumvent json_decode by calling _oauthRequest // directly, since response isn't JSON format. $access_token_response = $this->_oauthRequest( $this->getUrl('graph', '/oauth/access_token'), $params = array( 'client_id' => $this->getAppId(), 'client_secret' => $this->getAppSecret(), 'grant_type' => 'fb_exchange_token', 'fb_exchange_token' => $this->getAccessToken(), ) ); } catch (psp_FacebookApiException $e) { // most likely that user very recently revoked authorization. // In any event, we don't have an access token, so say so. return false; } if (empty($access_token_response)) { return false; } $response_params = array(); parse_str($access_token_response, $response_params); if (!isset($response_params['access_token'])) { return false; } $this->destroySession(); $this->setPersistentData( 'access_token', $response_params['access_token'] ); $this->accessToken = $response_params['access_token']; return $this; } /** * Determines the access token that should be used for API calls. * The first time this is called, $this->accessToken is set equal * to either a valid user access token, or it's set to the application * access token if a valid user access token wasn't available. Subsequent * calls return whatever the first call returned. * * @return string The access token */ public function getAccessToken() { if ($this->accessToken !== null) { // we've done this already and cached it. Just return. return $this->accessToken; } // first establish access token to be the application // access token, in case we navigate to the /oauth/access_token // endpoint, where SOME access token is required. $this->setAccessToken($this->getApplicationAccessToken()); $user_access_token = $this->getUserAccessToken(); if ($user_access_token) { $this->setAccessToken($user_access_token); } return $this->accessToken; } /** * Determines and returns the user access token, first using * the signed request if present, and then falling back on * the authorization code if present. The intent is to * return a valid user access token, or false if one is determined * to not be available. * * @return string A valid user access token, or false if one * could not be determined. */ protected function getUserAccessToken() { // first, consider a signed request if it's supplied. // if there is a signed request, then it alone determines // the access token. $signed_request = $this->getSignedRequest(); if ($signed_request) { // apps.facebook.com hands the access_token in the signed_request if (array_key_exists('oauth_token', $signed_request)) { $access_token = $signed_request['oauth_token']; $this->setPersistentData('access_token', $access_token); return $access_token; } // the JS SDK puts a code in with the redirect_uri of '' if (array_key_exists('code', $signed_request)) { $code = $signed_request['code']; if ($code && $code == $this->getPersistentData('code')) { // short-circuit if the code we have is the same as the one presented return $this->getPersistentData('access_token'); } $access_token = $this->getAccessTokenFromCode($code, ''); if ($access_token) { $this->setPersistentData('code', $code); $this->setPersistentData('access_token', $access_token); return $access_token; } } // signed request states there's no access token, so anything // stored should be cleared. $this->clearAllPersistentData(); return false; // respect the signed request's data, even // if there's an authorization code or something else } $code = $this->getCode(); if ($code && $code != $this->getPersistentData('code')) { $access_token = $this->getAccessTokenFromCode($code); if ($access_token) { $this->setPersistentData('code', $code); $this->setPersistentData('access_token', $access_token); return $access_token; } // code was bogus, so everything based on it should be invalidated. $this->clearAllPersistentData(); return false; } // as a fallback, just return whatever is in the persistent // store, knowing nothing explicit (signed request, authorization // code, etc.) was present to shadow it (or we saw a code in $_REQUEST, // but it's the same as what's in the persistent store) return $this->getPersistentData('access_token'); } /** * Retrieve the signed request, either from a request parameter or, * if not present, from a cookie. * * @return string the signed request, if available, or null otherwise. */ public function getSignedRequest() { if (!$this->signedRequest) { if (!empty($_REQUEST['signed_request'])) { $this->signedRequest = $this->parseSignedRequest( $_REQUEST['signed_request']); } else if (!empty($_COOKIE[$this->getSignedRequestCookieName()])) { $this->signedRequest = $this->parseSignedRequest( $_COOKIE[$this->getSignedRequestCookieName()]); } } return $this->signedRequest; } /** * Get the UID of the connected user, or 0 * if the psp_Facebook user is not connected. * * @return string the UID if available. */ public function getUser() { if ($this->user !== null) { // we've already determined this and cached the value. return $this->user; } return $this->user = $this->getUserFromAvailableData(); } /** * Determines the connected user by first examining any signed * requests, then considering an authorization code, and then * falling back to any persistent store storing the user. * * @return integer The id of the connected psp_Facebook user, * or 0 if no such user exists. */ protected function getUserFromAvailableData() { // if a signed request is supplied, then it solely determines // who the user is. $signed_request = $this->getSignedRequest(); if ($signed_request) { if (array_key_exists('user_id', $signed_request)) { $user = $signed_request['user_id']; if($user != $this->getPersistentData('user_id')){ $this->clearAllPersistentData(); } $this->setPersistentData('user_id', $signed_request['user_id']); return $user; } // if the signed request didn't present a user id, then invalidate // all entries in any persistent store. $this->clearAllPersistentData(); return 0; } $user = $this->getPersistentData('user_id', $default = 0); $persisted_access_token = $this->getPersistentData('access_token'); // use access_token to fetch user id if we have a user access_token, or if // the cached access token has changed. $access_token = $this->getAccessToken(); if ($access_token && $access_token != $this->getApplicationAccessToken() && !($user && $persisted_access_token == $access_token)) { $user = $this->getUserFromAccessToken(); if ($user) { $this->setPersistentData('user_id', $user); } else { $this->clearAllPersistentData(); } } return $user; } /** * Get a Login URL for use with redirects. By default, full page redirect is * assumed. If you are using the generated URL with a window.open() call in * JavaScript, you can pass in display=popup as part of the $params. * * The parameters: * - redirect_uri: the url to go to after a successful login * - scope: comma separated list of requested extended perms * * @param array $params Provide custom parameters * @return string The URL for the login flow */ public function getLoginUrl($params=array()) { $this->establishCSRFTokenState(); $currentUrl = $this->getCurrentUrl(); // if 'scope' is passed as an array, convert to comma separated list $scopeParams = isset($params['scope']) ? $params['scope'] : null; if ($scopeParams && is_array($scopeParams)) { $params['scope'] = implode(',', $scopeParams); } return $this->getUrl( 'www', 'dialog/oauth', array_merge( array( 'client_id' => $this->getAppId(), 'redirect_uri' => $currentUrl, // possibly overwritten 'state' => $this->state, 'sdk' => 'php-sdk-'.self::VERSION ), $params )); } /** * Get a Logout URL suitable for use with redirects. * * The parameters: * - next: the url to go to after a successful logout * * @param array $params Provide custom parameters * @return string The URL for the logout flow */ public function getLogoutUrl($params=array()) { return $this->getUrl( 'www', 'logout.php', array_merge(array( 'next' => $this->getCurrentUrl(), 'access_token' => $this->getUserAccessToken(), ), $params) ); } /** * Get a login status URL to fetch the status from psp_Facebook. * * @param array $params Provide custom parameters * @return string The URL for the logout flow */ public function getLoginStatusUrl($params=array()) { return $this->getLoginUrl( array_merge(array( 'response_type' => 'code', 'display' => 'none', ), $params) ); } /** * Make an API call. * * @return mixed The decoded response */ public function api(/* polymorphic */) { $args = func_get_args(); if (is_array($args[0])) { return $this->_restserver($args[0]); } else { return call_user_func_array(array($this, '_graph'), $args); } } /** * Constructs and returns the name of the cookie that * potentially houses the signed request for the app user. * The cookie is not set by the Basepsp_Facebook class, but * it may be set by the JavaScript SDK. * * @return string the name of the cookie that would house * the signed request value. */ protected function getSignedRequestCookieName() { return 'fbsr_'.$this->getAppId(); } /** * Constructs and returns the name of the coookie that potentially contain * metadata. The cookie is not set by the Basepsp_Facebook class, but it may be * set by the JavaScript SDK. * * @return string the name of the cookie that would house metadata. */ protected function getMetadataCookieName() { return 'fbm_'.$this->getAppId(); } /** * Get the authorization code from the query parameters, if it exists, * and otherwise return false to signal no authorization code was * discoverable. * * @return mixed The authorization code, or false if the authorization * code could not be determined. */ protected function getCode() { if (isset($_REQUEST['code'])) { if ($this->state !== null && isset($_REQUEST['state']) && $this->state === $_REQUEST['state']) { // CSRF state has done its job, so clear it $this->state = null; $this->clearPersistentData('state'); return $_REQUEST['code']; } else { self::errorLog('CSRF state token does not match one provided.'); return false; } } return false; } /** * Retrieves the UID with the understanding that * $this->accessToken has already been set and is * seemingly legitimate. It relies on psp_Facebook's Graph API * to retrieve user information and then extract * the user ID. * * @return integer Returns the UID of the psp_Facebook user, or 0 * if the psp_Facebook user could not be determined. */ protected function getUserFromAccessToken() { try { $user_info = $this->api('/me'); return $user_info['id']; } catch (psp_FacebookApiException $e) { return 0; } } /** * Returns the access token that should be used for logged out * users when no authorization code is available. * * @return string The application access token, useful for gathering * public information about users and applications. */ public function getApplicationAccessToken() { return $this->appId.'|'.$this->appSecret; } /** * Lays down a CSRF state token for this process. * * @return void */ protected function establishCSRFTokenState() { if ($this->state === null) { $this->state = md5(uniqid(mt_rand(), true)); $this->setPersistentData('state', $this->state); } } /** * Retrieves an access token for the given authorization code * (previously generated from www.facebook.com on behalf of * a specific user). The authorization code is sent to graph.facebook.com * and a legitimate access token is generated provided the access token * and the user for which it was generated all match, and the user is * either logged in to psp_Facebook or has granted an offline access permission. * * @param string $code An authorization code. * @return mixed An access token exchanged for the authorization code, or * false if an access token could not be generated. */ protected function getAccessTokenFromCode($code, $redirect_uri = null) { if (empty($code)) { return false; } if ($redirect_uri === null) { $redirect_uri = $this->getCurrentUrl(); } try { // need to circumvent json_decode by calling _oauthRequest // directly, since response isn't JSON format. $access_token_response = $this->_oauthRequest( $this->getUrl('graph', '/oauth/access_token'), $params = array('client_id' => $this->getAppId(), 'client_secret' => $this->getAppSecret(), 'redirect_uri' => $redirect_uri, 'code' => $code)); } catch (psp_FacebookApiException $e) { // most likely that user very recently revoked authorization. // In any event, we don't have an access token, so say so. return false; } if (empty($access_token_response)) { return false; } $response_params = array(); parse_str($access_token_response, $response_params); if (!isset($response_params['access_token'])) { return false; } return $response_params['access_token']; } /** * Invoke the old restserver.php endpoint. * * @param array $params Method call object * * @return mixed The decoded response object * @throws psp_FacebookApiException */ protected function _restserver($params) { // generic application level parameters $params['api_key'] = $this->getAppId(); $params['format'] = 'json-strings'; $result = json_decode($this->_oauthRequest( $this->getApiUrl($params['method']), $params ), true); // results are returned, errors are thrown if (is_array($result) && isset($result['error_code'])) { $this->throwAPIException($result); // @codeCoverageIgnoreStart } // @codeCoverageIgnoreEnd $method = strtolower($params['method']); if ($method === 'auth.expiresession' || $method === 'auth.revokeauthorization') { $this->destroySession(); } return $result; } /** * Return true if this is video post. * * @param string $path The path * @param string $method The http method (default 'GET') * * @return boolean true if this is video post */ protected function isVideoPost($path, $method = 'GET') { if ($method == 'POST' && preg_match("/^(\/)(.+)(\/)(videos)$/", $path)) { return true; } return false; } /** * Invoke the Graph API. * * @param string $path The path (required) * @param string $method The http method (default 'GET') * @param array $params The query/post data * * @return mixed The decoded response object * @throws psp_FacebookApiException */ protected function _graph($path, $method = 'GET', $params = array()) { if (is_array($method) && empty($params)) { $params = $method; $method = 'GET'; } $params['method'] = $method; // method override as we always do a POST if ($this->isVideoPost($path, $method)) { $domainKey = 'graph_video'; } else { $domainKey = 'graph'; } $result = json_decode($this->_oauthRequest( $this->getUrl($domainKey, $path), $params ), true); // results are returned, errors are thrown if (is_array($result) && isset($result['error'])) { $this->throwAPIException($result); // @codeCoverageIgnoreStart } // @codeCoverageIgnoreEnd return $result; } /** * Make a OAuth Request. * * @param string $url The path (required) * @param array $params The query/post data * * @return string The decoded response object * @throws psp_FacebookApiException */ protected function _oauthRequest($url, $params) { if (!isset($params['access_token'])) { $params['access_token'] = $this->getAccessToken(); } if (isset($params['access_token'])) { $params['appsecret_proof'] = $this->getAppSecretProof($params['access_token']); } // json_encode all params values that are not strings foreach ($params as $key => $value) { if (!is_string($value) && !($value instanceof CURLFile)) { $params[$key] = json_encode($value); } } return $this->makeRequest($url, $params); } /** * Generate a proof of App Secret * This is required for all API calls originating from a server * It is a sha256 hash of the access_token made using the app secret * * @param string $access_token The access_token to be hashed (required) * * @return string The sha256 hash of the access_token */ protected function getAppSecretProof($access_token) { return hash_hmac('sha256', $access_token, $this->getAppSecret()); } /** * Makes an HTTP request. This method can be overridden by subclasses if * developers want to do fancier things or use something other than curl to * make the request. * * @param string $url The URL to make the request to * @param array $params The parameters to use for the POST body * @param CurlHandler $ch Initialized curl handle * * @return string The response text */ protected function makeRequest($url, $params, $ch=null) { if (!$ch) { $ch = curl_init(); } $opts = self::$CURL_OPTS; if ($this->getFileUploadSupport()) { $opts[CURLOPT_POSTFIELDS] = $params; } else { $opts[CURLOPT_POSTFIELDS] = http_build_query($params, null, '&'); } $opts[CURLOPT_URL] = $url; // disable the 'Expect: 100-continue' behaviour. This causes CURL to wait // for 2 seconds if the server does not support this header. if (isset($opts[CURLOPT_HTTPHEADER])) { $existing_headers = $opts[CURLOPT_HTTPHEADER]; $existing_headers[] = 'Expect:'; $opts[CURLOPT_HTTPHEADER] = $existing_headers; } else { $opts[CURLOPT_HTTPHEADER] = array('Expect:'); } curl_setopt_array($ch, $opts); $result = curl_exec($ch); $errno = curl_errno($ch); // CURLE_SSL_CACERT || CURLE_SSL_CACERT_BADFILE if ($errno == 60 || $errno == 77) { self::errorLog('Invalid or no certificate authority found, '. 'using bundled information'); curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . DIRECTORY_SEPARATOR . 'fb_ca_chain_bundle.crt'); $result = curl_exec($ch); } // With dual stacked DNS responses, it's possible for a server to // have IPv6 enabled but not have IPv6 connectivity. If this is // the case, curl will try IPv4 first and if that fails, then it will // fall back to IPv6 and the error EHOSTUNREACH is returned by the // operating system. if ($result === false && empty($opts[CURLOPT_IPRESOLVE])) { $matches = array(); $regex = '/Failed to connect to ([^:].*): Network is unreachable/'; if (preg_match($regex, curl_error($ch), $matches)) { if (strlen(@inet_pton($matches[1])) === 16) { self::errorLog('Invalid IPv6 configuration on server, '. 'Please disable or get native IPv6 on your server.'); self::$CURL_OPTS[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V4; curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); $result = curl_exec($ch); } } } if ($result === false) { $e = new psp_FacebookApiException(array( 'error_code' => curl_errno($ch), 'error' => array( 'message' => curl_error($ch), 'type' => 'CurlException', ), )); curl_close($ch); throw $e; } curl_close($ch); return $result; } /** * Parses a signed_request and validates the signature. * * @param string $signed_request A signed token * @return array The payload inside it or null if the sig is wrong */ protected function parseSignedRequest($signed_request) { list($encoded_sig, $payload) = explode('.', $signed_request, 2); // decode the data $sig = self::base64UrlDecode($encoded_sig); $data = json_decode(self::base64UrlDecode($payload), true); if (strtoupper($data['algorithm']) !== self::SIGNED_REQUEST_ALGORITHM) { self::errorLog( 'Unknown algorithm. Expected ' . self::SIGNED_REQUEST_ALGORITHM); return null; } // check sig $expected_sig = hash_hmac('sha256', $payload, $this->getAppSecret(), $raw = true); if (strlen($expected_sig) !== strlen($sig)) { self::errorLog('Bad Signed JSON signature!'); return null; } $result = 0; for ($i = 0; $i < strlen($expected_sig); $i++) { $result |= ord($expected_sig[$i]) ^ ord($sig[$i]); } if ($result == 0) { return $data; } else { self::errorLog('Bad Signed JSON signature!'); return null; } } /** * Makes a signed_request blob using the given data. * * @param array The data array. * @return string The signed request. */ protected function makeSignedRequest($data) { if (!is_array($data)) { throw new InvalidArgumentException( 'makeSignedRequest expects an array. Got: ' . print_r($data, true)); } $data['algorithm'] = self::SIGNED_REQUEST_ALGORITHM; $data['issued_at'] = time(); $json = json_encode($data); $b64 = self::base64UrlEncode($json); $raw_sig = hash_hmac('sha256', $b64, $this->getAppSecret(), $raw = true); $sig = self::base64UrlEncode($raw_sig); return $sig.'.'.$b64; } /** * Build the URL for api given parameters. * * @param $method String the method name. * @return string The URL for the given parameters */ protected function getApiUrl($method) { static $READ_ONLY_CALLS = array('admin.getallocation' => 1, 'admin.getappproperties' => 1, 'admin.getbannedusers' => 1, 'admin.getlivestreamvialink' => 1, 'admin.getmetrics' => 1, 'admin.getrestrictioninfo' => 1, 'application.getpublicinfo' => 1, 'auth.getapppublickey' => 1, 'auth.getsession' => 1, 'auth.getsignedpublicsessiondata' => 1, 'comments.get' => 1, 'connect.getunconnectedfriendscount' => 1, 'dashboard.getactivity' => 1, 'dashboard.getcount' => 1, 'dashboard.getglobalnews' => 1, 'dashboard.getnews' => 1, 'dashboard.multigetcount' => 1, 'dashboard.multigetnews' => 1, 'data.getcookies' => 1, 'events.get' => 1, 'events.getmembers' => 1, 'fbml.getcustomtags' => 1, 'feed.getappfriendstories' => 1, 'feed.getregisteredtemplatebundlebyid' => 1, 'feed.getregisteredtemplatebundles' => 1, 'fql.multiquery' => 1, 'fql.query' => 1, 'friends.arefriends' => 1, 'friends.get' => 1, 'friends.getappusers' => 1, 'friends.getlists' => 1, 'friends.getmutualfriends' => 1, 'gifts.get' => 1, 'groups.get' => 1, 'groups.getmembers' => 1, 'intl.gettranslations' => 1, 'links.get' => 1, 'notes.get' => 1, 'notifications.get' => 1, 'pages.getinfo' => 1, 'pages.isadmin' => 1, 'pages.isappadded' => 1, 'pages.isfan' => 1, 'permissions.checkavailableapiaccess' => 1, 'permissions.checkgrantedapiaccess' => 1, 'photos.get' => 1, 'photos.getalbums' => 1, 'photos.gettags' => 1, 'profile.getinfo' => 1, 'profile.getinfooptions' => 1, 'stream.get' => 1, 'stream.getcomments' => 1, 'stream.getfilters' => 1, 'users.getinfo' => 1, 'users.getloggedinuser' => 1, 'users.getstandardinfo' => 1, 'users.hasapppermission' => 1, 'users.isappuser' => 1, 'users.isverified' => 1, 'video.getuploadlimits' => 1); $name = 'api'; if (isset($READ_ONLY_CALLS[strtolower($method)])) { $name = 'api_read'; } else if (strtolower($method) == 'video.upload') { $name = 'api_video'; } return self::getUrl($name, 'restserver.php'); } /** * Build the URL for given domain alias, path and parameters. * * @param $name string The name of the domain * @param $path string Optional path (without a leading slash) * @param $params array Optional query parameters * * @return string The URL for the given parameters */ protected function getUrl($name, $path='', $params=array()) { $url = self::$DOMAIN_MAP[$name]; if ($path) { if ($path[0] === '/') { $path = substr($path, 1); } $url .= $path; } if ($params) { $url .= '?' . http_build_query($params, null, '&'); } return $url; } protected function getHttpHost() { if ($this->trustForwarded && isset($_SERVER['HTTP_X_FORWARDED_HOST'])) { return $_SERVER['HTTP_X_FORWARDED_HOST']; } return $_SERVER['HTTP_HOST']; } protected function getHttpProtocol() { if ($this->trustForwarded && isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) { if ($_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { return 'https'; } return 'http'; } /*apache + variants specific way of checking for https*/ if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] === 'on' || $_SERVER['HTTPS'] == 1)) { return 'https'; } /*nginx way of checking for https*/ if (isset($_SERVER['SERVER_PORT']) && ($_SERVER['SERVER_PORT'] === '443')) { return 'https'; } return 'http'; } /** * Get the base domain used for the cookie. */ protected function getBaseDomain() { // The base domain is stored in the metadata cookie if not we fallback // to the current hostname $metadata = $this->getMetadataCookie(); if (array_key_exists('base_domain', $metadata) && !empty($metadata['base_domain'])) { return trim($metadata['base_domain'], '.'); } return $this->getHttpHost(); } /** * Returns the Current URL, stripping it of known FB parameters that should * not persist. * * @return string The current URL */ protected function getCurrentUrl() { $protocol = $this->getHttpProtocol() . '://'; $host = $this->getHttpHost(); $currentUrl = $protocol.$host.$_SERVER['REQUEST_URI']; $parts = parse_url($currentUrl); $query = ''; if (!empty($parts['query'])) { // drop known fb params $params = explode('&', $parts['query']); $retained_params = array(); foreach ($params as $param) { if ($this->shouldRetainParam($param)) { $retained_params[] = $param; } } if (!empty($retained_params)) { $query = '?'.implode($retained_params, '&'); } } // use port if non default $port = isset($parts['port']) && (($protocol === 'http://' && $parts['port'] !== 80) || ($protocol === 'https://' && $parts['port'] !== 443)) ? ':' . $parts['port'] : ''; // rebuild return $protocol . $parts['host'] . $port . $parts['path'] . $query; } /** * Returns true if and only if the key or key/value pair should * be retained as part of the query string. This amounts to * a brute-force search of the very small list of psp_Facebook-specific * params that should be stripped out. * * @param string $param A key or key/value pair within a URL's query (e.g. * 'foo=a', 'foo=', or 'foo'. * * @return boolean */ protected function shouldRetainParam($param) { foreach (self::$DROP_QUERY_PARAMS as $drop_query_param) { if (strpos($param, $drop_query_param.'=') === 0) { return false; } } return true; } /** * Analyzes the supplied result to see if it was thrown * because the access token is no longer valid. If that is * the case, then we destroy the session. * * @param $result array A record storing the error message returned * by a failed API call. */ protected function throwAPIException($result) { $e = new psp_FacebookApiException($result); switch ($e->getType()) { // OAuth 2.0 Draft 00 style case 'OAuthException': // OAuth 2.0 Draft 10 style case 'invalid_token': // REST server errors are just Exceptions case 'Exception': $message = $e->getMessage(); if ((strpos($message, 'Error validating access token') !== false) || (strpos($message, 'Invalid OAuth access token') !== false) || (strpos($message, 'An active access token must be used') !== false) ) { $this->destroySession(); } break; } throw $e; } /** * Prints to the error log if you aren't in command line mode. * * @param string $msg Log message */ protected static function errorLog($msg) { // disable error log if we are running in a CLI environment // @codeCoverageIgnoreStart if (php_sapi_name() != 'cli') { error_log($msg); } // uncomment this if you want to see the errors on the page // print 'error_log: '.$msg."\n"; // @codeCoverageIgnoreEnd } /** * Base64 encoding that doesn't need to be urlencode()ed. * Exactly the same as base64_encode except it uses * - instead of + * _ instead of / * No padded = * * @param string $input base64UrlEncoded string * @return string */ protected static function base64UrlDecode($input) { return base64_decode(strtr($input, '-_', '+/')); } /** * Base64 encoding that doesn't need to be urlencode()ed. * Exactly the same as base64_encode except it uses * - instead of + * _ instead of / * * @param string $input string * @return string base64Url encoded string */ protected static function base64UrlEncode($input) { $str = strtr(base64_encode($input), '+/', '-_'); $str = str_replace('=', '', $str); return $str; } /** * Destroy the current session */ public function destroySession() { $this->accessToken = null; $this->signedRequest = null; $this->user = null; $this->clearAllPersistentData(); // Javascript sets a cookie that will be used in getSignedRequest that we // need to clear if we can $cookie_name = $this->getSignedRequestCookieName(); if (array_key_exists($cookie_name, $_COOKIE)) { unset($_COOKIE[$cookie_name]); if (!headers_sent()) { $base_domain = $this->getBaseDomain(); setcookie($cookie_name, '', 1, '/', '.'.$base_domain); } else { // @codeCoverageIgnoreStart self::errorLog( 'There exists a cookie that we wanted to clear that we couldn\'t '. 'clear because headers was already sent. Make sure to do the first '. 'API call before outputing anything.' ); // @codeCoverageIgnoreEnd } } } /** * Parses the metadata cookie that our Javascript API set * * @return an array mapping key to value */ protected function getMetadataCookie() { $cookie_name = $this->getMetadataCookieName(); if (!array_key_exists($cookie_name, $_COOKIE)) { return array(); } // The cookie value can be wrapped in "-characters so remove them $cookie_value = trim($_COOKIE[$cookie_name], '"'); if (empty($cookie_value)) { return array(); } $parts = explode('&', $cookie_value); $metadata = array(); foreach ($parts as $part) { $pair = explode('=', $part, 2); if (!empty($pair[0])) { $metadata[urldecode($pair[0])] = (count($pair) > 1) ? urldecode($pair[1]) : ''; } } return $metadata; } protected static function isAllowedDomain($big, $small) { if ($big === $small) { return true; } return self::endsWith($big, '.'.$small); } protected static function endsWith($big, $small) { $len = strlen($small); if ($len === 0) { return true; } return substr($big, -$len) === $small; } /** * Each of the following four methods should be overridden in * a concrete subclass, as they are in the provided psp_Facebook class. * The psp_Facebook class uses PHP sessions to provide a primitive * persistent store, but another subclass--one that you implement-- * might use a database, memcache, or an in-memory cache. * * @see psp_Facebook */ /** * Stores the given ($key, $value) pair, so that future calls to * getPersistentData($key) return $value. This call may be in another request. * * @param string $key * @param array $value * * @return void */ abstract protected function setPersistentData($key, $value); /** * Get the data for $key, persisted by Basepsp_Facebook::setPersistentData() * * @param string $key The key of the data to retrieve * @param boolean $default The default value to return if $key is not found * * @return mixed */ abstract protected function getPersistentData($key, $default = false); /** * Clear the data with $key from the persistent storage * * @param string $key * @return void */ abstract protected function clearPersistentData($key); /** * Clear all data from the persistent storage * * @return void */ abstract protected function clearAllPersistentData(); } }*H ++73*smartSEO/lib/scripts/facebook/facebook.php obinitSharedSession(); // re-load the persisted state, since parent // attempted to read out of non-shared cookie $state = $this->getPersistentData('state'); if (!empty($state)) { $this->state = $state; } else { $this->state = null; } } } protected static $kSupportedKeys = array('state', 'code', 'access_token', 'user_id'); protected function initSharedSession() { $cookie_name = $this->getSharedSessionCookieName(); if (isset($_COOKIE[$cookie_name])) { $data = $this->parseSignedRequest($_COOKIE[$cookie_name]); if ($data && !empty($data['domain']) && self::isAllowedDomain($this->getHttpHost(), $data['domain'])) { // good case $this->sharedSessionID = $data['id']; return; } // ignoring potentially unreachable data } // evil/corrupt/missing case $base_domain = $this->getBaseDomain(); $this->sharedSessionID = md5(uniqid(mt_rand(), true)); $cookie_value = $this->makeSignedRequest( array( 'domain' => $base_domain, 'id' => $this->sharedSessionID, ) ); $_COOKIE[$cookie_name] = $cookie_value; if (!headers_sent()) { $expire = time() + self::FBSS_COOKIE_EXPIRE; setcookie($cookie_name, $cookie_value, $expire, '/', '.'.$base_domain); } else { // @codeCoverageIgnoreStart self::errorLog( 'Shared session ID cookie could not be set! You must ensure you '. 'create the psp_Facebook instance before headers have been sent. This '. 'will cause authentication issues after the first request.' ); // @codeCoverageIgnoreEnd } } /** * Provides the implementations of the inherited abstract * methods. The implementation uses PHP sessions to maintain * a store for authorization codes, user ids, CSRF states, and * access tokens. */ protected function setPersistentData($key, $value) { if (!in_array($key, self::$kSupportedKeys)) { self::errorLog('Unsupported key passed to setPersistentData.'); return; } $session_var_name = $this->constructSessionVariableName($key); $_SESSION[$session_var_name] = $value; } protected function getPersistentData($key, $default = false) { if (!in_array($key, self::$kSupportedKeys)) { self::errorLog('Unsupported key passed to getPersistentData.'); return $default; } $session_var_name = $this->constructSessionVariableName($key); return isset($_SESSION[$session_var_name]) ? $_SESSION[$session_var_name] : $default; } protected function clearPersistentData($key) { if (!in_array($key, self::$kSupportedKeys)) { self::errorLog('Unsupported key passed to clearPersistentData.'); return; } $session_var_name = $this->constructSessionVariableName($key); if (isset($_SESSION[$session_var_name])) { unset($_SESSION[$session_var_name]); } } protected function clearAllPersistentData() { foreach (self::$kSupportedKeys as $key) { $this->clearPersistentData($key); } if ($this->sharedSessionID) { $this->deleteSharedSessionCookie(); } } protected function deleteSharedSessionCookie() { $cookie_name = $this->getSharedSessionCookieName(); unset($_COOKIE[$cookie_name]); $base_domain = $this->getBaseDomain(); setcookie($cookie_name, '', 1, '/', '.'.$base_domain); } protected function getSharedSessionCookieName() { return self::FBSS_COOKIE_NAME . '_' . $this->getAppId(); } protected function constructSessionVariableName($key) { $parts = array('fb', $this->getAppId(), $key); if ($this->sharedSessionID) { array_unshift($parts, $this->sharedSessionID); } return implode('_', $parts); } } E:T ~ 4smartSEO/lib/scripts/facebook/fb_ca_chain_bundle.crt ob## ## ca-bundle.crt -- Bundle of CA Root Certificates ## ## Certificate data from Mozilla as of: Thu Oct 18 19:05:59 2012 ## ## This is a bundle of X.509 certificates of public Certificate Authorities ## (CA). These were automatically extracted from Mozilla's root certificates ## file (certdata.txt). This file can be found in the mozilla source tree: ## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 ## ## It contains the certificates in PEM format and therefore ## can be directly used with curl / libcurl / php_curl, or with ## an Apache+mod_ssl webserver for SSL client authentication. ## Just configure this file as the SSLCACertificateFile. ## # @(#) $RCSfile: certdata.txt,v $ $Revision: 1.86 $ $Date: 2012/10/18 16:26:52 $ GTE CyberTrust Global Root ========================== -----BEGIN CERTIFICATE----- MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ -----END CERTIFICATE----- Thawte Server CA ================ -----BEGIN CERTIFICATE----- MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl /Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= -----END CERTIFICATE----- Thawte Premium Server CA ======================== -----BEGIN CERTIFICATE----- MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf 8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t UCemDaYj+bvLpgcUQg== -----END CERTIFICATE----- Equifax Secure CA ================= -----BEGIN CERTIFICATE----- MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW 8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 70+sB3c4 -----END CERTIFICATE----- Digital Signature Trust Co. Global CA 1 ======================================= -----BEGIN CERTIFICATE----- MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4 RbyhkwS7hp86W0N6w4pl -----END CERTIFICATE----- Digital Signature Trust Co. Global CA 3 ======================================= -----BEGIN CERTIFICATE----- MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1 mPnHfxsb1gYgAlihw6ID -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority ======================================================= -----BEGIN CERTIFICATE----- MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf Tqj/ZA1k -----END CERTIFICATE----- Verisign Class 1 Public Primary Certification Authority - G2 ============================================================ -----BEGIN CERTIFICATE----- MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgd k4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIq WpDBucSmFc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQAB MA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9ZrbWB85a7FkCMM XErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2uluIncrKTdcu1OofdPvAbT6shkdHvC lUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68DzFc6PLZ -----END CERTIFICATE----- Verisign Class 2 Public Primary Certification Authority - G2 ============================================================ -----BEGIN CERTIFICATE----- MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjx nNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRC wiNPStjwDqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEA ATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/7aHmZuovCfTK 1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAXrXfMSTWqz9iP0b63GJZHc2pUIjRk LbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnInjBJ7xUS0rg== -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority - G2 ============================================================ -----BEGIN CERTIFICATE----- MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT 1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 -----END CERTIFICATE----- GlobalSign Root CA ================== -----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- GlobalSign Root CA - R2 ======================= -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- ValiCert Class 1 VA =================== -----BEGIN CERTIFICATE----- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP Orf1LXLI -----END CERTIFICATE----- ValiCert Class 2 VA =================== -----BEGIN CERTIFICATE----- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 W9ViH0Pd -----END CERTIFICATE----- RSA Root Certificate 1 ====================== -----BEGIN CERTIFICATE----- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td 3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs 3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r on+jjBXu -----END CERTIFICATE----- Verisign Class 1 Public Primary Certification Authority - G3 ============================================================ -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/E bRrsC+MO8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJ rKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7PoBMAGrgnoeS+ Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP26KbqxzcSXKMpHgLZ2x87tNcPVkeB FQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA q2aN17O6x5q25lXQBfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrspSCAaWihT37h a88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/Pc D98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== -----END CERTIFICATE----- Verisign Class 2 Public Primary Certification Authority - G3 ============================================================ -----BEGIN CERTIFICATE----- MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVT MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y azE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ug b25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0 aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y aXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6 tW8UvxDOJxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7 C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQHgiBVrKtaaNS 0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjNqWm6o+sdDZykIKbBoMXRRkwXbdKs Zj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0 JhU8wI1NQ0kdvekhktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf 0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RIsH/7NiXaldDx JBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//j GHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority - G3 ============================================================ -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== -----END CERTIFICATE----- Verisign Class 4 Public Primary Certification Authority - G3 ============================================================ -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM 8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== -----END CERTIFICATE----- Entrust.net Secure Server CA ============================ -----BEGIN CERTIFICATE----- MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= -----END CERTIFICATE----- Entrust.net Premium 2048 Secure Server CA ========================================= -----BEGIN CERTIFICATE----- MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z 2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== -----END CERTIFICATE----- Baltimore CyberTrust Root ========================= -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- Equifax Secure Global eBusiness CA ================================== -----BEGIN CERTIFICATE----- MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV -----END CERTIFICATE----- Equifax Secure eBusiness CA 1 ============================= -----BEGIN CERTIFICATE----- MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ 1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ KpYrtWKmpj29f5JZzVoqgrI3eQ== -----END CERTIFICATE----- Equifax Secure eBusiness CA 2 ============================= -----BEGIN CERTIFICATE----- MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn 2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5 BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1 jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia 78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm V+GRMOrN -----END CERTIFICATE----- AddTrust Low-Value Services Root ================================ -----BEGIN CERTIFICATE----- MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= -----END CERTIFICATE----- AddTrust External Root ====================== -----BEGIN CERTIFICATE----- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- AddTrust Public Services Root ============================= -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB /zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL +YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= -----END CERTIFICATE----- AddTrust Qualified Certificates Root ==================================== -----BEGIN CERTIFICATE----- MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx 64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= -----END CERTIFICATE----- Entrust Root Certification Authority ==================================== -----BEGIN CERTIFICATE----- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- RSA Security 2048 v3 ==================== -----BEGIN CERTIFICATE----- MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP +Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj 0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA pKnXwiJPZ9d37CAFYd4= -----END CERTIFICATE----- GeoTrust Global CA ================== -----BEGIN CERTIFICATE----- MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm Mw== -----END CERTIFICATE----- GeoTrust Global CA 2 ==================== -----BEGIN CERTIFICATE----- MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF H4z1Ir+rzoPz4iIprn2DQKi6bA== -----END CERTIFICATE----- GeoTrust Universal CA ===================== -----BEGIN CERTIFICATE----- MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI P/rmMuGNG2+k5o7Y+SlIis5z/iw= -----END CERTIFICATE----- GeoTrust Universal CA 2 ======================= -----BEGIN CERTIFICATE----- MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- UTN-USER First-Network Applications =================================== -----BEGIN CERTIFICATE----- MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCBozELMAkGA1UE BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzAp BgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5 WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5T YWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBB cHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZVhawGNFug mliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4Cj DUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXu Ozr0hAReYFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwi P8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7igEL66S/ozjIE j3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8w HQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9j cmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6LzsQCv4AdRWOOTK RIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4Qp xFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAq DbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjisH8SE -----END CERTIFICATE----- America Online Root Certification Authority 1 ============================================= -----BEGIN CERTIFICATE----- MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP 8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft 3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 -----END CERTIFICATE----- America Online Root Certification Authority 2 ============================================= -----BEGIN CERTIFICATE----- MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn 6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p +DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh 1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= -----END CERTIFICATE----- Visa eCommerce Root =================== -----BEGIN CERTIFICATE----- MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt 398znM/jra6O1I7mT1GvFpLgXPYHDw== -----END CERTIFICATE----- Certum Root CA ============== -----BEGIN CERTIFICATE----- MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ 89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ 0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== -----END CERTIFICATE----- Comodo AAA Services root ======================== -----BEGIN CERTIFICATE----- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- Comodo Secure Services root =========================== -----BEGIN CERTIFICATE----- MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP 9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm 4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H RR3B7Hzs/Sk= -----END CERTIFICATE----- Comodo Trusted Services root ============================ -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y /9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB /zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O 9y5Xt5hwXsjEeLBi -----END CERTIFICATE----- QuoVadis Root CA ================ -----BEGIN CERTIFICATE----- MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi 5nrQNiOKSnQ2+Q== -----END CERTIFICATE----- QuoVadis Root CA 2 ================== -----BEGIN CERTIFICATE----- MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- QuoVadis Root CA 3 ================== -----BEGIN CERTIFICATE----- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- Security Communication Root CA ============================== -----BEGIN CERTIFICATE----- MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi FL39vmwLAw== -----END CERTIFICATE----- Sonera Class 1 Root CA ====================== -----BEGIN CERTIFICATE----- MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQw NjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh IENsYXNzMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H88 7dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9 EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl 0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF645 2F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW1ebZrgUa HXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZT iFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE9 28Jj2VuXZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxV yhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2nBBhjrZTOqMR vq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2UvkVrCqIexVmiUefkl98HVrhq4uz2P qYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9Z IRlXvVWa -----END CERTIFICATE----- Sonera Class 2 Root CA ====================== -----BEGIN CERTIFICATE----- MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH llpwrN9M -----END CERTIFICATE----- Staat der Nederlanden Root CA ============================= -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== -----END CERTIFICATE----- TDC Internet Root CA ==================== -----BEGIN CERTIFICATE----- MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc 5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ 2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l -----END CERTIFICATE----- TDC OCES Root CA ================ -----BEGIN CERTIFICATE----- MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5 MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0 zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO 3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB 5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647 +RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6 NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4 A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9 AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1 AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw== -----END CERTIFICATE----- UTN DATACorp SGC Root CA ======================== -----BEGIN CERTIFICATE----- MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA 9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv 33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI -----END CERTIFICATE----- UTN USERFirst Email Root CA =========================== -----BEGIN CERTIFICATE----- MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0 BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05 OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQx FzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJz dC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIx B8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8 om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHG TPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7Nl yP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws6wIDAQABo4G5MIG2MAsGA1UdDwQE AwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNV HR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u7mFVbwQ+zzne xRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+ 5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarV NZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZ w7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= -----END CERTIFICATE----- UTN USERFirst Hardware Root CA ============================== -----BEGIN CERTIFICATE----- MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM //bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 nfhmqA== -----END CERTIFICATE----- UTN USERFirst Object Root CA ============================ -----BEGIN CERTIFICATE----- MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UE BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAb BgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAz NlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2Vy dHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEB BQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VR loTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vu lBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7 RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEAAaOBrzCBrDAL BgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8 ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly c3QtT2JqZWN0LmNybDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNO PmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFE qmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCG hU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g= -----END CERTIFICATE----- Camerfirma Chambers of Commerce Root ==================================== -----BEGIN CERTIFICATE----- MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 erfutGWaIZDgqtCYvDi1czyL+Nw= -----END CERTIFICATE----- Camerfirma Global Chambersign Root ================================== -----BEGIN CERTIFICATE----- MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J 1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl 6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c 8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== -----END CERTIFICATE----- NetLock Qualified (Class QA) Root ================================= -----BEGIN CERTIFICATE----- MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUxETAPBgNVBAcT CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV BAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVn eXpvaSAoQ2xhc3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0 bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTER MA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0 LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0 dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3DQEJARYP aW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRV CacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e 8ia6AFQer7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhb m+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrqOU+L73Sa58XQ 0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0lmT+1fMptsK6ZmfoIYOcZwvK9UdPM 0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV HQ8BAf8EBAMCAQYwggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2 YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQgZWxla3Ryb25p a3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFz YW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwg YXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kg ZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczov L3d3dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2Nr Lm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0 aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMg YXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0 IGluZm9AbmV0bG9jay5uZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3 DQEBBQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQMznN wNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+NFAwLvt/MpqNPfMg W/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTc R08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR 5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko -----END CERTIFICATE----- NetLock Notary (Class A) Root ============================= -----BEGIN CERTIFICATE----- MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC /tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM 8CgHrTwXZoi1/baI -----END CERTIFICATE----- NetLock Business (Class B) Root =============================== -----BEGIN CERTIFICATE----- MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr 1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM 43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI -----END CERTIFICATE----- NetLock Express (Class C) Root ============================== -----BEGIN CERTIFICATE----- MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== -----END CERTIFICATE----- XRamp Global CA Root ==================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- Go Daddy Class 2 CA =================== -----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b vZ8= -----END CERTIFICATE----- Starfield Class 2 CA ==================== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- StartCom Certification Authority ================================ -----BEGIN CERTIFICATE----- MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT 37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh 3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl 1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro g14= -----END CERTIFICATE----- Taiwan GRCA =========== -----BEGIN CERTIFICATE----- MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O 1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk 7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS -----END CERTIFICATE----- Firmaprofesional Root CA ======================== -----BEGIN CERTIFICATE----- MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2 ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf 3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8 NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm 7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= -----END CERTIFICATE----- Wells Fargo Root CA =================== -----BEGIN CERTIFICATE----- MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3 E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5 OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023 tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= -----END CERTIFICATE----- Swisscom Root CA 1 ================== -----BEGIN CERTIFICATE----- MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4 MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn 7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5 haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9 MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3 1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW NY6E0F/6MBr1mmz0DlP5OlvRHA== -----END CERTIFICATE----- DigiCert Assured ID Root CA =========================== -----BEGIN CERTIFICATE----- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- DigiCert Global Root CA ======================= -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- DigiCert High Assurance EV Root CA ================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K -----END CERTIFICATE----- Certplus Class 2 Primary CA =========================== -----BEGIN CERTIFICATE----- MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 l7+ijrRU -----END CERTIFICATE----- DST Root CA X3 ============== -----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- DST ACES CA X6 ============== -----BEGIN CERTIFICATE----- MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 oKfN5XozNmr6mis= -----END CERTIFICATE----- TURKTRUST Certificate Services Provider Root 1 ============================================== -----BEGIN CERTIFICATE----- MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ 8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H -----END CERTIFICATE----- TURKTRUST Certificate Services Provider Root 2 ============================================== -----BEGIN CERTIFICATE----- MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr 5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P 9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 UrbnBEI= -----END CERTIFICATE----- SwissSign Platinum CA - G2 ========================== -----BEGIN CERTIFICATE----- MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCQ0gxFTAT BgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWduIFBsYXRpbnVtIENBIC0gRzIw HhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAwWjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMM U3dpc3NTaWduIEFHMSMwIQYDVQQDExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJ KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu 669yIIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2HtnIuJpX+UF eNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+6ixuEFGSzH7VozPY1kne WCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5objM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIo j5+saCB9bzuohTEJfwvH6GXp43gOCWcwizSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/6 8++QHkwFix7qepF6w9fl+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34T aNhxKFrYzt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaPpZjy domyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtFKwH3HBqi7Ri6Cr2D +m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuWae5ogObnmLo2t/5u7Su9IPhlGdpV CX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMBAAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCv zAeHFUdvOMW0ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUAA4ICAQAIhab1 Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0uMoI3LQwnkAHFmtllXcBrqS3 NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4 U99REJNi54Av4tHgvI42Rncz7Lj7jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8 KV2LwUvJ4ooTHbG/u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl 9x8DYSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1puEa+S1B aYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXaicYwu+uPyyIIoK6q8QNs OktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbGDI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSY Mdp08YSTcU1f+2BY0fvEwW2JorsgH51xkcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAci IfNAChs0B0QTwoRqjt8ZWr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== -----END CERTIFICATE----- SwissSign Gold CA - G2 ====================== -----BEGIN CERTIFICATE----- MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- SwissSign Silver CA - G2 ======================== -----BEGIN CERTIFICATE----- MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- GeoTrust Primary Certification Authority ======================================== -----BEGIN CERTIFICATE----- MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= -----END CERTIFICATE----- thawte Primary Root CA ====================== -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G5 ============================================================ -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq -----END CERTIFICATE----- SecureTrust CA ============== -----BEGIN CERTIFICATE----- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= -----END CERTIFICATE----- Secure Global CA ================ -----BEGIN CERTIFICATE----- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW -----END CERTIFICATE----- COMODO Certification Authority ============================== -----BEGIN CERTIFICATE----- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== -----END CERTIFICATE----- Network Solutions Certificate Authority ======================================= -----BEGIN CERTIFICATE----- MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- WellsSecure Public Root Certificate Authority ============================================= -----BEGIN CERTIFICATE----- MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ tylv2G0xffX8oRAHh84vWdw+WNs= -----END CERTIFICATE----- COMODO ECC Certification Authority ================================== -----BEGIN CERTIFICATE----- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- IGC/A ===== -----BEGIN CERTIFICATE----- MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF 0mBWWg== -----END CERTIFICATE----- Security Communication EV RootCA1 ================================= -----BEGIN CERTIFICATE----- MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO /VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK 9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 -----END CERTIFICATE----- OISTE WISeKey Global Root GA CA =============================== -----BEGIN CERTIFICATE----- MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= -----END CERTIFICATE----- S-TRUST Authentication and Encryption Root CA 2005 PN ===================================================== -----BEGIN CERTIFICATE----- MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE BhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcpMRIwEAYDVQQHEwlTdHV0dGdh cnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fzc2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVT LVRSVVNUIEF1dGhlbnRpY2F0aW9uIGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0w NTA2MjIwMDAwMDBaFw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFk ZW4tV3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMgRGV1dHNj aGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJVU1QgQXV0aGVudGljYXRp b24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob 4QSwI7+Vio5bG0F/WsPoTUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXL g3KSwlOyggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1Xgqf eN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteFhy+S8dF2g08LOlk3 KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm7QIDAQABo4GSMIGPMBIGA1UdEwEB /wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJv bmxpbmUxLTIwNDgtNTAdBgNVHQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAU D8oeXHngovMpttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFoLtU96G7m1R08 P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersFiXOMy6ZNwPv2AtawB6MDwidA nwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0yh9WUUpY6RsZxlj33mA6ykaqP2vROJAA5Veit F7nTNCtKqUDMFypVZUF0Qn71wK/Ik63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8b Hz2eBIPdltkdOpQ= -----END CERTIFICATE----- Microsec e-Szigno Root CA ========================= -----BEGIN CERTIFICATE----- MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA 4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a 86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= -----END CERTIFICATE----- Certigna ======== -----BEGIN CERTIFICATE----- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. ====================================== -----BEGIN CERTIFICATE----- MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU 2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP 2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm 8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK 5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v /zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f /RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== -----END CERTIFICATE----- TC TrustCenter Class 2 CA II ============================ -----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB 7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk vQ== -----END CERTIFICATE----- TC TrustCenter Class 3 CA II ============================ -----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo 6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk 2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB 7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal 092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc 5A== -----END CERTIFICATE----- TC TrustCenter Universal CA I ============================= -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG 1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a 7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY -----END CERTIFICATE----- Deutsche Telekom Root CA 2 ========================== -----BEGIN CERTIFICATE----- MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU Cm26OWMohpLzGITY+9HPBVZkVw== -----END CERTIFICATE----- ComSign CA ========== -----BEGIN CERTIFICATE----- MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0MRMwEQYDVQQD EwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTMy MThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMTCkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNp Z24xCzAJBgNVBAYTAklMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49q ROR+WCf4C9DklBKK8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTy P2Q298CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb2CEJKHxN GGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxCejVb7Us6eva1jsz/D3zk YDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7KpiXd3DTKaCQeQzC6zJMw9kglcq/QytNuEM rkvF7zuZ2SOzW120V+x0cAwqTwIDAQABo4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAy oDCgLoYsaHR0cDovL2ZlZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0P AQH/BAQDAgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRLAZs+ VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWdfoPPbrxHbvUanlR2 QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0McXS6hMTXcpuEfDhOZAYnKuGntewI mbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb /627HOkthIDYIb6FUtnUdLlphbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VG zT2ouvDzuFYkRes3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U AGegcQCCSA== -----END CERTIFICATE----- ComSign Secured CA ================== -----BEGIN CERTIFICATE----- MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs 49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH 7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP 51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== -----END CERTIFICATE----- Cybertrust Global Root ====================== -----BEGIN CERTIFICATE----- MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW WL1WMRJOEcgh4LMRkWXbtKaIOM5V -----END CERTIFICATE----- ePKI Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 ============================================================================================================================= -----BEGIN CERTIFICATE----- MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR 6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= -----END CERTIFICATE----- Buypass Class 2 CA 1 ==================== -----BEGIN CERTIFICATE----- MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV 1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt 7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho -----END CERTIFICATE----- Buypass Class 3 CA 1 ==================== -----BEGIN CERTIFICATE----- MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c 1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 -----END CERTIFICATE----- EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 ========================================================================== -----BEGIN CERTIFICATE----- MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0 Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK 1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt 2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9 AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT -----END CERTIFICATE----- certSIGN ROOT CA ================ -----BEGIN CERTIFICATE----- MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD -----END CERTIFICATE----- CNNIC ROOT ========== -----BEGIN CERTIFICATE----- MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m mxE= -----END CERTIFICATE----- ApplicationCA - Japanese Government =================================== -----BEGIN CERTIFICATE----- MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g /DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL rosot4LKGAfmt1t06SAZf7IbiVQ= -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G3 ============================================= -----BEGIN CERTIFICATE----- MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt -----END CERTIFICATE----- thawte Primary Root CA - G2 =========================== -----BEGIN CERTIFICATE----- MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== -----END CERTIFICATE----- thawte Primary Root CA - G3 =========================== -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G2 ============================================= -----BEGIN CERTIFICATE----- MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 npaqBA+K -----END CERTIFICATE----- VeriSign Universal Root Certification Authority =============================================== -----BEGIN CERTIFICATE----- MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 mJO37M2CYfE45k+XmCpajQ== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G4 ============================================================ -----BEGIN CERTIFICATE----- MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- NetLock Arany (Class Gold) Főtanúsítvány ============================================ -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- Staat der Nederlanden Root CA - G2 ================================== -----BEGIN CERTIFICATE----- MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ 5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz +51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm 66+KAQ== -----END CERTIFICATE----- CA Disig ======== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA 4Z7CRneC9VkGjCFMhwnN5ag= -----END CERTIFICATE----- Juur-SK ======= -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC +Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 yyqcjg== -----END CERTIFICATE----- Hongkong Post Root CA 1 ======================= -----BEGIN CERTIFICATE----- MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== -----END CERTIFICATE----- SecureSign RootCA11 =================== -----BEGIN CERTIFICATE----- MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= -----END CERTIFICATE----- ACEDICOM Root ============= -----BEGIN CERTIFICATE----- MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4 MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2 3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9 2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz 4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU 9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1 ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA== -----END CERTIFICATE----- Verisign Class 1 Public Primary Certification Authority ======================================================= -----BEGIN CERTIFICATE----- MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5 IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAx IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA A4GNADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0fzGVuDLDQ VoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHiTkVWaR94AoDa3EeRKbs2 yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFgVKTk8d6Pa XCUDfGD67gmZPCcQcMgMCeazh88K4hiWNWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n 0a3hUKw8fGJLj7qE1xIVGx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZ RjXZ+Hxb -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority ======================================================= -----BEGIN CERTIFICATE----- MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ D/xwzoiQ -----END CERTIFICATE----- Microsec e-Szigno Root CA 2009 ============================== -----BEGIN CERTIFICATE----- MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi LXpUq3DDfSJlgnCW -----END CERTIFICATE----- E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi =================================================== -----BEGIN CERTIFICATE----- MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY 8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk 9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX -----END CERTIFICATE----- GlobalSign Root CA - R3 ======================= -----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r kpeDMdmztcpHWD9f -----END CERTIFICATE----- TC TrustCenter Universal CA III =============================== -----BEGIN CERTIFICATE----- MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1 M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+ KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== -----END CERTIFICATE----- Autoridad de Certificacion Firmaprofesional CIF A62634068 ========================================================= -----BEGIN CERTIFICATE----- MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V -----END CERTIFICATE----- Izenpe.com ========== -----BEGIN CERTIFICATE----- MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== -----END CERTIFICATE----- Chambers of Commerce Root - 2008 ================================ -----BEGIN CERTIFICATE----- MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ -----END CERTIFICATE----- Global Chambersign Root - 2008 ============================== -----BEGIN CERTIFICATE----- MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B -----END CERTIFICATE----- Go Daddy Root Certificate Authority - G2 ======================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 -----END CERTIFICATE----- Starfield Root Certificate Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 -----END CERTIFICATE----- Starfield Services Root Certificate Authority - G2 ================================================== -----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 -----END CERTIFICATE----- AffirmTrust Commercial ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= -----END CERTIFICATE----- AffirmTrust Networking ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= -----END CERTIFICATE----- AffirmTrust Premium =================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== -----END CERTIFICATE----- AffirmTrust Premium ECC ======================= -----BEGIN CERTIFICATE----- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM eQ== -----END CERTIFICATE----- Certum Trusted Network CA ========================= -----BEGIN CERTIFICATE----- MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= -----END CERTIFICATE----- Certinomis - Autorité Racine ============================= -----BEGIN CERTIFICATE----- MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw 2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g 530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna 4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ vgt2Fl43N+bYdJeimUV5 -----END CERTIFICATE----- Root CA Generalitat Valenciana ============================== -----BEGIN CERTIFICATE----- MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt +GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= -----END CERTIFICATE----- A-Trust-nQual-03 ================ -----BEGIN CERTIFICATE----- MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 ahq97BvIxYSazQ== -----END CERTIFICATE----- TWCA Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== -----END CERTIFICATE----- Security Communication RootCA2 ============================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- EC-ACC ====== -----BEGIN CERTIFICATE----- MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D 5EI= -----END CERTIFICATE----- Hellenic Academic and Research Institutions RootCA 2011 ======================================================= -----BEGIN CERTIFICATE----- MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 -----END CERTIFICATE----- Actalis Authentication Root CA ============================== -----BEGIN CERTIFICATE----- MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- Trustis FPS Root CA =================== -----BEGIN CERTIFICATE----- MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl iB6XzCGcKQENZetX2fNXlrtIzYE= -----END CERTIFICATE----- StartCom Certification Authority ================================ -----BEGIN CERTIFICATE----- MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT 37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA 2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= -----END CERTIFICATE----- StartCom Certification Authority G2 =================================== -----BEGIN CERTIFICATE----- MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG 4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K 2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG /+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm 7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm obp573PYtlNXLfbQ4ddI -----END CERTIFICATE----- Buypass Class 2 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn 9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b /+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN rJgWVqA= -----END CERTIFICATE----- Buypass Class 3 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR 5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh 7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH 2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV /afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz 6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi Cp/HuZc= -----END CERTIFICATE----- TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı ====================================================== -----BEGIN CERTIFICATE----- MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK poRq0Tl9 -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 3 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== -----END CERTIFICATE----- EE Certification Centre Root CA =============================== -----BEGIN CERTIFICATE----- MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM dcGWxZ0= -----END CERTIFICATE----- S :: z5smartSEO/lib/scripts/facebook/_fb_ca_chain_bundle.crt ob-----BEGIN CERTIFICATE----- MIIFgjCCBGqgAwIBAgIQDKKbZcnESGaLDuEaVk6fQjANBgkqhkiG9w0BAQUFADBm MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSUwIwYDVQQDExxEaWdpQ2VydCBIaWdoIEFzc3VyYW5j ZSBDQS0zMB4XDTEwMDExMzAwMDAwMFoXDTEzMDQxMTIzNTk1OVowaDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEX MBUGA1UEChMORmFjZWJvb2ssIEluYy4xFzAVBgNVBAMUDiouZmFjZWJvb2suY29t MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9rzj7QIuLM3sdHu1HcI1VcR3g b5FExKNV646agxSle1aQ/sJev1mh/u91ynwqd2BQmM0brZ1Hc3QrfYyAaiGGgEkp xbhezyfeYhAyO0TKAYxPnm2cTjB5HICzk6xEIwFbA7SBJ2fSyW1CFhYZyo3tIBjj 19VjKyBfpRaPkzLmRwIDAQABo4ICrDCCAqgwHwYDVR0jBBgwFoAUUOpzidsp+xCP nuUBINTeeZlIg/cwHQYDVR0OBBYEFPp+tsFBozkjrHlEnZ9J4cFj2eM0MA4GA1Ud DwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAAMF8GA1UdHwRYMFYwKaAnoCWGI2h0dHA6 Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9jYTMtZmIuY3JsMCmgJ6AlhiNodHRwOi8vY3Js NC5kaWdpY2VydC5jb20vY2EzLWZiLmNybDCCAcYGA1UdIASCAb0wggG5MIIBtQYL YIZIAYb9bAEDAAEwggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3LmRpZ2ljZXJ0 LmNvbS9zc2wtY3BzLXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUHAgIwggFWHoIB UgBBAG4AeQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQByAHQAaQBmAGkA YwBhAHQAZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBjAGUAcAB0AGEA bgBjAGUAIABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAgAEMAUAAvAEMA UABTACAAYQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQAGEAcgB0AHkA IABBAGcAcgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBtAGkAdAAgAGwA aQBhAGIAaQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBjAG8AcgBwAG8A cgBhAHQAZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBlAHIAZQBuAGMA ZQAuMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQUF AAOCAQEACOkTIdxMy11+CKrbGNLBSg5xHaTvu/v1wbyn3dO/mf68pPfJnX6ShPYy 4XM4Vk0x4uaFaU4wAGke+nCKGi5dyg0Esg7nemLNKEJaFAJZ9enxZm334lSCeARy wlDtxULGOFRyGIZZPmbV2eNq5xdU/g3IuBEhL722mTpAye9FU/J8Wsnw54/gANyO Gzkewigua8ip8Lbs9Cht399yAfbfhUP1DrAm/xEcnHrzPr3cdCtOyJaM6SRPpRqH ITK5Nc06tat9lXVosSinT3KqydzxBYua9gCFFiR3x3DgZfvXkC6KDdUlDrNcJUub a1BHnLLP4mxTHL6faAXYd05IxNn/IA== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIGVTCCBT2gAwIBAgIQCFH5WYFBRcq94CTiEsnCDjANBgkqhkiG9w0BAQUFADBs MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j ZSBFViBSb290IENBMB4XDTA3MDQwMzAwMDAwMFoXDTIyMDQwMzAwMDAwMFowZjEL MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 LmRpZ2ljZXJ0LmNvbTElMCMGA1UEAxMcRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug Q0EtMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9hCikQH17+NDdR CPge+yLtYb4LDXBMUGMmdRW5QYiXtvCgFbsIYOBC6AUpEIc2iihlqO8xB3RtNpcv KEZmBMcqeSZ6mdWOw21PoF6tvD2Rwll7XjZswFPPAAgyPhBkWBATaccM7pxCUQD5 BUTuJM56H+2MEb0SqPMV9Bx6MWkBG6fmXcCabH4JnudSREoQOiPkm7YDr6ictFuf 1EutkozOtREqqjcYjbTCuNhcBoz4/yO9NV7UfD5+gw6RlgWYw7If48hl66l7XaAs zPw82W3tzPpLQ4zJ1LilYRyyQLYoEt+5+F/+07LJ7z20Hkt8HEyZNp496+ynaF4d 32duXvsCAwEAAaOCAvcwggLzMA4GA1UdDwEB/wQEAwIBhjCCAcYGA1UdIASCAb0w ggG5MIIBtQYLYIZIAYb9bAEDAAIwggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3 LmRpZ2ljZXJ0LmNvbS9zc2wtY3BzLXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUH AgIwggFWHoIBUgBBAG4AeQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQBy AHQAaQBmAGkAYwBhAHQAZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBj AGUAcAB0AGEAbgBjAGUAIABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAg AEMAUAAvAEMAUABTACAAYQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQ AGEAcgB0AHkAIABBAGcAcgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBt AGkAdAAgAGwAaQBhAGIAaQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBj AG8AcgBwAG8AcgBhAHQAZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBl AHIAZQBuAGMAZQAuMA8GA1UdEwEB/wQFMAMBAf8wNAYIKwYBBQUHAQEEKDAmMCQG CCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wgY8GA1UdHwSBhzCB hDBAoD6gPIY6aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0SGlnaEFz c3VyYW5jZUVWUm9vdENBLmNybDBAoD6gPIY6aHR0cDovL2NybDQuZGlnaWNlcnQu Y29tL0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUVWUm9vdENBLmNybDAfBgNVHSMEGDAW gBSxPsNpA/i/RwHUmCYaCALvY2QrwzAdBgNVHQ4EFgQUUOpzidsp+xCPnuUBINTe eZlIg/cwDQYJKoZIhvcNAQEFBQADggEBAF1PhPGoiNOjsrycbeUpSXfh59bcqdg1 rslx3OXb3J0kIZCmz7cBHJvUV5eR13UWpRLXuT0uiT05aYrWNTf58SHEW0CtWakv XzoAKUMncQPkvTAyVab+hA4LmzgZLEN8rEO/dTHlIxxFVbdpCJG1z9fVsV7un5Tk 1nq5GMO41lJjHBC6iy9tXcwFOPRWBW3vnuzoYTYMFEuFFFoMg08iXFnLjIpx2vrF EIRYzwfu45DC9fkpx1ojcflZtGQriLCnNseaIGHr+k61rmsb5OPs4tk8QUmoIKRU 9ZKNu8BVIASm2LAXFszj0Mi0PeXZhMbT9m5teMl5Q+h6N/9cNUm/ocU= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEQjCCA6ugAwIBAgIEQoclDjANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEy MjIxNTI3MjdaFw0xNDA3MjIxNTU3MjdaMGwxCzAJBgNVBAYTAlVTMRUwEwYDVQQK EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xKzApBgNV BAMTIkRpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGzOVz5vvUu+UtLTKm3+WBP8nNJUm2cSrD 1ZQ0Z6IKHLBfaaZAscS3so/QmKSpQVk609yU1jzbdDikSsxNJYL3SqVTEjju80lt cZF+Y7arpl/DpIT4T2JRvvjF7Ns4kuMG5QiRDMQoQVX7y1qJFX5x6DW/TXIJPb46 OFBbdzEbjbPHJEWap6xtABRaBLe6E+tRCphBQSJOZWGHgUFQpnlcid4ZSlfVLuZd HFMsfpjNGgYWpGhz0DQEE1yhcdNafFXbXmThN4cwVgTlEbQpgBLxeTmIogIRfCdm t4i3ePLKCqg4qwpkwr9mXZWEwaElHoddGlALIBLMQbtuC1E4uEvLAgMBAAGjggET MIIBDzASBgNVHRMBAf8ECDAGAQH/AgEBMCcGA1UdJQQgMB4GCCsGAQUFBwMBBggr BgEFBQcDAgYIKwYBBQUHAwQwMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdo dHRwOi8vb2NzcC5lbnRydXN0Lm5ldDAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8v Y3JsLmVudHJ1c3QubmV0L3NlcnZlcjEuY3JsMB0GA1UdDgQWBBSxPsNpA/i/RwHU mCYaCALvY2QrwzALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7 UISX8+1i0BowGQYJKoZIhvZ9B0EABAwwChsEVjcuMQMCAIEwDQYJKoZIhvcNAQEF BQADgYEAUuVY7HCc/9EvhaYzC1rAIo348LtGIiMduEl5Xa24G8tmJnDioD2GU06r 1kjLX/ktCdpdBgXadbjtdrZXTP59uN0AXlsdaTiFufsqVLPvkp5yMnqnuI3E2o6p NpAkoQSbB6kUCNnXcW26valgOjDLZFOnr241QiwdBAJAAE/rRa8= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN 95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd 2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= -----END CERTIFICATE----- wc FREsmartSEO/lib/scripts/facebook-v5-5.0.0/Authentication/AccessToken.php obvalue = $accessToken; if ($expiresAt) { $this->setExpiresAtFromTimeStamp($expiresAt); } } /** * Generate an app secret proof to sign a request to Graph. * * @param string $appSecret The app secret. * * @return string */ public function getAppSecretProof($appSecret) { return hash_hmac('sha256', $this->value, $appSecret); } /** * Getter for expiresAt. * * @return \DateTime|null */ public function getExpiresAt() { return $this->expiresAt; } /** * Determines whether or not this is an app access token. * * @return bool */ public function isAppAccessToken() { return strpos($this->value, '|') !== false; } /** * Determines whether or not this is a long-lived token. * * @return bool */ public function isLongLived() { if ($this->expiresAt) { return $this->expiresAt->getTimestamp() > time() + (60 * 60 * 2); } if ($this->isAppAccessToken()) { return true; } return false; } /** * Checks the expiration of the access token. * * @return boolean|null */ public function isExpired() { if ($this->getExpiresAt() instanceof \DateTime) { return $this->getExpiresAt()->getTimestamp() < time(); } if ($this->isAppAccessToken()) { return false; } return null; } /** * Returns the access token as a string. * * @return string */ public function getValue() { return $this->value; } /** * Returns the access token as a string. * * @return string */ public function __toString() { return $this->getValue(); } /** * Setter for expires_at. * * @param int $timeStamp */ protected function setExpiresAtFromTimeStamp($timeStamp) { $dt = new \DateTime(); $dt->setTimestamp($timeStamp); $this->expiresAt = $dt; } } Sk LLYMsmartSEO/lib/scripts/facebook-v5-5.0.0/Authentication/AccessTokenMetadata.php obmetadata = $metadata['data']; $this->castTimestampsToDateTime(); } /** * Returns a value from the metadata. * * @param string $field The property to retrieve. * @param mixed $default The default to return if the property doesn't exist. * * @return mixed */ public function getField($field, $default = null) { if (isset($this->metadata[$field])) { return $this->metadata[$field]; } return $default; } /** * Returns a value from the metadata. * * @param string $field The property to retrieve. * @param mixed $default The default to return if the property doesn't exist. * * @return mixed * * @deprecated 5.0.0 getProperty() has been renamed to getField() * @todo v6: Remove this method */ public function getProperty($field, $default = null) { return $this->getField($field, $default); } /** * Returns a value from a child property in the metadata. * * @param string $parentField The parent property. * @param string $field The property to retrieve. * @param mixed $default The default to return if the property doesn't exist. * * @return mixed */ public function getChildProperty($parentField, $field, $default = null) { if (!isset($this->metadata[$parentField])) { return $default; } if (!isset($this->metadata[$parentField][$field])) { return $default; } return $this->metadata[$parentField][$field]; } /** * Returns a value from the error metadata. * * @param string $field The property to retrieve. * @param mixed $default The default to return if the property doesn't exist. * * @return mixed */ public function getErrorProperty($field, $default = null) { return $this->getChildProperty('error', $field, $default); } /** * Returns a value from the "metadata" metadata. *Brain explodes* * * @param string $field The property to retrieve. * @param mixed $default The default to return if the property doesn't exist. * * @return mixed */ public function getMetadataProperty($field, $default = null) { return $this->getChildProperty('metadata', $field, $default); } /** * The ID of the application this access token is for. * * @return string|null */ public function getAppId() { return $this->getField('app_id'); } /** * Name of the application this access token is for. * * @return string|null */ public function getApplication() { return $this->getField('application'); } /** * Any error that a request to the graph api * would return due to the access token. * * @return bool|null */ public function isError() { return $this->getField('error') !== null; } /** * The error code for the error. * * @return int|null */ public function getErrorCode() { return $this->getErrorProperty('code'); } /** * The error message for the error. * * @return string|null */ public function getErrorMessage() { return $this->getErrorProperty('message'); } /** * The error subcode for the error. * * @return int|null */ public function getErrorSubcode() { return $this->getErrorProperty('subcode'); } /** * DateTime when this access token expires. * * @return \DateTime|null */ public function getExpiresAt() { return $this->getField('expires_at'); } /** * Whether the access token is still valid or not. * * @return boolean|null */ public function getIsValid() { return $this->getField('is_valid'); } /** * DateTime when this access token was issued. * * Note that the issued_at field is not returned * for short-lived access tokens. * * @see https://developers.facebook.com/docs/facebook-login/access-tokens#debug * * @return \DateTime|null */ public function getIssuedAt() { return $this->getField('issued_at'); } /** * General metadata associated with the access token. * Can contain data like 'sso', 'auth_type', 'auth_nonce'. * * @return array|null */ public function getMetadata() { return $this->getField('metadata'); } /** * The 'sso' child property from the 'metadata' parent property. * * @return string|null */ public function getSso() { return $this->getMetadataProperty('sso'); } /** * The 'auth_type' child property from the 'metadata' parent property. * * @return string|null */ public function getAuthType() { return $this->getMetadataProperty('auth_type'); } /** * The 'auth_nonce' child property from the 'metadata' parent property. * * @return string|null */ public function getAuthNonce() { return $this->getMetadataProperty('auth_nonce'); } /** * For impersonated access tokens, the ID of * the page this token contains. * * @return string|null */ public function getProfileId() { return $this->getField('profile_id'); } /** * List of permissions that the user has granted for * the app in this access token. * * @return array */ public function getScopes() { return $this->getField('scopes'); } /** * The ID of the user this access token is for. * * @return string|null */ public function getUserId() { return $this->getField('user_id'); } /** * Ensures the app ID from the access token * metadata is what we expect. * * @param string $appId * * @throws FacebookSDKException */ public function validateAppId($appId) { if ($this->getAppId() !== $appId) { throw new FacebookSDKException('Access token metadata contains unexpected app ID.', 401); } } /** * Ensures the user ID from the access token * metadata is what we expect. * * @param string $userId * * @throws FacebookSDKException */ public function validateUserId($userId) { if ($this->getUserId() !== $userId) { throw new FacebookSDKException('Access token metadata contains unexpected user ID.', 401); } } /** * Ensures the access token has not expired yet. * * @throws FacebookSDKException */ public function validateExpiration() { if (!$this->getExpiresAt() instanceof \DateTime) { return; } if ($this->getExpiresAt()->getTimestamp() < time()) { throw new FacebookSDKException('Inspection of access token metadata shows that the access token has expired.', 401); } } /** * Converts a unix timestamp into a DateTime entity. * * @param int $timestamp * * @return \DateTime */ private function convertTimestampToDateTime($timestamp) { $dt = new \DateTime(); $dt->setTimestamp($timestamp); return $dt; } /** * Casts the unix timestamps as DateTime entities. */ private function castTimestampsToDateTime() { foreach (static::$dateProperties as $key) { if (isset($this->metadata[$key]) && $this->metadata[$key] !== 0) { $this->metadata[$key] = $this->convertTimestampToDateTime($this->metadata[$key]); } } } } J>d DD))!FsmartSEO/lib/scripts/facebook-v5-5.0.0/Authentication/OAuth2Client.php obapp = $app; $this->client = $client; $this->graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION; } /** * Returns the last FacebookRequest that was sent. * Useful for debugging and testing. * * @return FacebookRequest|null */ public function getLastRequest() { return $this->lastRequest; } /** * Get the metadata associated with the access token. * * @param AccessToken|string $accessToken The access token to debug. * * @return AccessTokenMetadata */ public function debugToken($accessToken) { $accessToken = $accessToken instanceof AccessToken ? $accessToken->getValue() : $accessToken; $params = ['input_token' => $accessToken]; $this->lastRequest = new FacebookRequest( $this->app, $this->app->getAccessToken(), 'GET', '/debug_token', $params, null, $this->graphVersion ); $response = $this->client->sendRequest($this->lastRequest); $metadata = $response->getDecodedBody(); return new AccessTokenMetadata($metadata); } /** * Generates an authorization URL to begin the process of authenticating a user. * * @param string $redirectUrl The callback URL to redirect to. * @param array $scope An array of permissions to request. * @param string $state The CSPRNG-generated CSRF value. * @param array $params An array of parameters to generate URL. * @param string $separator The separator to use in http_build_query(). * * @return string */ public function getAuthorizationUrl($redirectUrl, $state, array $scope = [], array $params = [], $separator = '&') { $params += [ 'client_id' => $this->app->getId(), 'state' => $state, 'response_type' => 'code', 'sdk' => 'php-sdk-' . Facebook::VERSION, 'redirect_uri' => $redirectUrl, 'scope' => implode(',', $scope) ]; return static::BASE_AUTHORIZATION_URL . '/' . $this->graphVersion . '/dialog/oauth?' . http_build_query($params, null, $separator); } /** * Get a valid access token from a code. * * @param string $code * @param string $redirectUri * * @return AccessToken * * @throws FacebookSDKException */ public function getAccessTokenFromCode($code, $redirectUri = '') { $params = [ 'code' => $code, 'redirect_uri' => $redirectUri, ]; return $this->requestAnAccessToken($params); } /** * Exchanges a short-lived access token with a long-lived access token. * * @param AccessToken|string $accessToken * * @return AccessToken * * @throws FacebookSDKException */ public function getLongLivedAccessToken($accessToken) { $accessToken = $accessToken instanceof AccessToken ? $accessToken->getValue() : $accessToken; $params = [ 'grant_type' => 'fb_exchange_token', 'fb_exchange_token' => $accessToken, ]; return $this->requestAnAccessToken($params); } /** * Get a valid code from an access token. * * @param AccessToken|string $accessToken * @param string $redirectUri * * @return AccessToken * * @throws FacebookSDKException */ public function getCodeFromLongLivedAccessToken($accessToken, $redirectUri = '') { $params = [ 'redirect_uri' => $redirectUri, ]; $response = $this->sendRequestWithClientParams('/oauth/client_code', $params, $accessToken); $data = $response->getDecodedBody(); if (!isset($data['code'])) { throw new FacebookSDKException('Code was not returned from Graph.', 401); } return $data['code']; } /** * Send a request to the OAuth endpoint. * * @param array $params * * @return AccessToken * * @throws FacebookSDKException */ protected function requestAnAccessToken(array $params) { $response = $this->sendRequestWithClientParams('/oauth/access_token', $params); $data = $response->getDecodedBody(); if (!isset($data['access_token'])) { throw new FacebookSDKException('Access token was not returned from Graph.', 401); } // Graph returns two different key names for expiration time // on the same endpoint. Doh! :/ $expiresAt = 0; if (isset($data['expires'])) { // For exchanging a short lived token with a long lived token. // The expiration time in seconds will be returned as "expires". $expiresAt = time() + $data['expires']; } elseif (isset($data['expires_in'])) { // For exchanging a code for a short lived access token. // The expiration time in seconds will be returned as "expires_in". // See: https://developers.facebook.com/docs/facebook-login/access-tokens#long-via-code $expiresAt = time() + $data['expires_in']; } return new AccessToken($data['access_token'], $expiresAt); } /** * Send a request to Graph with an app access token. * * @param string $endpoint * @param array $params * @param AccessToken|string|null $accessToken * * @return FacebookResponse * * @throws FacebookResponseException */ protected function sendRequestWithClientParams($endpoint, array $params, $accessToken = null) { $params += $this->getClientParams(); $accessToken = $accessToken ?: $this->app->getAccessToken(); $this->lastRequest = new FacebookRequest( $this->app, $accessToken, 'GET', $endpoint, $params, null, $this->graphVersion ); return $this->client->sendRequest($this->lastRequest); } /** * Returns the client_* params for OAuth requests. * * @return array */ protected function getClientParams() { return [ 'client_id' => $this->app->getId(), 'client_secret' => $this->app->getSecret(), ]; } } }/Q 3smartSEO/lib/scripts/facebook-v5-5.0.0/autoload.php obresponse = $response; $this->responseData = $response->getDecodedBody(); $errorMessage = $this->get('message', 'Unknown error from Graph.'); $errorCode = $this->get('code', -1); parent::__construct($errorMessage, $errorCode, $previousException); } /** * A factory for creating the appropriate exception based on the response from Graph. * * @param FacebookResponse $response The response that threw the exception. * * @return FacebookResponseException */ public static function create(FacebookResponse $response) { $data = $response->getDecodedBody(); if (!isset($data['error']['code']) && isset($data['code'])) { $data = ['error' => $data]; } $code = isset($data['error']['code']) ? $data['error']['code'] : null; $message = isset($data['error']['message']) ? $data['error']['message'] : 'Unknown error from Graph.'; if (isset($data['error']['error_subcode'])) { switch ($data['error']['error_subcode']) { // Other authentication issues case 458: case 459: case 460: case 463: case 464: case 467: return new static($response, new FacebookAuthenticationException($message, $code)); // Video upload resumable error case 1363030: case 1363019: case 1363037: case 1363033: case 1363021: case 1363041: return new static($response, new FacebookResumableUploadException($message, $code)); } } switch ($code) { // Login status or token expired, revoked, or invalid case 100: case 102: case 190: return new static($response, new FacebookAuthenticationException($message, $code)); // Server issue, possible downtime case 1: case 2: return new static($response, new FacebookServerException($message, $code)); // API Throttling case 4: case 17: case 341: return new static($response, new FacebookThrottleException($message, $code)); // Duplicate Post case 506: return new static($response, new FacebookClientException($message, $code)); } // Missing Permissions if ($code == 10 || ($code >= 200 && $code <= 299)) { return new static($response, new FacebookAuthorizationException($message, $code)); } // OAuth authentication error if (isset($data['error']['type']) && $data['error']['type'] === 'OAuthException') { return new static($response, new FacebookAuthenticationException($message, $code)); } // All others return new static($response, new FacebookOtherException($message, $code)); } /** * Checks isset and returns that or a default value. * * @param string $key * @param mixed $default * * @return mixed */ private function get($key, $default = null) { if (isset($this->responseData['error'][$key])) { return $this->responseData['error'][$key]; } return $default; } /** * Returns the HTTP status code * * @return int */ public function getHttpStatusCode() { return $this->response->getHttpStatusCode(); } /** * Returns the sub-error code * * @return int */ public function getSubErrorCode() { return $this->get('error_subcode', -1); } /** * Returns the error type * * @return string */ public function getErrorType() { return $this->get('type', ''); } /** * Returns the raw response used to create the exception. * * @return string */ public function getRawResponse() { return $this->response->getBody(); } /** * Returns the decoded response used to create the exception. * * @return array */ public function getResponseData() { return $this->responseData; } /** * Returns the response entity used to create the exception. * * @return FacebookResponse */ public function getResponse() { return $this->response; } } Weƕt  4VsmartSEO/lib/scripts/facebook-v5-5.0.0/Exceptions/FacebookResumableUploadException.php ob,%3smartSEO/lib/scripts/facebook-v5-5.0.0/Facebook.php ob getenv(static::APP_ID_ENV_NAME), 'app_secret' => getenv(static::APP_SECRET_ENV_NAME), 'default_graph_version' => static::DEFAULT_GRAPH_VERSION, 'enable_beta_mode' => false, 'http_client_handler' => null, 'persistent_data_handler' => null, 'pseudo_random_string_generator' => null, 'url_detection_handler' => null, ], $config); if (!$config['app_id']) { throw new FacebookSDKException('Required "app_id" key not supplied in config and could not find fallback environment variable "' . static::APP_ID_ENV_NAME . '"'); } if (!$config['app_secret']) { throw new FacebookSDKException('Required "app_secret" key not supplied in config and could not find fallback environment variable "' . static::APP_SECRET_ENV_NAME . '"'); } $this->app = new FacebookApp($config['app_id'], $config['app_secret']); $this->client = new FacebookClient( HttpClientsFactory::createHttpClient($config['http_client_handler']), $config['enable_beta_mode'] ); $this->pseudoRandomStringGenerator = PseudoRandomStringGeneratorFactory::createPseudoRandomStringGenerator( $config['pseudo_random_string_generator'] ); $this->setUrlDetectionHandler($config['url_detection_handler'] ?: new FacebookUrlDetectionHandler()); $this->persistentDataHandler = PersistentDataFactory::createPersistentDataHandler( $config['persistent_data_handler'] ); if (isset($config['default_access_token'])) { $this->setDefaultAccessToken($config['default_access_token']); } // @todo v6: Throw an InvalidArgumentException if "default_graph_version" is not set $this->defaultGraphVersion = $config['default_graph_version']; } /** * Returns the FacebookApp entity. * * @return FacebookApp */ public function getApp() { return $this->app; } /** * Returns the FacebookClient service. * * @return FacebookClient */ public function getClient() { return $this->client; } /** * Returns the OAuth 2.0 client service. * * @return OAuth2Client */ public function getOAuth2Client() { if (!$this->oAuth2Client instanceof OAuth2Client) { $app = $this->getApp(); $client = $this->getClient(); $this->oAuth2Client = new OAuth2Client($app, $client, $this->defaultGraphVersion); } return $this->oAuth2Client; } /** * Returns the last response returned from Graph. * * @return FacebookResponse|FacebookBatchResponse|null */ public function getLastResponse() { return $this->lastResponse; } /** * Returns the URL detection handler. * * @return UrlDetectionInterface */ public function getUrlDetectionHandler() { return $this->urlDetectionHandler; } /** * Changes the URL detection handler. * * @param UrlDetectionInterface $urlDetectionHandler */ private function setUrlDetectionHandler(UrlDetectionInterface $urlDetectionHandler) { $this->urlDetectionHandler = $urlDetectionHandler; } /** * Returns the default AccessToken entity. * * @return AccessToken|null */ public function getDefaultAccessToken() { return $this->defaultAccessToken; } /** * Sets the default access token to use with requests. * * @param AccessToken|string $accessToken The access token to save. * * @throws \InvalidArgumentException */ public function setDefaultAccessToken($accessToken) { if (is_string($accessToken)) { $this->defaultAccessToken = new AccessToken($accessToken); return; } if ($accessToken instanceof AccessToken) { $this->defaultAccessToken = $accessToken; return; } throw new \InvalidArgumentException('The default access token must be of type "string" or Facebook\AccessToken'); } /** * Returns the default Graph version. * * @return string */ public function getDefaultGraphVersion() { return $this->defaultGraphVersion; } /** * Returns the redirect login helper. * * @return FacebookRedirectLoginHelper */ public function getRedirectLoginHelper() { return new FacebookRedirectLoginHelper( $this->getOAuth2Client(), $this->persistentDataHandler, $this->urlDetectionHandler, $this->pseudoRandomStringGenerator ); } /** * Returns the JavaScript helper. * * @return FacebookJavaScriptHelper */ public function getJavaScriptHelper() { return new FacebookJavaScriptHelper($this->app, $this->client, $this->defaultGraphVersion); } /** * Returns the canvas helper. * * @return FacebookCanvasHelper */ public function getCanvasHelper() { return new FacebookCanvasHelper($this->app, $this->client, $this->defaultGraphVersion); } /** * Returns the page tab helper. * * @return FacebookPageTabHelper */ public function getPageTabHelper() { return new FacebookPageTabHelper($this->app, $this->client, $this->defaultGraphVersion); } /** * Sends a GET request to Graph and returns the result. * * @param string $endpoint * @param AccessToken|string|null $accessToken * @param string|null $eTag * @param string|null $graphVersion * * @return FacebookResponse * * @throws FacebookSDKException */ public function get($endpoint, $accessToken = null, $eTag = null, $graphVersion = null) { return $this->sendRequest( 'GET', $endpoint, $params = [], $accessToken, $eTag, $graphVersion ); } /** * Sends a POST request to Graph and returns the result. * * @param string $endpoint * @param array $params * @param AccessToken|string|null $accessToken * @param string|null $eTag * @param string|null $graphVersion * * @return FacebookResponse * * @throws FacebookSDKException */ public function post($endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) { return $this->sendRequest( 'POST', $endpoint, $params, $accessToken, $eTag, $graphVersion ); } /** * Sends a DELETE request to Graph and returns the result. * * @param string $endpoint * @param array $params * @param AccessToken|string|null $accessToken * @param string|null $eTag * @param string|null $graphVersion * * @return FacebookResponse * * @throws FacebookSDKException */ public function delete($endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) { return $this->sendRequest( 'DELETE', $endpoint, $params, $accessToken, $eTag, $graphVersion ); } /** * Sends a request to Graph for the next page of results. * * @param GraphEdge $graphEdge The GraphEdge to paginate over. * * @return GraphEdge|null * * @throws FacebookSDKException */ public function next(GraphEdge $graphEdge) { return $this->getPaginationResults($graphEdge, 'next'); } /** * Sends a request to Graph for the previous page of results. * * @param GraphEdge $graphEdge The GraphEdge to paginate over. * * @return GraphEdge|null * * @throws FacebookSDKException */ public function previous(GraphEdge $graphEdge) { return $this->getPaginationResults($graphEdge, 'previous'); } /** * Sends a request to Graph for the next page of results. * * @param GraphEdge $graphEdge The GraphEdge to paginate over. * @param string $direction The direction of the pagination: next|previous. * * @return GraphEdge|null * * @throws FacebookSDKException */ public function getPaginationResults(GraphEdge $graphEdge, $direction) { $paginationRequest = $graphEdge->getPaginationRequest($direction); if (!$paginationRequest) { return null; } $this->lastResponse = $this->client->sendRequest($paginationRequest); // Keep the same GraphNode subclass $subClassName = $graphEdge->getSubClassName(); $graphEdge = $this->lastResponse->getGraphEdge($subClassName, false); return count($graphEdge) > 0 ? $graphEdge : null; } /** * Sends a request to Graph and returns the result. * * @param string $method * @param string $endpoint * @param array $params * @param AccessToken|string|null $accessToken * @param string|null $eTag * @param string|null $graphVersion * * @return FacebookResponse * * @throws FacebookSDKException */ public function sendRequest($method, $endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) { $accessToken = $accessToken ?: $this->defaultAccessToken; $graphVersion = $graphVersion ?: $this->defaultGraphVersion; $request = $this->request($method, $endpoint, $params, $accessToken, $eTag, $graphVersion); return $this->lastResponse = $this->client->sendRequest($request); } /** * Sends a batched request to Graph and returns the result. * * @param array $requests * @param AccessToken|string|null $accessToken * @param string|null $graphVersion * * @return FacebookBatchResponse * * @throws FacebookSDKException */ public function sendBatchRequest(array $requests, $accessToken = null, $graphVersion = null) { $accessToken = $accessToken ?: $this->defaultAccessToken; $graphVersion = $graphVersion ?: $this->defaultGraphVersion; $batchRequest = new FacebookBatchRequest( $this->app, $requests, $accessToken, $graphVersion ); return $this->lastResponse = $this->client->sendBatchRequest($batchRequest); } /** * Instantiates an empty FacebookBatchRequest entity. * * @param AccessToken|string|null $accessToken The top-level access token. Requests with no access token * will fallback to this. * @param string|null $graphVersion The Graph API version to use. * @return FacebookBatchRequest */ public function newBatchRequest($accessToken = null, $graphVersion = null) { $accessToken = $accessToken ?: $this->defaultAccessToken; $graphVersion = $graphVersion ?: $this->defaultGraphVersion; return new FacebookBatchRequest( $this->app, [], $accessToken, $graphVersion ); } /** * Instantiates a new FacebookRequest entity. * * @param string $method * @param string $endpoint * @param array $params * @param AccessToken|string|null $accessToken * @param string|null $eTag * @param string|null $graphVersion * * @return FacebookRequest * * @throws FacebookSDKException */ public function request($method, $endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) { $accessToken = $accessToken ?: $this->defaultAccessToken; $graphVersion = $graphVersion ?: $this->defaultGraphVersion; return new FacebookRequest( $this->app, $accessToken, $method, $endpoint, $params, $eTag, $graphVersion ); } /** * Factory to create FacebookFile's. * * @param string $pathToFile * * @return FacebookFile * * @throws FacebookSDKException */ public function fileToUpload($pathToFile) { return new FacebookFile($pathToFile); } /** * Factory to create FacebookVideo's. * * @param string $pathToFile * * @return FacebookVideo * * @throws FacebookSDKException */ public function videoToUpload($pathToFile) { return new FacebookVideo($pathToFile); } /** * Upload a video in chunks. * * @param int $target The id of the target node before the /videos edge. * @param string $pathToFile The full path to the file. * @param array $metadata The metadata associated with the video file. * @param string|null $accessToken The access token. * @param int $maxTransferTries The max times to retry a failed upload chunk. * @param string|null $graphVersion The Graph API version to use. * * @return array * * @throws FacebookSDKException */ public function uploadVideo($target, $pathToFile, $metadata = [], $accessToken = null, $maxTransferTries = 5, $graphVersion = null) { $accessToken = $accessToken ?: $this->defaultAccessToken; $graphVersion = $graphVersion ?: $this->defaultGraphVersion; $uploader = new FacebookResumableUploader($this->app, $this->client, $accessToken, $graphVersion); $endpoint = '/'.$target.'/videos'; $file = $this->videoToUpload($pathToFile); $chunk = $uploader->start($endpoint, $file); do { $chunk = $this->maxTriesTransfer($uploader, $endpoint, $chunk, $maxTransferTries); } while (!$chunk->isLastChunk()); return [ 'video_id' => $chunk->getVideoId(), 'success' => $uploader->finish($endpoint, $chunk->getUploadSessionId(), $metadata), ]; } /** * Attempts to upload a chunk of a file in $retryCountdown tries. * * @param FacebookResumableUploader $uploader * @param string $endpoint * @param FacebookTransferChunk $chunk * @param int $retryCountdown * * @return FacebookTransferChunk * * @throws FacebookSDKException */ private function maxTriesTransfer(FacebookResumableUploader $uploader, $endpoint, FacebookTransferChunk $chunk, $retryCountdown) { $newChunk = $uploader->transfer($endpoint, $chunk, $retryCountdown < 1); if ($newChunk !== $chunk) { return $newChunk; } $retryCountdown--; // If transfer() returned the same chunk entity, the transfer failed but is resumable. return $this->maxTriesTransfer($uploader, $endpoint, $chunk, $retryCountdown); } } YٯT Dz6smartSEO/lib/scripts/facebook-v5-5.0.0/FacebookApp.php obid = (string) $id; $this->secret = $secret; } /** * Returns the app ID. * * @return string */ public function getId() { return $this->id; } /** * Returns the app secret. * * @return string */ public function getSecret() { return $this->secret; } /** * Returns an app access token. * * @return AccessToken */ public function getAccessToken() { return new AccessToken($this->id . '|' . $this->secret); } /** * Serializes the FacebookApp entity as a string. * * @return string */ public function serialize() { return implode('|', [$this->id, $this->secret]); } /** * Unserializes a string as a FacebookApp entity. * * @param string $serialized */ public function unserialize($serialized) { list($id, $secret) = explode('|', $serialized); $this->__construct($id, $secret); } } "yVI] HH R?smartSEO/lib/scripts/facebook-v5-5.0.0/FacebookBatchRequest.php obadd($requests); } /** * Adds a new request to the array. * * @param FacebookRequest|array $request * @param string|null|array $options Array of batch request options e.g. 'name', 'omit_response_on_success'. * If a string is given, it is the value of the 'name' option. * * @return FacebookBatchRequest * * @throws \InvalidArgumentException */ public function add($request, $options = null) { if (is_array($request)) { foreach ($request as $key => $req) { $this->add($req, $key); } return $this; } if (!$request instanceof FacebookRequest) { throw new \InvalidArgumentException('Argument for add() must be of type array or FacebookRequest.'); } if (null === $options) { $options = []; } elseif (!is_array($options)) { $options = ['name' => $options]; } $this->addFallbackDefaults($request); // File uploads $attachedFiles = $this->extractFileAttachments($request); $name = isset($options['name']) ? $options['name'] : null; unset($options['name']); $requestToAdd = [ 'name' => $name, 'request' => $request, 'options' => $options, 'attached_files' => $attachedFiles, ]; $this->requests[] = $requestToAdd; return $this; } /** * Ensures that the FacebookApp and access token fall back when missing. * * @param FacebookRequest $request * * @throws FacebookSDKException */ public function addFallbackDefaults(FacebookRequest $request) { if (!$request->getApp()) { $app = $this->getApp(); if (!$app) { throw new FacebookSDKException('Missing FacebookApp on FacebookRequest and no fallback detected on FacebookBatchRequest.'); } $request->setApp($app); } if (!$request->getAccessToken()) { $accessToken = $this->getAccessToken(); if (!$accessToken) { throw new FacebookSDKException('Missing access token on FacebookRequest and no fallback detected on FacebookBatchRequest.'); } $request->setAccessToken($accessToken); } } /** * Extracts the files from a request. * * @param FacebookRequest $request * * @return string|null * * @throws FacebookSDKException */ public function extractFileAttachments(FacebookRequest $request) { if (!$request->containsFileUploads()) { return null; } $files = $request->getFiles(); $fileNames = []; foreach ($files as $file) { $fileName = uniqid(); $this->addFile($fileName, $file); $fileNames[] = $fileName; } $request->resetFiles(); // @TODO Does Graph support multiple uploads on one endpoint? return implode(',', $fileNames); } /** * Return the FacebookRequest entities. * * @return array */ public function getRequests() { return $this->requests; } /** * Prepares the requests to be sent as a batch request. */ public function prepareRequestsForBatch() { $this->validateBatchRequestCount(); $params = [ 'batch' => $this->convertRequestsToJson(), 'include_headers' => true, ]; $this->setParams($params); } /** * Converts the requests into a JSON(P) string. * * @return string */ public function convertRequestsToJson() { $requests = []; foreach ($this->requests as $request) { $options = []; if (null !== $request['name']) { $options['name'] = $request['name']; } $options += $request['options']; $requests[] = $this->requestEntityToBatchArray($request['request'], $options, $request['attached_files']); } return json_encode($requests); } /** * Validate the request count before sending them as a batch. * * @throws FacebookSDKException */ public function validateBatchRequestCount() { $batchCount = count($this->requests); if ($batchCount === 0) { throw new FacebookSDKException('There are no batch requests to send.'); } elseif ($batchCount > 50) { // Per: https://developers.facebook.com/docs/graph-api/making-multiple-requests#limits throw new FacebookSDKException('You cannot send more than 50 batch requests at a time.'); } } /** * Converts a Request entity into an array that is batch-friendly. * * @param FacebookRequest $request The request entity to convert. * @param string|null|array $options Array of batch request options e.g. 'name', 'omit_response_on_success'. * If a string is given, it is the value of the 'name' option. * @param string|null $attachedFiles Names of files associated with the request. * * @return array */ public function requestEntityToBatchArray(FacebookRequest $request, $options = null, $attachedFiles = null) { if (null === $options) { $options = []; } elseif (!is_array($options)) { $options = ['name' => $options]; } $compiledHeaders = []; $headers = $request->getHeaders(); foreach ($headers as $name => $value) { $compiledHeaders[] = $name . ': ' . $value; } $batch = [ 'headers' => $compiledHeaders, 'method' => $request->getMethod(), 'relative_url' => $request->getUrl(), ]; // Since file uploads are moved to the root request of a batch request, // the child requests will always be URL-encoded. $body = $request->getUrlEncodedBody()->getBody(); if ($body) { $batch['body'] = $body; } $batch += $options; if (null !== $attachedFiles) { $batch['attached_files'] = $attachedFiles; } return $batch; } /** * Get an iterator for the items. * * @return ArrayIterator */ public function getIterator() { return new ArrayIterator($this->requests); } /** * @inheritdoc */ public function offsetSet($offset, $value) { $this->add($value, $offset); } /** * @inheritdoc */ public function offsetExists($offset) { return isset($this->requests[$offset]); } /** * @inheritdoc */ public function offsetUnset($offset) { unset($this->requests[$offset]); } /** * @inheritdoc */ public function offsetGet($offset) { return isset($this->requests[$offset]) ? $this->requests[$offset] : null; } } +^ &&H@smartSEO/lib/scripts/facebook-v5-5.0.0/FacebookBatchResponse.php obbatchRequest = $batchRequest; $request = $response->getRequest(); $body = $response->getBody(); $httpStatusCode = $response->getHttpStatusCode(); $headers = $response->getHeaders(); parent::__construct($request, $body, $httpStatusCode, $headers); $responses = $response->getDecodedBody(); $this->setResponses($responses); } /** * Returns an array of FacebookResponse entities. * * @return array */ public function getResponses() { return $this->responses; } /** * The main batch response will be an array of requests so * we need to iterate over all the responses. * * @param array $responses */ public function setResponses(array $responses) { $this->responses = []; foreach ($responses as $key => $graphResponse) { $this->addResponse($key, $graphResponse); } } /** * Add a response to the list. * * @param int $key * @param array|null $response */ public function addResponse($key, $response) { $originalRequestName = isset($this->batchRequest[$key]['name']) ? $this->batchRequest[$key]['name'] : $key; $originalRequest = isset($this->batchRequest[$key]['request']) ? $this->batchRequest[$key]['request'] : null; $httpResponseBody = isset($response['body']) ? $response['body'] : null; $httpResponseCode = isset($response['code']) ? $response['code'] : null; // @TODO With PHP 5.5 support, this becomes array_column($response['headers'], 'value', 'name') $httpResponseHeaders = isset($response['headers']) ? $this->normalizeBatchHeaders($response['headers']) : []; $this->responses[$originalRequestName] = new FacebookResponse( $originalRequest, $httpResponseBody, $httpResponseCode, $httpResponseHeaders ); } /** * @inheritdoc */ public function getIterator() { return new ArrayIterator($this->responses); } /** * @inheritdoc */ public function offsetSet($offset, $value) { $this->addResponse($offset, $value); } /** * @inheritdoc */ public function offsetExists($offset) { return isset($this->responses[$offset]); } /** * @inheritdoc */ public function offsetUnset($offset) { unset($this->responses[$offset]); } /** * @inheritdoc */ public function offsetGet($offset) { return isset($this->responses[$offset]) ? $this->responses[$offset] : null; } /** * Converts the batch header array into a standard format. * @TODO replace with array_column() when PHP 5.5 is supported. * * @param array $batchHeaders * * @return array */ private function normalizeBatchHeaders(array $batchHeaders) { $headers = []; foreach ($batchHeaders as $header) { $headers[$header['name']] = $header['value']; } return $headers; } } ߂W ;;9smartSEO/lib/scripts/facebook-v5-5.0.0/FacebookClient.php obhttpClientHandler = $httpClientHandler ?: $this->detectHttpClientHandler(); $this->enableBetaMode = $enableBeta; } /** * Sets the HTTP client handler. * * @param FacebookHttpClientInterface $httpClientHandler */ public function setHttpClientHandler(FacebookHttpClientInterface $httpClientHandler) { $this->httpClientHandler = $httpClientHandler; } /** * Returns the HTTP client handler. * * @return FacebookHttpClientInterface */ public function getHttpClientHandler() { return $this->httpClientHandler; } /** * Detects which HTTP client handler to use. * * @return FacebookHttpClientInterface */ public function detectHttpClientHandler() { return extension_loaded('curl') ? new FacebookCurlHttpClient() : new FacebookStreamHttpClient(); } /** * Toggle beta mode. * * @param boolean $betaMode */ public function enableBetaMode($betaMode = true) { $this->enableBetaMode = $betaMode; } /** * Returns the base Graph URL. * * @param boolean $postToVideoUrl Post to the video API if videos are being uploaded. * * @return string */ public function getBaseGraphUrl($postToVideoUrl = false) { if ($postToVideoUrl) { return $this->enableBetaMode ? static::BASE_GRAPH_VIDEO_URL_BETA : static::BASE_GRAPH_VIDEO_URL; } return $this->enableBetaMode ? static::BASE_GRAPH_URL_BETA : static::BASE_GRAPH_URL; } /** * Prepares the request for sending to the client handler. * * @param FacebookRequest $request * * @return array */ public function prepareRequestMessage(FacebookRequest $request) { $postToVideoUrl = $request->containsVideoUploads(); $url = $this->getBaseGraphUrl($postToVideoUrl) . $request->getUrl(); // If we're sending files they should be sent as multipart/form-data if ($request->containsFileUploads()) { $requestBody = $request->getMultipartBody(); $request->setHeaders([ 'Content-Type' => 'multipart/form-data; boundary=' . $requestBody->getBoundary(), ]); } else { $requestBody = $request->getUrlEncodedBody(); $request->setHeaders([ 'Content-Type' => 'application/x-www-form-urlencoded', ]); } return [ $url, $request->getMethod(), $request->getHeaders(), $requestBody->getBody(), ]; } /** * Makes the request to Graph and returns the result. * * @param FacebookRequest $request * * @return FacebookResponse * * @throws FacebookSDKException */ public function sendRequest(FacebookRequest $request) { if (get_class($request) === 'Facebook\FacebookRequest') { $request->validateAccessToken(); } list($url, $method, $headers, $body) = $this->prepareRequestMessage($request); // Since file uploads can take a while, we need to give more time for uploads $timeOut = static::DEFAULT_REQUEST_TIMEOUT; if ($request->containsFileUploads()) { $timeOut = static::DEFAULT_FILE_UPLOAD_REQUEST_TIMEOUT; } elseif ($request->containsVideoUploads()) { $timeOut = static::DEFAULT_VIDEO_UPLOAD_REQUEST_TIMEOUT; } // Should throw `FacebookSDKException` exception on HTTP client error. // Don't catch to allow it to bubble up. $rawResponse = $this->httpClientHandler->send($url, $method, $body, $headers, $timeOut); static::$requestCount++; $returnResponse = new FacebookResponse( $request, $rawResponse->getBody(), $rawResponse->getHttpResponseCode(), $rawResponse->getHeaders() ); if ($returnResponse->isError()) { throw $returnResponse->getThrownException(); } return $returnResponse; } /** * Makes a batched request to Graph and returns the result. * * @param FacebookBatchRequest $request * * @return FacebookBatchResponse * * @throws FacebookSDKException */ public function sendBatchRequest(FacebookBatchRequest $request) { $request->prepareRequestsForBatch(); $facebookResponse = $this->sendRequest($request); return new FacebookBatchResponse($request, $facebookResponse); } } KN3X ffѬ59:smartSEO/lib/scripts/facebook-v5-5.0.0/FacebookRequest.php obsetApp($app); $this->setAccessToken($accessToken); $this->setMethod($method); $this->setEndpoint($endpoint); $this->setParams($params); $this->setETag($eTag); $this->graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION; } /** * Set the access token for this request. * * @param AccessToken|string|null * * @return FacebookRequest */ public function setAccessToken($accessToken) { $this->accessToken = $accessToken; if ($accessToken instanceof AccessToken) { $this->accessToken = $accessToken->getValue(); } return $this; } /** * Sets the access token with one harvested from a URL or POST params. * * @param string $accessToken The access token. * * @return FacebookRequest * * @throws FacebookSDKException */ public function setAccessTokenFromParams($accessToken) { $existingAccessToken = $this->getAccessToken(); if (!$existingAccessToken) { $this->setAccessToken($accessToken); } elseif ($accessToken !== $existingAccessToken) { throw new FacebookSDKException('Access token mismatch. The access token provided in the FacebookRequest and the one provided in the URL or POST params do not match.'); } return $this; } /** * Return the access token for this request. * * @return string|null */ public function getAccessToken() { return $this->accessToken; } /** * Return the access token for this request as an AccessToken entity. * * @return AccessToken|null */ public function getAccessTokenEntity() { return $this->accessToken ? new AccessToken($this->accessToken) : null; } /** * Set the FacebookApp entity used for this request. * * @param FacebookApp|null $app */ public function setApp(FacebookApp $app = null) { $this->app = $app; } /** * Return the FacebookApp entity used for this request. * * @return FacebookApp */ public function getApp() { return $this->app; } /** * Generate an app secret proof to sign this request. * * @return string|null */ public function getAppSecretProof() { if (!$accessTokenEntity = $this->getAccessTokenEntity()) { return null; } return $accessTokenEntity->getAppSecretProof($this->app->getSecret()); } /** * Validate that an access token exists for this request. * * @throws FacebookSDKException */ public function validateAccessToken() { $accessToken = $this->getAccessToken(); if (!$accessToken) { throw new FacebookSDKException('You must provide an access token.'); } } /** * Set the HTTP method for this request. * * @param string */ public function setMethod($method) { $this->method = strtoupper($method); } /** * Return the HTTP method for this request. * * @return string */ public function getMethod() { return $this->method; } /** * Validate that the HTTP method is set. * * @throws FacebookSDKException */ public function validateMethod() { if (!$this->method) { throw new FacebookSDKException('HTTP method not specified.'); } if (!in_array($this->method, ['GET', 'POST', 'DELETE'])) { throw new FacebookSDKException('Invalid HTTP method specified.'); } } /** * Set the endpoint for this request. * * @param string * * @return FacebookRequest * * @throws FacebookSDKException */ public function setEndpoint($endpoint) { // Harvest the access token from the endpoint to keep things in sync $params = FacebookUrlManipulator::getParamsAsArray($endpoint); if (isset($params['access_token'])) { $this->setAccessTokenFromParams($params['access_token']); } // Clean the token & app secret proof from the endpoint. $filterParams = ['access_token', 'appsecret_proof']; $this->endpoint = FacebookUrlManipulator::removeParamsFromUrl($endpoint, $filterParams); return $this; } /** * Return the endpoint for this request. * * @return string */ public function getEndpoint() { // For batch requests, this will be empty return $this->endpoint; } /** * Generate and return the headers for this request. * * @return array */ public function getHeaders() { $headers = static::getDefaultHeaders(); if ($this->eTag) { $headers['If-None-Match'] = $this->eTag; } return array_merge($this->headers, $headers); } /** * Set the headers for this request. * * @param array $headers */ public function setHeaders(array $headers) { $this->headers = array_merge($this->headers, $headers); } /** * Sets the eTag value. * * @param string $eTag */ public function setETag($eTag) { $this->eTag = $eTag; } /** * Set the params for this request. * * @param array $params * * @return FacebookRequest * * @throws FacebookSDKException */ public function setParams(array $params = []) { if (isset($params['access_token'])) { $this->setAccessTokenFromParams($params['access_token']); } // Don't let these buggers slip in. unset($params['access_token'], $params['appsecret_proof']); // @TODO Refactor code above with this //$params = $this->sanitizeAuthenticationParams($params); $params = $this->sanitizeFileParams($params); $this->dangerouslySetParams($params); return $this; } /** * Set the params for this request without filtering them first. * * @param array $params * * @return FacebookRequest */ public function dangerouslySetParams(array $params = []) { $this->params = array_merge($this->params, $params); return $this; } /** * Iterate over the params and pull out the file uploads. * * @param array $params * * @return array */ public function sanitizeFileParams(array $params) { foreach ($params as $key => $value) { if ($value instanceof FacebookFile) { $this->addFile($key, $value); unset($params[$key]); } } return $params; } /** * Add a file to be uploaded. * * @param string $key * @param FacebookFile $file */ public function addFile($key, FacebookFile $file) { $this->files[$key] = $file; } /** * Removes all the files from the upload queue. */ public function resetFiles() { $this->files = []; } /** * Get the list of files to be uploaded. * * @return array */ public function getFiles() { return $this->files; } /** * Let's us know if there is a file upload with this request. * * @return boolean */ public function containsFileUploads() { return !empty($this->files); } /** * Let's us know if there is a video upload with this request. * * @return boolean */ public function containsVideoUploads() { foreach ($this->files as $file) { if ($file instanceof FacebookVideo) { return true; } } return false; } /** * Returns the body of the request as multipart/form-data. * * @return RequestBodyMultipart */ public function getMultipartBody() { $params = $this->getPostParams(); return new RequestBodyMultipart($params, $this->files); } /** * Returns the body of the request as URL-encoded. * * @return RequestBodyUrlEncoded */ public function getUrlEncodedBody() { $params = $this->getPostParams(); return new RequestBodyUrlEncoded($params); } /** * Generate and return the params for this request. * * @return array */ public function getParams() { $params = $this->params; $accessToken = $this->getAccessToken(); if ($accessToken) { $params['access_token'] = $accessToken; $params['appsecret_proof'] = $this->getAppSecretProof(); } return $params; } /** * Only return params on POST requests. * * @return array */ public function getPostParams() { if ($this->getMethod() === 'POST') { return $this->getParams(); } return []; } /** * The graph version used for this request. * * @return string */ public function getGraphVersion() { return $this->graphVersion; } /** * Generate and return the URL for this request. * * @return string */ public function getUrl() { $this->validateMethod(); $graphVersion = FacebookUrlManipulator::forceSlashPrefix($this->graphVersion); $endpoint = FacebookUrlManipulator::forceSlashPrefix($this->getEndpoint()); $url = $graphVersion . $endpoint; if ($this->getMethod() !== 'POST') { $params = $this->getParams(); $url = FacebookUrlManipulator::appendParamsToUrl($url, $params); } return $url; } /** * Return the default headers that every request should use. * * @return array */ public static function getDefaultHeaders() { return [ 'User-Agent' => 'fb-php-' . Facebook::VERSION, 'Accept-Encoding' => '*', ]; } } x4Y RR6;smartSEO/lib/scripts/facebook-v5-5.0.0/FacebookResponse.php obrequest = $request; $this->body = $body; $this->httpStatusCode = $httpStatusCode; $this->headers = $headers; $this->decodeBody(); } /** * Return the original request that returned this response. * * @return FacebookRequest */ public function getRequest() { return $this->request; } /** * Return the FacebookApp entity used for this response. * * @return FacebookApp */ public function getApp() { return $this->request->getApp(); } /** * Return the access token that was used for this response. * * @return string|null */ public function getAccessToken() { return $this->request->getAccessToken(); } /** * Return the HTTP status code for this response. * * @return int */ public function getHttpStatusCode() { return $this->httpStatusCode; } /** * Return the HTTP headers for this response. * * @return array */ public function getHeaders() { return $this->headers; } /** * Return the raw body response. * * @return string */ public function getBody() { return $this->body; } /** * Return the decoded body response. * * @return array */ public function getDecodedBody() { return $this->decodedBody; } /** * Get the app secret proof that was used for this response. * * @return string|null */ public function getAppSecretProof() { return $this->request->getAppSecretProof(); } /** * Get the ETag associated with the response. * * @return string|null */ public function getETag() { return isset($this->headers['ETag']) ? $this->headers['ETag'] : null; } /** * Get the version of Graph that returned this response. * * @return string|null */ public function getGraphVersion() { return isset($this->headers['Facebook-API-Version']) ? $this->headers['Facebook-API-Version'] : null; } /** * Returns true if Graph returned an error message. * * @return boolean */ public function isError() { return isset($this->decodedBody['error']); } /** * Throws the exception. * * @throws FacebookSDKException */ public function throwException() { throw $this->thrownException; } /** * Instantiates an exception to be thrown later. */ public function makeException() { $this->thrownException = FacebookResponseException::create($this); } /** * Returns the exception that was thrown for this request. * * @return FacebookResponseException|null */ public function getThrownException() { return $this->thrownException; } /** * Convert the raw response into an array if possible. * * Graph will return 2 types of responses: * - JSON(P) * Most responses from Graph are JSON(P) * - application/x-www-form-urlencoded key/value pairs * Happens on the `/oauth/access_token` endpoint when exchanging * a short-lived access token for a long-lived access token * - And sometimes nothing :/ but that'd be a bug. */ public function decodeBody() { $this->decodedBody = json_decode($this->body, true); if ($this->decodedBody === null) { $this->decodedBody = []; parse_str($this->body, $this->decodedBody); } elseif (is_bool($this->decodedBody)) { // Backwards compatibility for Graph < 2.1. // Mimics 2.1 responses. // @TODO Remove this after Graph 2.0 is no longer supported $this->decodedBody = ['success' => $this->decodedBody]; } elseif (is_numeric($this->decodedBody)) { $this->decodedBody = ['id' => $this->decodedBody]; } if (!is_array($this->decodedBody)) { $this->decodedBody = []; } if ($this->isError()) { $this->makeException(); } } /** * Instantiate a new GraphObject from response. * * @param string|null $subclassName The GraphNode subclass to cast to. * * @return \Facebook\GraphNodes\GraphObject * * @throws FacebookSDKException * * @deprecated 5.0.0 getGraphObject() has been renamed to getGraphNode() * @todo v6: Remove this method */ public function getGraphObject($subclassName = null) { return $this->getGraphNode($subclassName); } /** * Instantiate a new GraphNode from response. * * @param string|null $subclassName The GraphNode subclass to cast to. * * @return \Facebook\GraphNodes\GraphNode * * @throws FacebookSDKException */ public function getGraphNode($subclassName = null) { $factory = new GraphNodeFactory($this); return $factory->makeGraphNode($subclassName); } /** * Convenience method for creating a GraphAlbum collection. * * @return \Facebook\GraphNodes\GraphAlbum * * @throws FacebookSDKException */ public function getGraphAlbum() { $factory = new GraphNodeFactory($this); return $factory->makeGraphAlbum(); } /** * Convenience method for creating a GraphPage collection. * * @return \Facebook\GraphNodes\GraphPage * * @throws FacebookSDKException */ public function getGraphPage() { $factory = new GraphNodeFactory($this); return $factory->makeGraphPage(); } /** * Convenience method for creating a GraphSessionInfo collection. * * @return \Facebook\GraphNodes\GraphSessionInfo * * @throws FacebookSDKException */ public function getGraphSessionInfo() { $factory = new GraphNodeFactory($this); return $factory->makeGraphSessionInfo(); } /** * Convenience method for creating a GraphUser collection. * * @return \Facebook\GraphNodes\GraphUser * * @throws FacebookSDKException */ public function getGraphUser() { $factory = new GraphNodeFactory($this); return $factory->makeGraphUser(); } /** * Convenience method for creating a GraphEvent collection. * * @return \Facebook\GraphNodes\GraphEvent * * @throws FacebookSDKException */ public function getGraphEvent() { $factory = new GraphNodeFactory($this); return $factory->makeGraphEvent(); } /** * Convenience method for creating a GraphGroup collection. * * @return \Facebook\GraphNodes\GraphGroup * * @throws FacebookSDKException */ public function getGraphGroup() { $factory = new GraphNodeFactory($this); return $factory->makeGraphGroup(); } /** * Instantiate a new GraphList from response. * * @param string|null $subclassName The GraphNode subclass to cast list items to. * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. * * @return \Facebook\GraphNodes\GraphList * * @throws FacebookSDKException * * @deprecated 5.0.0 getGraphList() has been renamed to getGraphEdge() * @todo v6: Remove this method */ public function getGraphList($subclassName = null, $auto_prefix = true) { return $this->getGraphEdge($subclassName, $auto_prefix); } /** * Instantiate a new GraphEdge from response. * * @param string|null $subclassName The GraphNode subclass to cast list items to. * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. * * @return \Facebook\GraphNodes\GraphEdge * * @throws FacebookSDKException */ public function getGraphEdge($subclassName = null, $auto_prefix = true) { $factory = new GraphNodeFactory($this); return $factory->makeGraphEdge($subclassName, $auto_prefix); } } N]wo` !!߆BsmartSEO/lib/scripts/facebook-v5-5.0.0/FileUpload/FacebookFile.php obpath = $filePath; $this->maxLength = $maxLength; $this->offset = $offset; $this->open(); } /** * Closes the stream when destructed. */ public function __destruct() { $this->close(); } /** * Opens a stream for the file. * * @throws FacebookSDKException */ public function open() { if (!$this->isRemoteFile($this->path) && !is_readable($this->path)) { throw new FacebookSDKException('Failed to create FacebookFile entity. Unable to read resource: ' . $this->path . '.'); } $this->stream = fopen($this->path, 'r'); if (!$this->stream) { throw new FacebookSDKException('Failed to create FacebookFile entity. Unable to open resource: ' . $this->path . '.'); } } /** * Stops the file stream. */ public function close() { if (is_resource($this->stream)) { fclose($this->stream); } } /** * Return the contents of the file. * * @return string */ public function getContents() { return stream_get_contents($this->stream, $this->maxLength, $this->offset); } /** * Return the name of the file. * * @return string */ public function getFileName() { return basename($this->path); } /** * Return the path of the file. * * @return string */ public function getFilePath() { return $this->path; } /** * Return the size of the file. * * @return int */ public function getSize() { return filesize($this->path); } /** * Return the mimetype of the file. * * @return string */ public function getMimetype() { return Mimetypes::getInstance()->fromFilename($this->path) ?: 'text/plain'; } /** * Returns true if the path to the file is remote. * * @param string $pathToFile * * @return boolean */ protected function isRemoteFile($pathToFile) { return preg_match('/^(https?|ftp):\/\/.*/', $pathToFile) === 1; } } W:m ((WOsmartSEO/lib/scripts/facebook-v5-5.0.0/FileUpload/FacebookResumableUploader.php obapp = $app; $this->client = $client; $this->accessToken = $accessToken; $this->graphVersion = $graphVersion; } /** * Upload by chunks - start phase * * @param string $endpoint * @param FacebookFile $file * * @return FacebookTransferChunk * * @throws FacebookSDKException */ public function start($endpoint, FacebookFile $file) { $params = [ 'upload_phase' => 'start', 'file_size' => $file->getSize(), ]; $response = $this->sendUploadRequest($endpoint, $params); return new FacebookTransferChunk($file, $response['upload_session_id'], $response['video_id'], $response['start_offset'], $response['end_offset']); } /** * Upload by chunks - transfer phase * * @param string $endpoint * @param FacebookTransferChunk $chunk * @param boolean $allowToThrow * * @return FacebookTransferChunk * * @throws FacebookResponseException */ public function transfer($endpoint, FacebookTransferChunk $chunk, $allowToThrow = false) { $params = [ 'upload_phase' => 'transfer', 'upload_session_id' => $chunk->getUploadSessionId(), 'start_offset' => $chunk->getStartOffset(), 'video_file_chunk' => $chunk->getPartialFile(), ]; try { $response = $this->sendUploadRequest($endpoint, $params); } catch (FacebookResponseException $e) { $preException = $e->getPrevious(); if ($allowToThrow || !$preException instanceof FacebookResumableUploadException) { throw $e; } // Return the same chunk entity so it can be retried. return $chunk; } return new FacebookTransferChunk($chunk->getFile(), $chunk->getUploadSessionId(), $chunk->getVideoId(), $response['start_offset'], $response['end_offset']); } /** * Upload by chunks - finish phase * * @param string $endpoint * @param string $uploadSessionId * @param array $metadata The metadata associated with the file. * * @return boolean * * @throws FacebookSDKException */ public function finish($endpoint, $uploadSessionId, $metadata = []) { $params = array_merge($metadata, [ 'upload_phase' => 'finish', 'upload_session_id' => $uploadSessionId, ]); $response = $this->sendUploadRequest($endpoint, $params); return $response['success']; } /** * Helper to make a FacebookRequest and send it. * * @param string $endpoint The endpoint to POST to. * @param array $params The params to send with the request. * * @return array */ private function sendUploadRequest($endpoint, $params = []) { $request = new FacebookRequest($this->app, $this->accessToken, 'POST', $endpoint, $params, null, $this->graphVersion); return $this->client->sendRequest($request)->getDecodedBody(); } } /w `i _NKsmartSEO/lib/scripts/facebook-v5-5.0.0/FileUpload/FacebookTransferChunk.php obfile = $file; $this->uploadSessionId = $uploadSessionId; $this->videoId = $videoId; $this->startOffset = $startOffset; $this->endOffset = $endOffset; } /** * Return the file entity. * * @return FacebookFile */ public function getFile() { return $this->file; } /** * Return a FacebookFile entity with partial content. * * @return FacebookFile */ public function getPartialFile() { $maxLength = $this->endOffset - $this->startOffset; return new FacebookFile($this->file->getFilePath(), $maxLength, $this->startOffset); } /** * Return upload session Id * * @return int */ public function getUploadSessionId() { return $this->uploadSessionId; } /** * Check whether is the last chunk * * @return bool */ public function isLastChunk() { return $this->startOffset === $this->endOffset; } /** * @return int */ public function getStartOffset() { return $this->startOffset; } /** * Get uploaded video Id * * @return int */ public function getVideoId() { return $this->videoId; } } a  KCsmartSEO/lib/scripts/facebook-v5-5.0.0/FileUpload/FacebookVideo.php obcwm_ ?smartSEO/lib/scripts/facebook-v5-5.0.0/FileUpload/Mimetypes.php ob 'text/vnd.in3d.3dml', '3g2' => 'video/3gpp2', '3gp' => 'video/3gpp', '7z' => 'application/x-7z-compressed', 'aab' => 'application/x-authorware-bin', 'aac' => 'audio/x-aac', 'aam' => 'application/x-authorware-map', 'aas' => 'application/x-authorware-seg', 'abw' => 'application/x-abiword', 'ac' => 'application/pkix-attr-cert', 'acc' => 'application/vnd.americandynamics.acc', 'ace' => 'application/x-ace-compressed', 'acu' => 'application/vnd.acucobol', 'acutc' => 'application/vnd.acucorp', 'adp' => 'audio/adpcm', 'aep' => 'application/vnd.audiograph', 'afm' => 'application/x-font-type1', 'afp' => 'application/vnd.ibm.modcap', 'ahead' => 'application/vnd.ahead.space', 'ai' => 'application/postscript', 'aif' => 'audio/x-aiff', 'aifc' => 'audio/x-aiff', 'aiff' => 'audio/x-aiff', 'air' => 'application/vnd.adobe.air-application-installer-package+zip', 'ait' => 'application/vnd.dvb.ait', 'ami' => 'application/vnd.amiga.ami', 'apk' => 'application/vnd.android.package-archive', 'application' => 'application/x-ms-application', 'apr' => 'application/vnd.lotus-approach', 'asa' => 'text/plain', 'asax' => 'application/octet-stream', 'asc' => 'application/pgp-signature', 'ascx' => 'text/plain', 'asf' => 'video/x-ms-asf', 'ashx' => 'text/plain', 'asm' => 'text/x-asm', 'asmx' => 'text/plain', 'aso' => 'application/vnd.accpac.simply.aso', 'asp' => 'text/plain', 'aspx' => 'text/plain', 'asx' => 'video/x-ms-asf', 'atc' => 'application/vnd.acucorp', 'atom' => 'application/atom+xml', 'atomcat' => 'application/atomcat+xml', 'atomsvc' => 'application/atomsvc+xml', 'atx' => 'application/vnd.antix.game-component', 'au' => 'audio/basic', 'avi' => 'video/x-msvideo', 'aw' => 'application/applixware', 'axd' => 'text/plain', 'azf' => 'application/vnd.airzip.filesecure.azf', 'azs' => 'application/vnd.airzip.filesecure.azs', 'azw' => 'application/vnd.amazon.ebook', 'bat' => 'application/x-msdownload', 'bcpio' => 'application/x-bcpio', 'bdf' => 'application/x-font-bdf', 'bdm' => 'application/vnd.syncml.dm+wbxml', 'bed' => 'application/vnd.realvnc.bed', 'bh2' => 'application/vnd.fujitsu.oasysprs', 'bin' => 'application/octet-stream', 'bmi' => 'application/vnd.bmi', 'bmp' => 'image/bmp', 'book' => 'application/vnd.framemaker', 'box' => 'application/vnd.previewsystems.box', 'boz' => 'application/x-bzip2', 'bpk' => 'application/octet-stream', 'btif' => 'image/prs.btif', 'bz' => 'application/x-bzip', 'bz2' => 'application/x-bzip2', 'c' => 'text/x-c', 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', 'c4d' => 'application/vnd.clonk.c4group', 'c4f' => 'application/vnd.clonk.c4group', 'c4g' => 'application/vnd.clonk.c4group', 'c4p' => 'application/vnd.clonk.c4group', 'c4u' => 'application/vnd.clonk.c4group', 'cab' => 'application/vnd.ms-cab-compressed', 'car' => 'application/vnd.curl.car', 'cat' => 'application/vnd.ms-pki.seccat', 'cc' => 'text/x-c', 'cct' => 'application/x-director', 'ccxml' => 'application/ccxml+xml', 'cdbcmsg' => 'application/vnd.contact.cmsg', 'cdf' => 'application/x-netcdf', 'cdkey' => 'application/vnd.mediastation.cdkey', 'cdmia' => 'application/cdmi-capability', 'cdmic' => 'application/cdmi-container', 'cdmid' => 'application/cdmi-domain', 'cdmio' => 'application/cdmi-object', 'cdmiq' => 'application/cdmi-queue', 'cdx' => 'chemical/x-cdx', 'cdxml' => 'application/vnd.chemdraw+xml', 'cdy' => 'application/vnd.cinderella', 'cer' => 'application/pkix-cert', 'cfc' => 'application/x-coldfusion', 'cfm' => 'application/x-coldfusion', 'cgm' => 'image/cgm', 'chat' => 'application/x-chat', 'chm' => 'application/vnd.ms-htmlhelp', 'chrt' => 'application/vnd.kde.kchart', 'cif' => 'chemical/x-cif', 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', 'cil' => 'application/vnd.ms-artgalry', 'cla' => 'application/vnd.claymore', 'class' => 'application/java-vm', 'clkk' => 'application/vnd.crick.clicker.keyboard', 'clkp' => 'application/vnd.crick.clicker.palette', 'clkt' => 'application/vnd.crick.clicker.template', 'clkw' => 'application/vnd.crick.clicker.wordbank', 'clkx' => 'application/vnd.crick.clicker', 'clp' => 'application/x-msclip', 'cmc' => 'application/vnd.cosmocaller', 'cmdf' => 'chemical/x-cmdf', 'cml' => 'chemical/x-cml', 'cmp' => 'application/vnd.yellowriver-custom-menu', 'cmx' => 'image/x-cmx', 'cod' => 'application/vnd.rim.cod', 'com' => 'application/x-msdownload', 'conf' => 'text/plain', 'cpio' => 'application/x-cpio', 'cpp' => 'text/x-c', 'cpt' => 'application/mac-compactpro', 'crd' => 'application/x-mscardfile', 'crl' => 'application/pkix-crl', 'crt' => 'application/x-x509-ca-cert', 'cryptonote' => 'application/vnd.rig.cryptonote', 'cs' => 'text/plain', 'csh' => 'application/x-csh', 'csml' => 'chemical/x-csml', 'csp' => 'application/vnd.commonspace', 'css' => 'text/css', 'cst' => 'application/x-director', 'csv' => 'text/csv', 'cu' => 'application/cu-seeme', 'curl' => 'text/vnd.curl', 'cww' => 'application/prs.cww', 'cxt' => 'application/x-director', 'cxx' => 'text/x-c', 'dae' => 'model/vnd.collada+xml', 'daf' => 'application/vnd.mobius.daf', 'dataless' => 'application/vnd.fdsn.seed', 'davmount' => 'application/davmount+xml', 'dcr' => 'application/x-director', 'dcurl' => 'text/vnd.curl.dcurl', 'dd2' => 'application/vnd.oma.dd2+xml', 'ddd' => 'application/vnd.fujixerox.ddd', 'deb' => 'application/x-debian-package', 'def' => 'text/plain', 'deploy' => 'application/octet-stream', 'der' => 'application/x-x509-ca-cert', 'dfac' => 'application/vnd.dreamfactory', 'dic' => 'text/x-c', 'dir' => 'application/x-director', 'dis' => 'application/vnd.mobius.dis', 'dist' => 'application/octet-stream', 'distz' => 'application/octet-stream', 'djv' => 'image/vnd.djvu', 'djvu' => 'image/vnd.djvu', 'dll' => 'application/x-msdownload', 'dmg' => 'application/octet-stream', 'dms' => 'application/octet-stream', 'dna' => 'application/vnd.dna', 'doc' => 'application/msword', 'docm' => 'application/vnd.ms-word.document.macroenabled.12', 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'dot' => 'application/msword', 'dotm' => 'application/vnd.ms-word.template.macroenabled.12', 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'dp' => 'application/vnd.osgi.dp', 'dpg' => 'application/vnd.dpgraph', 'dra' => 'audio/vnd.dra', 'dsc' => 'text/prs.lines.tag', 'dssc' => 'application/dssc+der', 'dtb' => 'application/x-dtbook+xml', 'dtd' => 'application/xml-dtd', 'dts' => 'audio/vnd.dts', 'dtshd' => 'audio/vnd.dts.hd', 'dump' => 'application/octet-stream', 'dvi' => 'application/x-dvi', 'dwf' => 'model/vnd.dwf', 'dwg' => 'image/vnd.dwg', 'dxf' => 'image/vnd.dxf', 'dxp' => 'application/vnd.spotfire.dxp', 'dxr' => 'application/x-director', 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', 'ecma' => 'application/ecmascript', 'edm' => 'application/vnd.novadigm.edm', 'edx' => 'application/vnd.novadigm.edx', 'efif' => 'application/vnd.picsel', 'ei6' => 'application/vnd.pg.osasli', 'elc' => 'application/octet-stream', 'eml' => 'message/rfc822', 'emma' => 'application/emma+xml', 'eol' => 'audio/vnd.digital-winds', 'eot' => 'application/vnd.ms-fontobject', 'eps' => 'application/postscript', 'epub' => 'application/epub+zip', 'es3' => 'application/vnd.eszigno3+xml', 'esf' => 'application/vnd.epson.esf', 'et3' => 'application/vnd.eszigno3+xml', 'etx' => 'text/x-setext', 'exe' => 'application/x-msdownload', 'exi' => 'application/exi', 'ext' => 'application/vnd.novadigm.ext', 'ez' => 'application/andrew-inset', 'ez2' => 'application/vnd.ezpix-album', 'ez3' => 'application/vnd.ezpix-package', 'f' => 'text/x-fortran', 'f4v' => 'video/x-f4v', 'f77' => 'text/x-fortran', 'f90' => 'text/x-fortran', 'fbs' => 'image/vnd.fastbidsheet', 'fcs' => 'application/vnd.isac.fcs', 'fdf' => 'application/vnd.fdf', 'fe_launch' => 'application/vnd.denovo.fcselayout-link', 'fg5' => 'application/vnd.fujitsu.oasysgp', 'fgd' => 'application/x-director', 'fh' => 'image/x-freehand', 'fh4' => 'image/x-freehand', 'fh5' => 'image/x-freehand', 'fh7' => 'image/x-freehand', 'fhc' => 'image/x-freehand', 'fig' => 'application/x-xfig', 'fli' => 'video/x-fli', 'flo' => 'application/vnd.micrografx.flo', 'flv' => 'video/x-flv', 'flw' => 'application/vnd.kde.kivio', 'flx' => 'text/vnd.fmi.flexstor', 'fly' => 'text/vnd.fly', 'fm' => 'application/vnd.framemaker', 'fnc' => 'application/vnd.frogans.fnc', 'for' => 'text/x-fortran', 'fpx' => 'image/vnd.fpx', 'frame' => 'application/vnd.framemaker', 'fsc' => 'application/vnd.fsc.weblaunch', 'fst' => 'image/vnd.fst', 'ftc' => 'application/vnd.fluxtime.clip', 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', 'fvt' => 'video/vnd.fvt', 'fxp' => 'application/vnd.adobe.fxp', 'fxpl' => 'application/vnd.adobe.fxp', 'fzs' => 'application/vnd.fuzzysheet', 'g2w' => 'application/vnd.geoplan', 'g3' => 'image/g3fax', 'g3w' => 'application/vnd.geospace', 'gac' => 'application/vnd.groove-account', 'gdl' => 'model/vnd.gdl', 'geo' => 'application/vnd.dynageo', 'gex' => 'application/vnd.geometry-explorer', 'ggb' => 'application/vnd.geogebra.file', 'ggt' => 'application/vnd.geogebra.tool', 'ghf' => 'application/vnd.groove-help', 'gif' => 'image/gif', 'gim' => 'application/vnd.groove-identity-message', 'gmx' => 'application/vnd.gmx', 'gnumeric' => 'application/x-gnumeric', 'gph' => 'application/vnd.flographit', 'gqf' => 'application/vnd.grafeq', 'gqs' => 'application/vnd.grafeq', 'gram' => 'application/srgs', 'gre' => 'application/vnd.geometry-explorer', 'grv' => 'application/vnd.groove-injector', 'grxml' => 'application/srgs+xml', 'gsf' => 'application/x-font-ghostscript', 'gtar' => 'application/x-gtar', 'gtm' => 'application/vnd.groove-tool-message', 'gtw' => 'model/vnd.gtw', 'gv' => 'text/vnd.graphviz', 'gxt' => 'application/vnd.geonext', 'h' => 'text/x-c', 'h261' => 'video/h261', 'h263' => 'video/h263', 'h264' => 'video/h264', 'hal' => 'application/vnd.hal+xml', 'hbci' => 'application/vnd.hbci', 'hdf' => 'application/x-hdf', 'hh' => 'text/x-c', 'hlp' => 'application/winhlp', 'hpgl' => 'application/vnd.hp-hpgl', 'hpid' => 'application/vnd.hp-hpid', 'hps' => 'application/vnd.hp-hps', 'hqx' => 'application/mac-binhex40', 'hta' => 'application/octet-stream', 'htc' => 'text/html', 'htke' => 'application/vnd.kenameaapp', 'htm' => 'text/html', 'html' => 'text/html', 'hvd' => 'application/vnd.yamaha.hv-dic', 'hvp' => 'application/vnd.yamaha.hv-voice', 'hvs' => 'application/vnd.yamaha.hv-script', 'i2g' => 'application/vnd.intergeo', 'icc' => 'application/vnd.iccprofile', 'ice' => 'x-conference/x-cooltalk', 'icm' => 'application/vnd.iccprofile', 'ico' => 'image/x-icon', 'ics' => 'text/calendar', 'ief' => 'image/ief', 'ifb' => 'text/calendar', 'ifm' => 'application/vnd.shana.informed.formdata', 'iges' => 'model/iges', 'igl' => 'application/vnd.igloader', 'igm' => 'application/vnd.insors.igm', 'igs' => 'model/iges', 'igx' => 'application/vnd.micrografx.igx', 'iif' => 'application/vnd.shana.informed.interchange', 'imp' => 'application/vnd.accpac.simply.imp', 'ims' => 'application/vnd.ms-ims', 'in' => 'text/plain', 'ini' => 'text/plain', 'ipfix' => 'application/ipfix', 'ipk' => 'application/vnd.shana.informed.package', 'irm' => 'application/vnd.ibm.rights-management', 'irp' => 'application/vnd.irepository.package+xml', 'iso' => 'application/octet-stream', 'itp' => 'application/vnd.shana.informed.formtemplate', 'ivp' => 'application/vnd.immervision-ivp', 'ivu' => 'application/vnd.immervision-ivu', 'jad' => 'text/vnd.sun.j2me.app-descriptor', 'jam' => 'application/vnd.jam', 'jar' => 'application/java-archive', 'java' => 'text/x-java-source', 'jisp' => 'application/vnd.jisp', 'jlt' => 'application/vnd.hp-jlyt', 'jnlp' => 'application/x-java-jnlp-file', 'joda' => 'application/vnd.joost.joda-archive', 'jpe' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'jpgm' => 'video/jpm', 'jpgv' => 'video/jpeg', 'jpm' => 'video/jpm', 'js' => 'text/javascript', 'json' => 'application/json', 'kar' => 'audio/midi', 'karbon' => 'application/vnd.kde.karbon', 'kfo' => 'application/vnd.kde.kformula', 'kia' => 'application/vnd.kidspiration', 'kml' => 'application/vnd.google-earth.kml+xml', 'kmz' => 'application/vnd.google-earth.kmz', 'kne' => 'application/vnd.kinar', 'knp' => 'application/vnd.kinar', 'kon' => 'application/vnd.kde.kontour', 'kpr' => 'application/vnd.kde.kpresenter', 'kpt' => 'application/vnd.kde.kpresenter', 'ksp' => 'application/vnd.kde.kspread', 'ktr' => 'application/vnd.kahootz', 'ktx' => 'image/ktx', 'ktz' => 'application/vnd.kahootz', 'kwd' => 'application/vnd.kde.kword', 'kwt' => 'application/vnd.kde.kword', 'lasxml' => 'application/vnd.las.las+xml', 'latex' => 'application/x-latex', 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', 'les' => 'application/vnd.hhe.lesson-player', 'lha' => 'application/octet-stream', 'link66' => 'application/vnd.route66.link66+xml', 'list' => 'text/plain', 'list3820' => 'application/vnd.ibm.modcap', 'listafp' => 'application/vnd.ibm.modcap', 'log' => 'text/plain', 'lostxml' => 'application/lost+xml', 'lrf' => 'application/octet-stream', 'lrm' => 'application/vnd.ms-lrm', 'ltf' => 'application/vnd.frogans.ltf', 'lvp' => 'audio/vnd.lucent.voice', 'lwp' => 'application/vnd.lotus-wordpro', 'lzh' => 'application/octet-stream', 'm13' => 'application/x-msmediaview', 'm14' => 'application/x-msmediaview', 'm1v' => 'video/mpeg', 'm21' => 'application/mp21', 'm2a' => 'audio/mpeg', 'm2v' => 'video/mpeg', 'm3a' => 'audio/mpeg', 'm3u' => 'audio/x-mpegurl', 'm3u8' => 'application/vnd.apple.mpegurl', 'm4a' => 'audio/mp4', 'm4u' => 'video/vnd.mpegurl', 'm4v' => 'video/mp4', 'ma' => 'application/mathematica', 'mads' => 'application/mads+xml', 'mag' => 'application/vnd.ecowin.chart', 'maker' => 'application/vnd.framemaker', 'man' => 'text/troff', 'mathml' => 'application/mathml+xml', 'mb' => 'application/mathematica', 'mbk' => 'application/vnd.mobius.mbk', 'mbox' => 'application/mbox', 'mc1' => 'application/vnd.medcalcdata', 'mcd' => 'application/vnd.mcd', 'mcurl' => 'text/vnd.curl.mcurl', 'mdb' => 'application/x-msaccess', 'mdi' => 'image/vnd.ms-modi', 'me' => 'text/troff', 'mesh' => 'model/mesh', 'meta4' => 'application/metalink4+xml', 'mets' => 'application/mets+xml', 'mfm' => 'application/vnd.mfmp', 'mgp' => 'application/vnd.osgeo.mapguide.package', 'mgz' => 'application/vnd.proteus.magazine', 'mid' => 'audio/midi', 'midi' => 'audio/midi', 'mif' => 'application/vnd.mif', 'mime' => 'message/rfc822', 'mj2' => 'video/mj2', 'mjp2' => 'video/mj2', 'mlp' => 'application/vnd.dolby.mlp', 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', 'mmf' => 'application/vnd.smaf', 'mmr' => 'image/vnd.fujixerox.edmics-mmr', 'mny' => 'application/x-msmoney', 'mobi' => 'application/x-mobipocket-ebook', 'mods' => 'application/mods+xml', 'mov' => 'video/quicktime', 'movie' => 'video/x-sgi-movie', 'mp2' => 'audio/mpeg', 'mp21' => 'application/mp21', 'mp2a' => 'audio/mpeg', 'mp3' => 'audio/mpeg', 'mp4' => 'video/mp4', 'mp4a' => 'audio/mp4', 'mp4s' => 'application/mp4', 'mp4v' => 'video/mp4', 'mpc' => 'application/vnd.mophun.certificate', 'mpe' => 'video/mpeg', 'mpeg' => 'video/mpeg', 'mpg' => 'video/mpeg', 'mpg4' => 'video/mp4', 'mpga' => 'audio/mpeg', 'mpkg' => 'application/vnd.apple.installer+xml', 'mpm' => 'application/vnd.blueice.multipass', 'mpn' => 'application/vnd.mophun.application', 'mpp' => 'application/vnd.ms-project', 'mpt' => 'application/vnd.ms-project', 'mpy' => 'application/vnd.ibm.minipay', 'mqy' => 'application/vnd.mobius.mqy', 'mrc' => 'application/marc', 'mrcx' => 'application/marcxml+xml', 'ms' => 'text/troff', 'mscml' => 'application/mediaservercontrol+xml', 'mseed' => 'application/vnd.fdsn.mseed', 'mseq' => 'application/vnd.mseq', 'msf' => 'application/vnd.epson.msf', 'msh' => 'model/mesh', 'msi' => 'application/x-msdownload', 'msl' => 'application/vnd.mobius.msl', 'msty' => 'application/vnd.muvee.style', 'mts' => 'model/vnd.mts', 'mus' => 'application/vnd.musician', 'musicxml' => 'application/vnd.recordare.musicxml+xml', 'mvb' => 'application/x-msmediaview', 'mwf' => 'application/vnd.mfer', 'mxf' => 'application/mxf', 'mxl' => 'application/vnd.recordare.musicxml', 'mxml' => 'application/xv+xml', 'mxs' => 'application/vnd.triscape.mxs', 'mxu' => 'video/vnd.mpegurl', 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', 'n3' => 'text/n3', 'nb' => 'application/mathematica', 'nbp' => 'application/vnd.wolfram.player', 'nc' => 'application/x-netcdf', 'ncx' => 'application/x-dtbncx+xml', 'ngdat' => 'application/vnd.nokia.n-gage.data', 'nlu' => 'application/vnd.neurolanguage.nlu', 'nml' => 'application/vnd.enliven', 'nnd' => 'application/vnd.noblenet-directory', 'nns' => 'application/vnd.noblenet-sealer', 'nnw' => 'application/vnd.noblenet-web', 'npx' => 'image/vnd.net-fpx', 'nsf' => 'application/vnd.lotus-notes', 'oa2' => 'application/vnd.fujitsu.oasys2', 'oa3' => 'application/vnd.fujitsu.oasys3', 'oas' => 'application/vnd.fujitsu.oasys', 'obd' => 'application/x-msbinder', 'oda' => 'application/oda', 'odb' => 'application/vnd.oasis.opendocument.database', 'odc' => 'application/vnd.oasis.opendocument.chart', 'odf' => 'application/vnd.oasis.opendocument.formula', 'odft' => 'application/vnd.oasis.opendocument.formula-template', 'odg' => 'application/vnd.oasis.opendocument.graphics', 'odi' => 'application/vnd.oasis.opendocument.image', 'odm' => 'application/vnd.oasis.opendocument.text-master', 'odp' => 'application/vnd.oasis.opendocument.presentation', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', 'odt' => 'application/vnd.oasis.opendocument.text', 'oga' => 'audio/ogg', 'ogg' => 'audio/ogg', 'ogv' => 'video/ogg', 'ogx' => 'application/ogg', 'onepkg' => 'application/onenote', 'onetmp' => 'application/onenote', 'onetoc' => 'application/onenote', 'onetoc2' => 'application/onenote', 'opf' => 'application/oebps-package+xml', 'oprc' => 'application/vnd.palm', 'org' => 'application/vnd.lotus-organizer', 'osf' => 'application/vnd.yamaha.openscoreformat', 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', 'otc' => 'application/vnd.oasis.opendocument.chart-template', 'otf' => 'application/x-font-otf', 'otg' => 'application/vnd.oasis.opendocument.graphics-template', 'oth' => 'application/vnd.oasis.opendocument.text-web', 'oti' => 'application/vnd.oasis.opendocument.image-template', 'otp' => 'application/vnd.oasis.opendocument.presentation-template', 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', 'ott' => 'application/vnd.oasis.opendocument.text-template', 'oxt' => 'application/vnd.openofficeorg.extension', 'p' => 'text/x-pascal', 'p10' => 'application/pkcs10', 'p12' => 'application/x-pkcs12', 'p7b' => 'application/x-pkcs7-certificates', 'p7c' => 'application/pkcs7-mime', 'p7m' => 'application/pkcs7-mime', 'p7r' => 'application/x-pkcs7-certreqresp', 'p7s' => 'application/pkcs7-signature', 'p8' => 'application/pkcs8', 'pas' => 'text/x-pascal', 'paw' => 'application/vnd.pawaafile', 'pbd' => 'application/vnd.powerbuilder6', 'pbm' => 'image/x-portable-bitmap', 'pcf' => 'application/x-font-pcf', 'pcl' => 'application/vnd.hp-pcl', 'pclxl' => 'application/vnd.hp-pclxl', 'pct' => 'image/x-pict', 'pcurl' => 'application/vnd.curl.pcurl', 'pcx' => 'image/x-pcx', 'pdb' => 'application/vnd.palm', 'pdf' => 'application/pdf', 'pfa' => 'application/x-font-type1', 'pfb' => 'application/x-font-type1', 'pfm' => 'application/x-font-type1', 'pfr' => 'application/font-tdpfr', 'pfx' => 'application/x-pkcs12', 'pgm' => 'image/x-portable-graymap', 'pgn' => 'application/x-chess-pgn', 'pgp' => 'application/pgp-encrypted', 'php' => 'text/x-php', 'phps' => 'application/x-httpd-phps', 'pic' => 'image/x-pict', 'pkg' => 'application/octet-stream', 'pki' => 'application/pkixcmp', 'pkipath' => 'application/pkix-pkipath', 'plb' => 'application/vnd.3gpp.pic-bw-large', 'plc' => 'application/vnd.mobius.plc', 'plf' => 'application/vnd.pocketlearn', 'pls' => 'application/pls+xml', 'pml' => 'application/vnd.ctc-posml', 'png' => 'image/png', 'pnm' => 'image/x-portable-anymap', 'portpkg' => 'application/vnd.macports.portpkg', 'pot' => 'application/vnd.ms-powerpoint', 'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12', 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', 'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12', 'ppd' => 'application/vnd.cups-ppd', 'ppm' => 'image/x-portable-pixmap', 'pps' => 'application/vnd.ms-powerpoint', 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12', 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'ppt' => 'application/vnd.ms-powerpoint', 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12', 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'pqa' => 'application/vnd.palm', 'prc' => 'application/x-mobipocket-ebook', 'pre' => 'application/vnd.lotus-freelance', 'prf' => 'application/pics-rules', 'ps' => 'application/postscript', 'psb' => 'application/vnd.3gpp.pic-bw-small', 'psd' => 'image/vnd.adobe.photoshop', 'psf' => 'application/x-font-linux-psf', 'pskcxml' => 'application/pskc+xml', 'ptid' => 'application/vnd.pvi.ptid1', 'pub' => 'application/x-mspublisher', 'pvb' => 'application/vnd.3gpp.pic-bw-var', 'pwn' => 'application/vnd.3m.post-it-notes', 'pya' => 'audio/vnd.ms-playready.media.pya', 'pyv' => 'video/vnd.ms-playready.media.pyv', 'qam' => 'application/vnd.epson.quickanime', 'qbo' => 'application/vnd.intu.qbo', 'qfx' => 'application/vnd.intu.qfx', 'qps' => 'application/vnd.publishare-delta-tree', 'qt' => 'video/quicktime', 'qwd' => 'application/vnd.quark.quarkxpress', 'qwt' => 'application/vnd.quark.quarkxpress', 'qxb' => 'application/vnd.quark.quarkxpress', 'qxd' => 'application/vnd.quark.quarkxpress', 'qxl' => 'application/vnd.quark.quarkxpress', 'qxt' => 'application/vnd.quark.quarkxpress', 'ra' => 'audio/x-pn-realaudio', 'ram' => 'audio/x-pn-realaudio', 'rar' => 'application/x-rar-compressed', 'ras' => 'image/x-cmu-raster', 'rb' => 'text/plain', 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', 'rdf' => 'application/rdf+xml', 'rdz' => 'application/vnd.data-vision.rdz', 'rep' => 'application/vnd.businessobjects', 'res' => 'application/x-dtbresource+xml', 'resx' => 'text/xml', 'rgb' => 'image/x-rgb', 'rif' => 'application/reginfo+xml', 'rip' => 'audio/vnd.rip', 'rl' => 'application/resource-lists+xml', 'rlc' => 'image/vnd.fujixerox.edmics-rlc', 'rld' => 'application/resource-lists-diff+xml', 'rm' => 'application/vnd.rn-realmedia', 'rmi' => 'audio/midi', 'rmp' => 'audio/x-pn-realaudio-plugin', 'rms' => 'application/vnd.jcp.javame.midlet-rms', 'rnc' => 'application/relax-ng-compact-syntax', 'roff' => 'text/troff', 'rp9' => 'application/vnd.cloanto.rp9', 'rpss' => 'application/vnd.nokia.radio-presets', 'rpst' => 'application/vnd.nokia.radio-preset', 'rq' => 'application/sparql-query', 'rs' => 'application/rls-services+xml', 'rsd' => 'application/rsd+xml', 'rss' => 'application/rss+xml', 'rtf' => 'application/rtf', 'rtx' => 'text/richtext', 's' => 'text/x-asm', 'saf' => 'application/vnd.yamaha.smaf-audio', 'sbml' => 'application/sbml+xml', 'sc' => 'application/vnd.ibm.secure-container', 'scd' => 'application/x-msschedule', 'scm' => 'application/vnd.lotus-screencam', 'scq' => 'application/scvp-cv-request', 'scs' => 'application/scvp-cv-response', 'scurl' => 'text/vnd.curl.scurl', 'sda' => 'application/vnd.stardivision.draw', 'sdc' => 'application/vnd.stardivision.calc', 'sdd' => 'application/vnd.stardivision.impress', 'sdkd' => 'application/vnd.solent.sdkm+xml', 'sdkm' => 'application/vnd.solent.sdkm+xml', 'sdp' => 'application/sdp', 'sdw' => 'application/vnd.stardivision.writer', 'see' => 'application/vnd.seemail', 'seed' => 'application/vnd.fdsn.seed', 'sema' => 'application/vnd.sema', 'semd' => 'application/vnd.semd', 'semf' => 'application/vnd.semf', 'ser' => 'application/java-serialized-object', 'setpay' => 'application/set-payment-initiation', 'setreg' => 'application/set-registration-initiation', 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', 'sfs' => 'application/vnd.spotfire.sfs', 'sgl' => 'application/vnd.stardivision.writer-global', 'sgm' => 'text/sgml', 'sgml' => 'text/sgml', 'sh' => 'application/x-sh', 'shar' => 'application/x-shar', 'shf' => 'application/shf+xml', 'sig' => 'application/pgp-signature', 'silo' => 'model/mesh', 'sis' => 'application/vnd.symbian.install', 'sisx' => 'application/vnd.symbian.install', 'sit' => 'application/x-stuffit', 'sitx' => 'application/x-stuffitx', 'skd' => 'application/vnd.koan', 'skm' => 'application/vnd.koan', 'skp' => 'application/vnd.koan', 'skt' => 'application/vnd.koan', 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', 'slt' => 'application/vnd.epson.salt', 'sm' => 'application/vnd.stepmania.stepchart', 'smf' => 'application/vnd.stardivision.math', 'smi' => 'application/smil+xml', 'smil' => 'application/smil+xml', 'snd' => 'audio/basic', 'snf' => 'application/x-font-snf', 'so' => 'application/octet-stream', 'spc' => 'application/x-pkcs7-certificates', 'spf' => 'application/vnd.yamaha.smaf-phrase', 'spl' => 'application/x-futuresplash', 'spot' => 'text/vnd.in3d.spot', 'spp' => 'application/scvp-vp-response', 'spq' => 'application/scvp-vp-request', 'spx' => 'audio/ogg', 'src' => 'application/x-wais-source', 'srt' => 'application/octet-stream', 'sru' => 'application/sru+xml', 'srx' => 'application/sparql-results+xml', 'sse' => 'application/vnd.kodak-descriptor', 'ssf' => 'application/vnd.epson.ssf', 'ssml' => 'application/ssml+xml', 'st' => 'application/vnd.sailingtracker.track', 'stc' => 'application/vnd.sun.xml.calc.template', 'std' => 'application/vnd.sun.xml.draw.template', 'stf' => 'application/vnd.wt.stf', 'sti' => 'application/vnd.sun.xml.impress.template', 'stk' => 'application/hyperstudio', 'stl' => 'application/vnd.ms-pki.stl', 'str' => 'application/vnd.pg.format', 'stw' => 'application/vnd.sun.xml.writer.template', 'sub' => 'image/vnd.dvb.subtitle', 'sus' => 'application/vnd.sus-calendar', 'susp' => 'application/vnd.sus-calendar', 'sv4cpio' => 'application/x-sv4cpio', 'sv4crc' => 'application/x-sv4crc', 'svc' => 'application/vnd.dvb.service', 'svd' => 'application/vnd.svd', 'svg' => 'image/svg+xml', 'svgz' => 'image/svg+xml', 'swa' => 'application/x-director', 'swf' => 'application/x-shockwave-flash', 'swi' => 'application/vnd.aristanetworks.swi', 'sxc' => 'application/vnd.sun.xml.calc', 'sxd' => 'application/vnd.sun.xml.draw', 'sxg' => 'application/vnd.sun.xml.writer.global', 'sxi' => 'application/vnd.sun.xml.impress', 'sxm' => 'application/vnd.sun.xml.math', 'sxw' => 'application/vnd.sun.xml.writer', 't' => 'text/troff', 'tao' => 'application/vnd.tao.intent-module-archive', 'tar' => 'application/x-tar', 'tcap' => 'application/vnd.3gpp2.tcap', 'tcl' => 'application/x-tcl', 'teacher' => 'application/vnd.smart.teacher', 'tei' => 'application/tei+xml', 'teicorpus' => 'application/tei+xml', 'tex' => 'application/x-tex', 'texi' => 'application/x-texinfo', 'texinfo' => 'application/x-texinfo', 'text' => 'text/plain', 'tfi' => 'application/thraud+xml', 'tfm' => 'application/x-tex-tfm', 'thmx' => 'application/vnd.ms-officetheme', 'tif' => 'image/tiff', 'tiff' => 'image/tiff', 'tmo' => 'application/vnd.tmobile-livetv', 'torrent' => 'application/x-bittorrent', 'tpl' => 'application/vnd.groove-tool-template', 'tpt' => 'application/vnd.trid.tpt', 'tr' => 'text/troff', 'tra' => 'application/vnd.trueapp', 'trm' => 'application/x-msterminal', 'tsd' => 'application/timestamped-data', 'tsv' => 'text/tab-separated-values', 'ttc' => 'application/x-font-ttf', 'ttf' => 'application/x-font-ttf', 'ttl' => 'text/turtle', 'twd' => 'application/vnd.simtech-mindmapper', 'twds' => 'application/vnd.simtech-mindmapper', 'txd' => 'application/vnd.genomatix.tuxedo', 'txf' => 'application/vnd.mobius.txf', 'txt' => 'text/plain', 'u32' => 'application/x-authorware-bin', 'udeb' => 'application/x-debian-package', 'ufd' => 'application/vnd.ufdl', 'ufdl' => 'application/vnd.ufdl', 'umj' => 'application/vnd.umajin', 'unityweb' => 'application/vnd.unity', 'uoml' => 'application/vnd.uoml+xml', 'uri' => 'text/uri-list', 'uris' => 'text/uri-list', 'urls' => 'text/uri-list', 'ustar' => 'application/x-ustar', 'utz' => 'application/vnd.uiq.theme', 'uu' => 'text/x-uuencode', 'uva' => 'audio/vnd.dece.audio', 'uvd' => 'application/vnd.dece.data', 'uvf' => 'application/vnd.dece.data', 'uvg' => 'image/vnd.dece.graphic', 'uvh' => 'video/vnd.dece.hd', 'uvi' => 'image/vnd.dece.graphic', 'uvm' => 'video/vnd.dece.mobile', 'uvp' => 'video/vnd.dece.pd', 'uvs' => 'video/vnd.dece.sd', 'uvt' => 'application/vnd.dece.ttml+xml', 'uvu' => 'video/vnd.uvvu.mp4', 'uvv' => 'video/vnd.dece.video', 'uvva' => 'audio/vnd.dece.audio', 'uvvd' => 'application/vnd.dece.data', 'uvvf' => 'application/vnd.dece.data', 'uvvg' => 'image/vnd.dece.graphic', 'uvvh' => 'video/vnd.dece.hd', 'uvvi' => 'image/vnd.dece.graphic', 'uvvm' => 'video/vnd.dece.mobile', 'uvvp' => 'video/vnd.dece.pd', 'uvvs' => 'video/vnd.dece.sd', 'uvvt' => 'application/vnd.dece.ttml+xml', 'uvvu' => 'video/vnd.uvvu.mp4', 'uvvv' => 'video/vnd.dece.video', 'uvvx' => 'application/vnd.dece.unspecified', 'uvx' => 'application/vnd.dece.unspecified', 'vcd' => 'application/x-cdlink', 'vcf' => 'text/x-vcard', 'vcg' => 'application/vnd.groove-vcard', 'vcs' => 'text/x-vcalendar', 'vcx' => 'application/vnd.vcx', 'vis' => 'application/vnd.visionary', 'viv' => 'video/vnd.vivo', 'vor' => 'application/vnd.stardivision.writer', 'vox' => 'application/x-authorware-bin', 'vrml' => 'model/vrml', 'vsd' => 'application/vnd.visio', 'vsf' => 'application/vnd.vsf', 'vss' => 'application/vnd.visio', 'vst' => 'application/vnd.visio', 'vsw' => 'application/vnd.visio', 'vtu' => 'model/vnd.vtu', 'vxml' => 'application/voicexml+xml', 'w3d' => 'application/x-director', 'wad' => 'application/x-doom', 'wav' => 'audio/x-wav', 'wax' => 'audio/x-ms-wax', 'wbmp' => 'image/vnd.wap.wbmp', 'wbs' => 'application/vnd.criticaltools.wbs+xml', 'wbxml' => 'application/vnd.wap.wbxml', 'wcm' => 'application/vnd.ms-works', 'wdb' => 'application/vnd.ms-works', 'weba' => 'audio/webm', 'webm' => 'video/webm', 'webp' => 'image/webp', 'wg' => 'application/vnd.pmi.widget', 'wgt' => 'application/widget', 'wks' => 'application/vnd.ms-works', 'wm' => 'video/x-ms-wm', 'wma' => 'audio/x-ms-wma', 'wmd' => 'application/x-ms-wmd', 'wmf' => 'application/x-msmetafile', 'wml' => 'text/vnd.wap.wml', 'wmlc' => 'application/vnd.wap.wmlc', 'wmls' => 'text/vnd.wap.wmlscript', 'wmlsc' => 'application/vnd.wap.wmlscriptc', 'wmv' => 'video/x-ms-wmv', 'wmx' => 'video/x-ms-wmx', 'wmz' => 'application/x-ms-wmz', 'woff' => 'application/x-font-woff', 'wpd' => 'application/vnd.wordperfect', 'wpl' => 'application/vnd.ms-wpl', 'wps' => 'application/vnd.ms-works', 'wqd' => 'application/vnd.wqd', 'wri' => 'application/x-mswrite', 'wrl' => 'model/vrml', 'wsdl' => 'application/wsdl+xml', 'wspolicy' => 'application/wspolicy+xml', 'wtb' => 'application/vnd.webturbo', 'wvx' => 'video/x-ms-wvx', 'x32' => 'application/x-authorware-bin', 'x3d' => 'application/vnd.hzn-3d-crossword', 'xap' => 'application/x-silverlight-app', 'xar' => 'application/vnd.xara', 'xbap' => 'application/x-ms-xbap', 'xbd' => 'application/vnd.fujixerox.docuworks.binder', 'xbm' => 'image/x-xbitmap', 'xdf' => 'application/xcap-diff+xml', 'xdm' => 'application/vnd.syncml.dm+xml', 'xdp' => 'application/vnd.adobe.xdp+xml', 'xdssc' => 'application/dssc+xml', 'xdw' => 'application/vnd.fujixerox.docuworks', 'xenc' => 'application/xenc+xml', 'xer' => 'application/patch-ops-error+xml', 'xfdf' => 'application/vnd.adobe.xfdf', 'xfdl' => 'application/vnd.xfdl', 'xht' => 'application/xhtml+xml', 'xhtml' => 'application/xhtml+xml', 'xhvml' => 'application/xv+xml', 'xif' => 'image/vnd.xiff', 'xla' => 'application/vnd.ms-excel', 'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12', 'xlc' => 'application/vnd.ms-excel', 'xlm' => 'application/vnd.ms-excel', 'xls' => 'application/vnd.ms-excel', 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12', 'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12', 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xlt' => 'application/vnd.ms-excel', 'xltm' => 'application/vnd.ms-excel.template.macroenabled.12', 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'xlw' => 'application/vnd.ms-excel', 'xml' => 'application/xml', 'xo' => 'application/vnd.olpc-sugar', 'xop' => 'application/xop+xml', 'xpi' => 'application/x-xpinstall', 'xpm' => 'image/x-xpixmap', 'xpr' => 'application/vnd.is-xpr', 'xps' => 'application/vnd.ms-xpsdocument', 'xpw' => 'application/vnd.intercon.formnet', 'xpx' => 'application/vnd.intercon.formnet', 'xsl' => 'application/xml', 'xslt' => 'application/xslt+xml', 'xsm' => 'application/vnd.syncml+xml', 'xspf' => 'application/xspf+xml', 'xul' => 'application/vnd.mozilla.xul+xml', 'xvm' => 'application/xv+xml', 'xvml' => 'application/xv+xml', 'xwd' => 'image/x-xwindowdump', 'xyz' => 'chemical/x-xyz', 'yaml' => 'text/yaml', 'yang' => 'application/yang', 'yin' => 'application/yin+xml', 'yml' => 'text/yaml', 'zaz' => 'application/vnd.zzazz.deck+xml', 'zip' => 'application/zip', 'zir' => 'application/vnd.zul', 'zirz' => 'application/vnd.zul', 'zmm' => 'application/vnd.handheld-entertainment+xml' ]; /** * Get a singleton instance of the class * * @return self * @codeCoverageIgnore */ public static function getInstance() { if (!self::$instance) { self::$instance = new self(); } return self::$instance; } /** * Get a mimetype value from a file extension * * @param string $extension File extension * * @return string|null */ public function fromExtension($extension) { $extension = strtolower($extension); return isset($this->mimetypes[$extension]) ? $this->mimetypes[$extension] : null; } /** * Get a mimetype from a filename * * @param string $filename Filename to generate a mimetype from * * @return string|null */ public function fromFilename($filename) { return $this->fromExtension(pathinfo($filename, PATHINFO_EXTENSION)); } } EFX\ 1>smartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/Birthday.php obhasYear = count($parts) === 3 || count($parts) === 1; $this->hasDate = count($parts) === 3 || count($parts) === 2; parent::__construct($date); } /** * Returns whether date object contains birth day and month * * @return bool */ public function hasDate() { return $this->hasDate; } /** * Returns whether date object contains birth year * * @return bool */ public function hasYear() { return $this->hasYear; } } M^ ++ߧ@smartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/Collection.php obitems = $items; } /** * Gets the value of a field from the Graph node. * * @param string $name The field to retrieve. * @param mixed $default The default to return if the field doesn't exist. * * @return mixed */ public function getField($name, $default = null) { if (isset($this->items[$name])) { return $this->items[$name]; } return $default; } /** * Gets the value of the named property for this graph object. * * @param string $name The property to retrieve. * @param mixed $default The default to return if the property doesn't exist. * * @return mixed * * @deprecated 5.0.0 getProperty() has been renamed to getField() * @todo v6: Remove this method */ public function getProperty($name, $default = null) { return $this->getField($name, $default); } /** * Returns a list of all fields set on the object. * * @return array */ public function getFieldNames() { return array_keys($this->items); } /** * Returns a list of all properties set on the object. * * @return array * * @deprecated 5.0.0 getPropertyNames() has been renamed to getFieldNames() * @todo v6: Remove this method */ public function getPropertyNames() { return $this->getFieldNames(); } /** * Get all of the items in the collection. * * @return array */ public function all() { return $this->items; } /** * Get the collection of items as a plain array. * * @return array */ public function asArray() { return array_map(function ($value) { return $value instanceof Collection ? $value->asArray() : $value; }, $this->items); } /** * Run a map over each of the items. * * @param \Closure $callback * * @return static */ public function map(\Closure $callback) { return new static(array_map($callback, $this->items, array_keys($this->items))); } /** * Get the collection of items as JSON. * * @param int $options * * @return string */ public function asJson($options = 0) { return json_encode($this->asArray(), $options); } /** * Count the number of items in the collection. * * @return int */ public function count() { return count($this->items); } /** * Get an iterator for the items. * * @return ArrayIterator */ public function getIterator() { return new ArrayIterator($this->items); } /** * Determine if an item exists at an offset. * * @param mixed $key * * @return bool */ public function offsetExists($key) { return array_key_exists($key, $this->items); } /** * Get an item at a given offset. * * @param mixed $key * * @return mixed */ public function offsetGet($key) { return $this->items[$key]; } /** * Set the item at a given offset. * * @param mixed $key * @param mixed $value * * @return void */ public function offsetSet($key, $value) { if (is_null($key)) { $this->items[] = $value; } else { $this->items[$key] = $value; } } /** * Unset the item at a given offset. * * @param string $key * * @return void */ public function offsetUnset($key) { unset($this->items[$key]); } /** * Convert the collection to its string representation. * * @return string */ public function __toString() { return $this->asJson(); } } W]d }kFsmartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphAchievement.php ob '\Facebook\GraphNodes\GraphUser', 'application' => '\Facebook\GraphNodes\GraphApplication', ]; /** * Returns the ID for the achievement. * * @return string|null */ public function getId() { return $this->getField('id'); } /** * Returns the user who achieved this. * * @return GraphUser|null */ public function getFrom() { return $this->getField('from'); } /** * Returns the time at which this was achieved. * * @return \DateTime|null */ public function getPublishTime() { return $this->getField('publish_time'); } /** * Returns the app in which the user achieved this. * * @return GraphApplication|null */ public function getApplication() { return $this->getField('application'); } /** * Returns information about the achievement type this instance is connected with. * * @return array|null */ public function getData() { return $this->getField('data'); } /** * Returns the type of achievement. * * @see https://developers.facebook.com/docs/graph-api/reference/achievement * * @return string */ public function getType() { return 'game.achievement'; } /** * Indicates whether gaining the achievement published a feed story for the user. * * @return boolean|null */ public function isNoFeedStory() { return $this->getField('no_feed_story'); } } t ~^  ]:CT@smartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphAlbum.php ob '\Facebook\GraphNodes\GraphUser', 'place' => '\Facebook\GraphNodes\GraphPage', ]; /** * Returns the ID for the album. * * @return string|null */ public function getId() { return $this->getField('id'); } /** * Returns whether the viewer can upload photos to this album. * * @return boolean|null */ public function getCanUpload() { return $this->getField('can_upload'); } /** * Returns the number of photos in this album. * * @return int|null */ public function getCount() { return $this->getField('count'); } /** * Returns the ID of the album's cover photo. * * @return string|null */ public function getCoverPhoto() { return $this->getField('cover_photo'); } /** * Returns the time the album was initially created. * * @return \DateTime|null */ public function getCreatedTime() { return $this->getField('created_time'); } /** * Returns the time the album was updated. * * @return \DateTime|null */ public function getUpdatedTime() { return $this->getField('updated_time'); } /** * Returns the description of the album. * * @return string|null */ public function getDescription() { return $this->getField('description'); } /** * Returns profile that created the album. * * @return GraphUser|null */ public function getFrom() { return $this->getField('from'); } /** * Returns profile that created the album. * * @return GraphPage|null */ public function getPlace() { return $this->getField('place'); } /** * Returns a link to this album on Facebook. * * @return string|null */ public function getLink() { return $this->getField('link'); } /** * Returns the textual location of the album. * * @return string|null */ public function getLocation() { return $this->getField('location'); } /** * Returns the title of the album. * * @return string|null */ public function getName() { return $this->getField('name'); } /** * Returns the privacy settings for the album. * * @return string|null */ public function getPrivacy() { return $this->getField('privacy'); } /** * Returns the type of the album. * * enum{ profile, mobile, wall, normal, album } * * @return string|null */ public function getType() { return $this->getField('type'); } } eOd  {FsmartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphApplication.php obgetField('id'); } } ףc %p&EsmartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphCoverPhoto.php obgetField('id'); } /** * Returns the source of cover if it exists * * @return string|null */ public function getSource() { return $this->getField('source'); } /** * Returns the offset_x of cover if it exists * * @return int|null */ public function getOffsetX() { return $this->getField('offset_x'); } /** * Returns the offset_y of cover if it exists * * @return int|null */ public function getOffsetY() { return $this->getField('offset_y'); } } wA] 55`?smartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphEdge.php obrequest = $request; $this->metaData = $metaData; $this->parentEdgeEndpoint = $parentEdgeEndpoint; $this->subclassName = $subclassName; parent::__construct($data); } /** * Gets the parent Graph edge endpoint that generated the list. * * @return string|null */ public function getParentGraphEdge() { return $this->parentEdgeEndpoint; } /** * Gets the subclass name that the child GraphNode's are cast as. * * @return string|null */ public function getSubClassName() { return $this->subclassName; } /** * Returns the raw meta data associated with this GraphEdge. * * @return array */ public function getMetaData() { return $this->metaData; } /** * Returns the next cursor if it exists. * * @return string|null */ public function getNextCursor() { return $this->getCursor('after'); } /** * Returns the previous cursor if it exists. * * @return string|null */ public function getPreviousCursor() { return $this->getCursor('before'); } /** * Returns the cursor for a specific direction if it exists. * * @param string $direction The direction of the page: after|before * * @return string|null */ public function getCursor($direction) { if (isset($this->metaData['paging']['cursors'][$direction])) { return $this->metaData['paging']['cursors'][$direction]; } return null; } /** * Generates a pagination URL based on a cursor. * * @param string $direction The direction of the page: next|previous * * @return string|null * * @throws FacebookSDKException */ public function getPaginationUrl($direction) { $this->validateForPagination(); // Do we have a paging URL? if (!isset($this->metaData['paging'][$direction])) { return null; } $pageUrl = $this->metaData['paging'][$direction]; return FacebookUrlManipulator::baseGraphUrlEndpoint($pageUrl); } /** * Validates whether or not we can paginate on this request. * * @throws FacebookSDKException */ public function validateForPagination() { if ($this->request->getMethod() !== 'GET') { throw new FacebookSDKException('You can only paginate on a GET request.', 720); } } /** * Gets the request object needed to make a next|previous page request. * * @param string $direction The direction of the page: next|previous * * @return FacebookRequest|null * * @throws FacebookSDKException */ public function getPaginationRequest($direction) { $pageUrl = $this->getPaginationUrl($direction); if (!$pageUrl) { return null; } $newRequest = clone $this->request; $newRequest->setEndpoint($pageUrl); return $newRequest; } /** * Gets the request object needed to make a "next" page request. * * @return FacebookRequest|null * * @throws FacebookSDKException */ public function getNextPageRequest() { return $this->getPaginationRequest('next'); } /** * Gets the request object needed to make a "previous" page request. * * @return FacebookRequest|null * * @throws FacebookSDKException */ public function getPreviousPageRequest() { return $this->getPaginationRequest('previous'); } /** * The total number of results according to Graph if it exists. * * This will be returned if the summary=true modifier is present in the request. * * @return int|null */ public function getTotalCount() { if (isset($this->metaData['summary']['total_count'])) { return $this->metaData['summary']['total_count']; } return null; } /** * @inheritDoc */ public function map(\Closure $callback) { return new static( $this->request, array_map($callback, $this->items, array_keys($this->items)), $this->metaData, $this->parentEdgeEndpoint, $this->subclassName ); } } 1^ //M@smartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphEvent.php ob '\Facebook\GraphNodes\GraphCoverPhoto', 'place' => '\Facebook\GraphNodes\GraphPage', 'picture' => '\Facebook\GraphNodes\GraphPicture', 'parent_group' => '\Facebook\GraphNodes\GraphGroup', ]; /** * Returns the `id` (The event ID) as string if present. * * @return string|null */ public function getId() { return $this->getField('id'); } /** * Returns the `cover` (Cover picture) as GraphCoverPhoto if present. * * @return GraphCoverPhoto|null */ public function getCover() { return $this->getField('cover'); } /** * Returns the `description` (Long-form description) as string if present. * * @return string|null */ public function getDescription() { return $this->getField('description'); } /** * Returns the `end_time` (End time, if one has been set) as DateTime if present. * * @return \DateTime|null */ public function getEndTime() { return $this->getField('end_time'); } /** * Returns the `is_date_only` (Whether the event only has a date specified, but no time) as bool if present. * * @return bool|null */ public function getIsDateOnly() { return $this->getField('is_date_only'); } /** * Returns the `name` (Event name) as string if present. * * @return string|null */ public function getName() { return $this->getField('name'); } /** * Returns the `owner` (The profile that created the event) as GraphNode if present. * * @return GraphNode|null */ public function getOwner() { return $this->getField('owner'); } /** * Returns the `parent_group` (The group the event belongs to) as GraphGroup if present. * * @return GraphGroup|null */ public function getParentGroup() { return $this->getField('parent_group'); } /** * Returns the `place` (Event Place information) as GraphPage if present. * * @return GraphPage|null */ public function getPlace() { return $this->getField('place'); } /** * Returns the `privacy` (Who can see the event) as string if present. * * @return string|null */ public function getPrivacy() { return $this->getField('privacy'); } /** * Returns the `start_time` (Start time) as DateTime if present. * * @return \DateTime|null */ public function getStartTime() { return $this->getField('start_time'); } /** * Returns the `ticket_uri` (The link users can visit to buy a ticket to this event) as string if present. * * @return string|null */ public function getTicketUri() { return $this->getField('ticket_uri'); } /** * Returns the `timezone` (Timezone) as string if present. * * @return string|null */ public function getTimezone() { return $this->getField('timezone'); } /** * Returns the `updated_time` (Last update time) as DateTime if present. * * @return \DateTime|null */ public function getUpdatedTime() { return $this->getField('updated_time'); } /** * Returns the `picture` (Event picture) as GraphPicture if present. * * @return GraphPicture|null */ public function getPicture() { return $this->getField('picture'); } /** * Returns the `attending_count` (Number of people attending the event) as int if present. * * @return int|null */ public function getAttendingCount() { return $this->getField('attending_count'); } /** * Returns the `declined_count` (Number of people who declined the event) as int if present. * * @return int|null */ public function getDeclinedCount() { return $this->getField('declined_count'); } /** * Returns the `maybe_count` (Number of people who maybe going to the event) as int if present. * * @return int|null */ public function getMaybeCount() { return $this->getField('maybe_count'); } /** * Returns the `noreply_count` (Number of people who did not reply to the event) as int if present. * * @return int|null */ public function getNoreplyCount() { return $this->getField('noreply_count'); } /** * Returns the `invited_count` (Number of people invited to the event) as int if present. * * @return int|null */ public function getInvitedCount() { return $this->getField('invited_count'); } } ³^ ##>Y@smartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphGroup.php ob '\Facebook\GraphNodes\GraphCoverPhoto', 'venue' => '\Facebook\GraphNodes\GraphLocation', ]; /** * Returns the `id` (The Group ID) as string if present. * * @return string|null */ public function getId() { return $this->getField('id'); } /** * Returns the `cover` (The cover photo of the Group) as GraphCoverPhoto if present. * * @return GraphCoverPhoto|null */ public function getCover() { return $this->getField('cover'); } /** * Returns the `description` (A brief description of the Group) as string if present. * * @return string|null */ public function getDescription() { return $this->getField('description'); } /** * Returns the `email` (The email address to upload content to the Group. Only current members of the Group can use this) as string if present. * * @return string|null */ public function getEmail() { return $this->getField('email'); } /** * Returns the `icon` (The URL for the Group's icon) as string if present. * * @return string|null */ public function getIcon() { return $this->getField('icon'); } /** * Returns the `link` (The Group's website) as string if present. * * @return string|null */ public function getLink() { return $this->getField('link'); } /** * Returns the `name` (The name of the Group) as string if present. * * @return string|null */ public function getName() { return $this->getField('name'); } /** * Returns the `member_request_count` (Number of people asking to join the group.) as int if present. * * @return int|null */ public function getMemberRequestCount() { return $this->getField('member_request_count'); } /** * Returns the `owner` (The profile that created this Group) as GraphNode if present. * * @return GraphNode|null */ public function getOwner() { return $this->getField('owner'); } /** * Returns the `parent` (The parent Group of this Group, if it exists) as GraphNode if present. * * @return GraphNode|null */ public function getParent() { return $this->getField('parent'); } /** * Returns the `privacy` (The privacy setting of the Group) as string if present. * * @return string|null */ public function getPrivacy() { return $this->getField('privacy'); } /** * Returns the `updated_time` (The last time the Group was updated (this includes changes in the Group's properties and changes in posts and comments if user can see them)) as \DateTime if present. * * @return \DateTime|null */ public function getUpdatedTime() { return $this->getField('updated_time'); } /** * Returns the `venue` (The location for the Group) as GraphLocation if present. * * @return GraphLocation|null */ public function getVenue() { return $this->getField('venue'); } } (]  WV%?smartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphList.php obgetField('street'); } /** * Returns the city component of the location * * @return string|null */ public function getCity() { return $this->getField('city'); } /** * Returns the state component of the location * * @return string|null */ public function getState() { return $this->getField('state'); } /** * Returns the country component of the location * * @return string|null */ public function getCountry() { return $this->getField('country'); } /** * Returns the zipcode component of the location * * @return string|null */ public function getZip() { return $this->getField('zip'); } /** * Returns the latitude component of the location * * @return float|null */ public function getLatitude() { return $this->getField('latitude'); } /** * Returns the street component of the location * * @return float|null */ public function getLongitude() { return $this->getField('longitude'); } } C] **{9mk?smartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphNode.php obcastItems($data)); } /** * Iterates over an array and detects the types each node * should be cast to and returns all the items as an array. * * @TODO Add auto-casting to AccessToken entities. * * @param array $data The array to iterate over. * * @return array */ public function castItems(array $data) { $items = []; foreach ($data as $k => $v) { if ($this->shouldCastAsDateTime($k) && (is_numeric($v) || $this->isIso8601DateString($v)) ) { $items[$k] = $this->castToDateTime($v); } elseif ($k === 'birthday') { $items[$k] = $this->castToBirthday($v); } else { $items[$k] = $v; } } return $items; } /** * Uncasts any auto-casted datatypes. * Basically the reverse of castItems(). * * @return array */ public function uncastItems() { $items = $this->asArray(); return array_map(function ($v) { if ($v instanceof \DateTime) { return $v->format(\DateTime::ISO8601); } return $v; }, $items); } /** * Get the collection of items as JSON. * * @param int $options * * @return string */ public function asJson($options = 0) { return json_encode($this->uncastItems(), $options); } /** * Detects an ISO 8601 formatted string. * * @param string $string * * @return boolean * * @see https://developers.facebook.com/docs/graph-api/using-graph-api/#readmodifiers * @see http://www.cl.cam.ac.uk/~mgk25/iso-time.html * @see http://en.wikipedia.org/wiki/ISO_8601 */ public function isIso8601DateString($string) { // This insane regex was yoinked from here: // http://www.pelagodesign.com/blog/2009/05/20/iso-8601-date-validation-that-doesnt-suck/ // ...and I'm all like: // http://thecodinglove.com/post/95378251969/when-code-works-and-i-dont-know-why $crazyInsaneRegexThatSomehowDetectsIso8601 = '/^([\+-]?\d{4}(?!\d{2}\b))' . '((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?' . '|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d' . '|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])' . '((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d' . '([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/'; return preg_match($crazyInsaneRegexThatSomehowDetectsIso8601, $string) === 1; } /** * Determines if a value from Graph should be cast to DateTime. * * @param string $key * * @return boolean */ public function shouldCastAsDateTime($key) { return in_array($key, [ 'created_time', 'updated_time', 'start_time', 'end_time', 'backdated_time', 'issued_at', 'expires_at', 'publish_time' ], true); } /** * Casts a date value from Graph to DateTime. * * @param int|string $value * * @return \DateTime */ public function castToDateTime($value) { if (is_int($value)) { $dt = new \DateTime(); $dt->setTimestamp($value); } else { $dt = new \DateTime($value); } return $dt; } /** * Casts a birthday value from Graph to Birthday * * @param string $value * * @return Birthday */ public function castToBirthday($value) { return new Birthday($value); } /** * Getter for $graphObjectMap. * * @return array */ public static function getObjectMap() { return static::$graphObjectMap; } } Ɏ,d aa^)FsmartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphNodeFactory.php obresponse = $response; $this->decodedBody = $response->getDecodedBody(); } /** * Tries to convert a FacebookResponse entity into a GraphNode. * * @param string|null $subclassName The GraphNode sub class to cast to. * * @return GraphNode * * @throws FacebookSDKException */ public function makeGraphNode($subclassName = null) { $this->validateResponseAsArray(); $this->validateResponseCastableAsGraphNode(); return $this->castAsGraphNodeOrGraphEdge($this->decodedBody, $subclassName); } /** * Convenience method for creating a GraphAchievement collection. * * @return GraphAchievement * * @throws FacebookSDKException */ public function makeGraphAchievement() { return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphAchievement'); } /** * Convenience method for creating a GraphAlbum collection. * * @return GraphAlbum * * @throws FacebookSDKException */ public function makeGraphAlbum() { return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphAlbum'); } /** * Convenience method for creating a GraphPage collection. * * @return GraphPage * * @throws FacebookSDKException */ public function makeGraphPage() { return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphPage'); } /** * Convenience method for creating a GraphSessionInfo collection. * * @return GraphSessionInfo * * @throws FacebookSDKException */ public function makeGraphSessionInfo() { return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphSessionInfo'); } /** * Convenience method for creating a GraphUser collection. * * @return GraphUser * * @throws FacebookSDKException */ public function makeGraphUser() { return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphUser'); } /** * Convenience method for creating a GraphEvent collection. * * @return GraphEvent * * @throws FacebookSDKException */ public function makeGraphEvent() { return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphEvent'); } /** * Convenience method for creating a GraphGroup collection. * * @return GraphGroup * * @throws FacebookSDKException */ public function makeGraphGroup() { return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphGroup'); } /** * Tries to convert a FacebookResponse entity into a GraphEdge. * * @param string|null $subclassName The GraphNode sub class to cast the list items to. * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. * * @return GraphEdge * * @throws FacebookSDKException */ public function makeGraphEdge($subclassName = null, $auto_prefix = true) { $this->validateResponseAsArray(); $this->validateResponseCastableAsGraphEdge(); if ($subclassName && $auto_prefix) { $subclassName = static::BASE_GRAPH_OBJECT_PREFIX . $subclassName; } return $this->castAsGraphNodeOrGraphEdge($this->decodedBody, $subclassName); } /** * Validates the decoded body. * * @throws FacebookSDKException */ public function validateResponseAsArray() { if (!is_array($this->decodedBody)) { throw new FacebookSDKException('Unable to get response from Graph as array.', 620); } } /** * Validates that the return data can be cast as a GraphNode. * * @throws FacebookSDKException */ public function validateResponseCastableAsGraphNode() { if (isset($this->decodedBody['data']) && static::isCastableAsGraphEdge($this->decodedBody['data'])) { throw new FacebookSDKException( 'Unable to convert response from Graph to a GraphNode because the response looks like a GraphEdge. Try using GraphNodeFactory::makeGraphEdge() instead.', 620 ); } } /** * Validates that the return data can be cast as a GraphEdge. * * @throws FacebookSDKException */ public function validateResponseCastableAsGraphEdge() { if (!(isset($this->decodedBody['data']) && static::isCastableAsGraphEdge($this->decodedBody['data']))) { throw new FacebookSDKException( 'Unable to convert response from Graph to a GraphEdge because the response does not look like a GraphEdge. Try using GraphNodeFactory::makeGraphNode() instead.', 620 ); } } /** * Safely instantiates a GraphNode of $subclassName. * * @param array $data The array of data to iterate over. * @param string|null $subclassName The subclass to cast this collection to. * * @return GraphNode * * @throws FacebookSDKException */ public function safelyMakeGraphNode(array $data, $subclassName = null) { $subclassName = $subclassName ?: static::BASE_GRAPH_NODE_CLASS; static::validateSubclass($subclassName); // Remember the parent node ID $parentNodeId = isset($data['id']) ? $data['id'] : null; $items = []; foreach ($data as $k => $v) { // Array means could be recurable if (is_array($v)) { // Detect any smart-casting from the $graphObjectMap array. // This is always empty on the GraphNode collection, but subclasses can define // their own array of smart-casting types. $graphObjectMap = $subclassName::getObjectMap(); $objectSubClass = isset($graphObjectMap[$k]) ? $graphObjectMap[$k] : null; // Could be a GraphEdge or GraphNode $items[$k] = $this->castAsGraphNodeOrGraphEdge($v, $objectSubClass, $k, $parentNodeId); } else { $items[$k] = $v; } } return new $subclassName($items); } /** * Takes an array of values and determines how to cast each node. * * @param array $data The array of data to iterate over. * @param string|null $subclassName The subclass to cast this collection to. * @param string|null $parentKey The key of this data (Graph edge). * @param string|null $parentNodeId The parent Graph node ID. * * @return GraphNode|GraphEdge * * @throws FacebookSDKException */ public function castAsGraphNodeOrGraphEdge(array $data, $subclassName = null, $parentKey = null, $parentNodeId = null) { if (isset($data['data'])) { // Create GraphEdge if (static::isCastableAsGraphEdge($data['data'])) { return $this->safelyMakeGraphEdge($data, $subclassName, $parentKey, $parentNodeId); } // Sometimes Graph is a weirdo and returns a GraphNode under the "data" key $data = $data['data']; } // Create GraphNode return $this->safelyMakeGraphNode($data, $subclassName); } /** * Return an array of GraphNode's. * * @param array $data The array of data to iterate over. * @param string|null $subclassName The GraphNode subclass to cast each item in the list to. * @param string|null $parentKey The key of this data (Graph edge). * @param string|null $parentNodeId The parent Graph node ID. * * @return GraphEdge * * @throws FacebookSDKException */ public function safelyMakeGraphEdge(array $data, $subclassName = null, $parentKey = null, $parentNodeId = null) { if (!isset($data['data'])) { throw new FacebookSDKException('Cannot cast data to GraphEdge. Expected a "data" key.', 620); } $dataList = []; foreach ($data['data'] as $graphNode) { $dataList[] = $this->safelyMakeGraphNode($graphNode, $subclassName); } $metaData = $this->getMetaData($data); // We'll need to make an edge endpoint for this in case it's a GraphEdge (for cursor pagination) $parentGraphEdgeEndpoint = $parentNodeId && $parentKey ? '/' . $parentNodeId . '/' . $parentKey : null; $className = static::BASE_GRAPH_EDGE_CLASS; return new $className($this->response->getRequest(), $dataList, $metaData, $parentGraphEdgeEndpoint, $subclassName); } /** * Get the meta data from a list in a Graph response. * * @param array $data The Graph response. * * @return array */ public function getMetaData(array $data) { unset($data['data']); return $data; } /** * Determines whether or not the data should be cast as a GraphEdge. * * @param array $data * * @return boolean */ public static function isCastableAsGraphEdge(array $data) { if ($data === []) { return true; } // Checks for a sequential numeric array which would be a GraphEdge return array_keys($data) === range(0, count($data) - 1); } /** * Ensures that the subclass in question is valid. * * @param string $subclassName The GraphNode subclass to validate. * * @throws FacebookSDKException */ public static function validateSubclass($subclassName) { if ($subclassName == static::BASE_GRAPH_NODE_CLASS || is_subclass_of($subclassName, static::BASE_GRAPH_NODE_CLASS)) { return; } throw new FacebookSDKException('The given subclass "' . $subclassName . '" is not valid. Cannot cast to an object that is not a GraphNode subclass.', 620); } } `x+_  nπAsmartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphObject.php obmakeGraphNode($subclassName); } /** * Convenience method for creating a GraphEvent collection. * * @return GraphEvent * * @throws FacebookSDKException */ public function makeGraphEvent() { return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphEvent'); } /** * Tries to convert a FacebookResponse entity into a GraphEdge. * * @param string|null $subclassName The GraphNode sub class to cast the list items to. * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. * * @return GraphEdge * * @deprecated 5.0.0 GraphObjectFactory has been renamed to GraphNodeFactory */ public function makeGraphList($subclassName = null, $auto_prefix = true) { return $this->makeGraphEdge($subclassName, $auto_prefix); } } jό] U?smartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphPage.php ob '\Facebook\GraphNodes\GraphPage', 'global_brand_parent_page' => '\Facebook\GraphNodes\GraphPage', 'location' => '\Facebook\GraphNodes\GraphLocation', 'cover' => '\Facebook\GraphNodes\GraphCoverPhoto', 'picture' => '\Facebook\GraphNodes\GraphPicture', ]; /** * Returns the ID for the user's page as a string if present. * * @return string|null */ public function getId() { return $this->getField('id'); } /** * Returns the Category for the user's page as a string if present. * * @return string|null */ public function getCategory() { return $this->getField('category'); } /** * Returns the Name of the user's page as a string if present. * * @return string|null */ public function getName() { return $this->getField('name'); } /** * Returns the best available Page on Facebook. * * @return GraphPage|null */ public function getBestPage() { return $this->getField('best_page'); } /** * Returns the brand's global (parent) Page. * * @return GraphPage|null */ public function getGlobalBrandParentPage() { return $this->getField('global_brand_parent_page'); } /** * Returns the location of this place. * * @return GraphLocation|null */ public function getLocation() { return $this->getField('location'); } /** * Returns CoverPhoto of the Page. * * @return GraphCoverPhoto|null */ public function getCover() { return $this->getField('cover'); } /** * Returns Picture of the Page. * * @return GraphPicture|null */ public function getPicture() { return $this->getField('picture'); } /** * Returns the page access token for the admin user. * * Only available in the `/me/accounts` context. * * @return string|null */ public function getAccessToken() { return $this->getField('access_token'); } /** * Returns the roles of the page admin user. * * Only available in the `/me/accounts` context. * * @return array|null */ public function getPerms() { return $this->getField('perms'); } } !|` 73wBsmartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphPicture.php obgetField('is_silhouette'); } /** * Returns the url of user picture if it exists * * @return string|null */ public function getUrl() { return $this->getField('url'); } /** * Returns the width of user picture if it exists * * @return int|null */ public function getWidth() { return $this->getField('width'); } /** * Returns the height of user picture if it exists * * @return int|null */ public function getHeight() { return $this->getField('height'); } } 6 d '!fFsmartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphSessionInfo.php obgetField('app_id'); } /** * Returns the application name the token was issued for. * * @return string|null */ public function getApplication() { return $this->getField('application'); } /** * Returns the date & time that the token expires. * * @return \DateTime|null */ public function getExpiresAt() { return $this->getField('expires_at'); } /** * Returns whether the token is valid. * * @return boolean */ public function getIsValid() { return $this->getField('is_valid'); } /** * Returns the date & time the token was issued at. * * @return \DateTime|null */ public function getIssuedAt() { return $this->getField('issued_at'); } /** * Returns the scope permissions associated with the token. * * @return array */ public function getScopes() { return $this->getField('scopes'); } /** * Returns the login id of the user associated with the token. * * @return string|null */ public function getUserId() { return $this->getField('user_id'); } } ]B]  Ẁ?smartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphUser.php ob '\Facebook\GraphNodes\GraphPage', 'location' => '\Facebook\GraphNodes\GraphPage', 'significant_other' => '\Facebook\GraphNodes\GraphUser', 'picture' => '\Facebook\GraphNodes\GraphPicture', ]; /** * Returns the ID for the user as a string if present. * * @return string|null */ public function getId() { return $this->getField('id'); } /** * Returns the name for the user as a string if present. * * @return string|null */ public function getName() { return $this->getField('name'); } /** * Returns the first name for the user as a string if present. * * @return string|null */ public function getFirstName() { return $this->getField('first_name'); } /** * Returns the middle name for the user as a string if present. * * @return string|null */ public function getMiddleName() { return $this->getField('middle_name'); } /** * Returns the last name for the user as a string if present. * * @return string|null */ public function getLastName() { return $this->getField('last_name'); } /** * Returns the email for the user as a string if present. * * @return string|null */ public function getEmail() { return $this->getField('email'); } /** * Returns the gender for the user as a string if present. * * @return string|null */ public function getGender() { return $this->getField('gender'); } /** * Returns the Facebook URL for the user as a string if available. * * @return string|null */ public function getLink() { return $this->getField('link'); } /** * Returns the users birthday, if available. * * @return \DateTime|null */ public function getBirthday() { return $this->getField('birthday'); } /** * Returns the current location of the user as a GraphPage. * * @return GraphPage|null */ public function getLocation() { return $this->getField('location'); } /** * Returns the current location of the user as a GraphPage. * * @return GraphPage|null */ public function getHometown() { return $this->getField('hometown'); } /** * Returns the current location of the user as a GraphUser. * * @return GraphUser|null */ public function getSignificantOther() { return $this->getField('significant_other'); } /** * Returns the picture of the user as a GraphPicture * * @return GraphPicture|null */ public function getPicture() { return $this->getField('picture'); } } +e  +FGsmartSEO/lib/scripts/facebook-v5-5.0.0/Helpers/FacebookCanvasHelper.php obsignedRequest ? $this->signedRequest->get('app_data') : null; } /** * Get raw signed request from POST. * * @return string|null */ public function getRawSignedRequest() { return $this->getRawSignedRequestFromPost() ?: null; } } i  R䊆KsmartSEO/lib/scripts/facebook-v5-5.0.0/Helpers/FacebookJavaScriptHelper.php obgetRawSignedRequestFromCookie(); } } f LHsmartSEO/lib/scripts/facebook-v5-5.0.0/Helpers/FacebookPageTabHelper.php obsignedRequest) { return; } $this->pageData = $this->signedRequest->get('page'); } /** * Returns a value from the page data. * * @param string $key * @param mixed|null $default * * @return mixed|null */ public function getPageData($key, $default = null) { if (isset($this->pageData[$key])) { return $this->pageData[$key]; } return $default; } /** * Returns true if the user is an admin. * * @return boolean */ public function isAdmin() { return $this->getPageData('admin') === true; } /** * Returns the page id if available. * * @return string|null */ public function getPageId() { return $this->getPageData('id'); } } ol UUxNsmartSEO/lib/scripts/facebook-v5-5.0.0/Helpers/FacebookRedirectLoginHelper.php oboAuth2Client = $oAuth2Client; $this->persistentDataHandler = $persistentDataHandler ?: new FacebookSessionPersistentDataHandler(); $this->urlDetectionHandler = $urlHandler ?: new FacebookUrlDetectionHandler(); $this->pseudoRandomStringGenerator = PseudoRandomStringGeneratorFactory::createPseudoRandomStringGenerator($prsg); } /** * Returns the persistent data handler. * * @return PersistentDataInterface */ public function getPersistentDataHandler() { return $this->persistentDataHandler; } /** * Returns the URL detection handler. * * @return UrlDetectionInterface */ public function getUrlDetectionHandler() { return $this->urlDetectionHandler; } /** * Returns the cryptographically secure pseudo-random string generator. * * @return PseudoRandomStringGeneratorInterface */ public function getPseudoRandomStringGenerator() { return $this->pseudoRandomStringGenerator; } /** * Stores CSRF state and returns a URL to which the user should be sent to in order to continue the login process with Facebook. * * @param string $redirectUrl The URL Facebook should redirect users to after login. * @param array $scope List of permissions to request during login. * @param array $params An array of parameters to generate URL. * @param string $separator The separator to use in http_build_query(). * * @return string */ private function makeUrl($redirectUrl, array $scope, array $params = [], $separator = '&') { $state = $this->persistentDataHandler->get('state') ?: $this->pseudoRandomStringGenerator->getPseudoRandomString(static::CSRF_LENGTH); $this->persistentDataHandler->set('state', $state); return $this->oAuth2Client->getAuthorizationUrl($redirectUrl, $state, $scope, $params, $separator); } /** * Returns the URL to send the user in order to login to Facebook. * * @param string $redirectUrl The URL Facebook should redirect users to after login. * @param array $scope List of permissions to request during login. * @param string $separator The separator to use in http_build_query(). * * @return string */ public function getLoginUrl($redirectUrl, array $scope = [], $separator = '&') { return $this->makeUrl($redirectUrl, $scope, [], $separator); } /** * Returns the URL to send the user in order to log out of Facebook. * * @param AccessToken|string $accessToken The access token that will be logged out. * @param string $next The url Facebook should redirect the user to after a successful logout. * @param string $separator The separator to use in http_build_query(). * * @return string * * @throws FacebookSDKException */ public function getLogoutUrl($accessToken, $next, $separator = '&') { if (!$accessToken instanceof AccessToken) { $accessToken = new AccessToken($accessToken); } if ($accessToken->isAppAccessToken()) { throw new FacebookSDKException('Cannot generate a logout URL with an app access token.', 722); } $params = [ 'next' => $next, 'access_token' => $accessToken->getValue(), ]; return 'https://www.facebook.com/logout.php?' . http_build_query($params, null, $separator); } /** * Returns the URL to send the user in order to login to Facebook with permission(s) to be re-asked. * * @param string $redirectUrl The URL Facebook should redirect users to after login. * @param array $scope List of permissions to request during login. * @param string $separator The separator to use in http_build_query(). * * @return string */ public function getReRequestUrl($redirectUrl, array $scope = [], $separator = '&') { $params = ['auth_type' => 'rerequest']; return $this->makeUrl($redirectUrl, $scope, $params, $separator); } /** * Returns the URL to send the user in order to login to Facebook with user to be re-authenticated. * * @param string $redirectUrl The URL Facebook should redirect users to after login. * @param array $scope List of permissions to request during login. * @param string $separator The separator to use in http_build_query(). * * @return string */ public function getReAuthenticationUrl($redirectUrl, array $scope = [], $separator = '&') { $params = ['auth_type' => 'reauthenticate']; return $this->makeUrl($redirectUrl, $scope, $params, $separator); } /** * Takes a valid code from a login redirect, and returns an AccessToken entity. * * @param string|null $redirectUrl The redirect URL. * * @return AccessToken|null * * @throws FacebookSDKException */ public function getAccessToken($redirectUrl = null) { if (!$code = $this->getCode()) { return null; } $this->validateCsrf(); $this->resetCsrf(); $redirectUrl = $redirectUrl ?: $this->urlDetectionHandler->getCurrentUrl(); // At minimum we need to remove the state param $redirectUrl = FacebookUrlManipulator::removeParamsFromUrl($redirectUrl, ['state']); return $this->oAuth2Client->getAccessTokenFromCode($code, $redirectUrl); } /** * Validate the request against a cross-site request forgery. * * @throws FacebookSDKException */ protected function validateCsrf() { $state = $this->getState(); if (!$state) { throw new FacebookSDKException('Cross-site request forgery validation failed. Required GET param "state" missing.'); } $savedState = $this->persistentDataHandler->get('state'); if (!$savedState) { throw new FacebookSDKException('Cross-site request forgery validation failed. Required param "state" missing from persistent data.'); } if (\hash_equals($savedState, $state)) { return; } throw new FacebookSDKException('Cross-site request forgery validation failed. The "state" param from the URL and session do not match.'); } /** * Resets the CSRF so that it doesn't get reused. */ private function resetCsrf() { $this->persistentDataHandler->set('state', null); } /** * Return the code. * * @return string|null */ protected function getCode() { return $this->getInput('code'); } /** * Return the state. * * @return string|null */ protected function getState() { return $this->getInput('state'); } /** * Return the error code. * * @return string|null */ public function getErrorCode() { return $this->getInput('error_code'); } /** * Returns the error. * * @return string|null */ public function getError() { return $this->getInput('error'); } /** * Returns the error reason. * * @return string|null */ public function getErrorReason() { return $this->getInput('error_reason'); } /** * Returns the error description. * * @return string|null */ public function getErrorDescription() { return $this->getInput('error_description'); } /** * Returns a value from a GET param. * * @param string $key * * @return string|null */ private function getInput($key) { return isset($_GET[$key]) ? $_GET[$key] : null; } } Ou $$ "WsmartSEO/lib/scripts/facebook-v5-5.0.0/Helpers/FacebookSignedRequestFromInputHelper.php obapp = $app; $graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION; $this->oAuth2Client = new OAuth2Client($this->app, $client, $graphVersion); $this->instantiateSignedRequest(); } /** * Instantiates a new SignedRequest entity. * * @param string|null */ public function instantiateSignedRequest($rawSignedRequest = null) { $rawSignedRequest = $rawSignedRequest ?: $this->getRawSignedRequest(); if (!$rawSignedRequest) { return; } $this->signedRequest = new SignedRequest($this->app, $rawSignedRequest); } /** * Returns an AccessToken entity from the signed request. * * @return AccessToken|null * * @throws \Facebook\Exceptions\FacebookSDKException */ public function getAccessToken() { if ($this->signedRequest && $this->signedRequest->hasOAuthData()) { $code = $this->signedRequest->get('code'); $accessToken = $this->signedRequest->get('oauth_token'); if ($code && !$accessToken) { return $this->oAuth2Client->getAccessTokenFromCode($code); } $expiresAt = $this->signedRequest->get('expires', 0); return new AccessToken($accessToken, $expiresAt); } return null; } /** * Returns the SignedRequest entity. * * @return SignedRequest|null */ public function getSignedRequest() { return $this->signedRequest; } /** * Returns the user_id if available. * * @return string|null */ public function getUserId() { return $this->signedRequest ? $this->signedRequest->getUserId() : null; } /** * Get raw signed request from input. * * @return string|null */ abstract public function getRawSignedRequest(); /** * Get raw signed request from POST input. * * @return string|null */ public function getRawSignedRequestFromPost() { if (isset($_POST['signed_request'])) { return $_POST['signed_request']; } return null; } /** * Get raw signed request from cookie set from the Javascript SDK. * * @return string|null */ public function getRawSignedRequestFromCookie() { if (isset($_COOKIE['fbsr_' . $this->app->getId()])) { return $_COOKIE['fbsr_' . $this->app->getId()]; } return null; } } yRu^ ̀@smartSEO/lib/scripts/facebook-v5-5.0.0/Http/GraphRawResponse.php obhttpResponseCode = (int)$httpStatusCode; } if (is_array($headers)) { $this->headers = $headers; } else { $this->setHeadersFromString($headers); } $this->body = $body; } /** * Return the response headers. * * @return array */ public function getHeaders() { return $this->headers; } /** * Return the body of the response. * * @return string */ public function getBody() { return $this->body; } /** * Return the HTTP response code. * * @return int */ public function getHttpResponseCode() { return $this->httpResponseCode; } /** * Sets the HTTP response code from a raw header. * * @param string $rawResponseHeader */ public function setHttpResponseCodeFromHeader($rawResponseHeader) { preg_match('|HTTP/\d\.\d\s+(\d+)\s+.*|', $rawResponseHeader, $match); $this->httpResponseCode = (int)$match[1]; } /** * Parse the raw headers and set as an array. * * @param string $rawHeaders The raw headers from the response. */ protected function setHeadersFromString($rawHeaders) { // Normalize line breaks $rawHeaders = str_replace("\r\n", "\n", $rawHeaders); // There will be multiple headers if a 301 was followed // or a proxy was followed, etc $headerCollection = explode("\n\n", trim($rawHeaders)); // We just want the last response (at the end) $rawHeader = array_pop($headerCollection); $headerComponents = explode("\n", $rawHeader); foreach ($headerComponents as $line) { if (strpos($line, ': ') === false) { $this->setHttpResponseCodeFromHeader($line); } else { list($key, $value) = explode(': ', $line, 2); $this->headers[$key] = $value; } } } } b  DsmartSEO/lib/scripts/facebook-v5-5.0.0/Http/RequestBodyInterface.php obparams = $params; $this->files = $files; $this->boundary = $boundary ?: uniqid(); } /** * @inheritdoc */ public function getBody() { $body = ''; // Compile normal params $params = $this->getNestedParams($this->params); foreach ($params as $k => $v) { $body .= $this->getParamString($k, $v); } // Compile files foreach ($this->files as $k => $v) { $body .= $this->getFileString($k, $v); } // Peace out $body .= "--{$this->boundary}--\r\n"; return $body; } /** * Get the boundary * * @return string */ public function getBoundary() { return $this->boundary; } /** * Get the string needed to transfer a file. * * @param string $name * @param FacebookFile $file * * @return string */ private function getFileString($name, FacebookFile $file) { return sprintf( "--%s\r\nContent-Disposition: form-data; name=\"%s\"; filename=\"%s\"%s\r\n\r\n%s\r\n", $this->boundary, $name, $file->getFileName(), $this->getFileHeaders($file), $file->getContents() ); } /** * Get the string needed to transfer a POST field. * * @param string $name * @param string $value * * @return string */ private function getParamString($name, $value) { return sprintf( "--%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n", $this->boundary, $name, $value ); } /** * Returns the params as an array of nested params. * * @param array $params * * @return array */ private function getNestedParams(array $params) { $query = http_build_query($params, null, '&'); $params = explode('&', $query); $result = []; foreach ($params as $param) { list($key, $value) = explode('=', $param, 2); $result[urldecode($key)] = urldecode($value); } return $result; } /** * Get the headers needed before transferring the content of a POST file. * * @param FacebookFile $file * * @return string */ protected function getFileHeaders(FacebookFile $file) { return "\r\nContent-Type: {$file->getMimetype()}"; } } c  ;sEsmartSEO/lib/scripts/facebook-v5-5.0.0/Http/RequestBodyUrlEncoded.php obparams = $params; } /** * @inheritdoc */ public function getBody() { return http_build_query($this->params, null, '&'); } } curl = curl_init(); } /** * Set a curl option * * @param $key * @param $value */ public function setopt($key, $value) { curl_setopt($this->curl, $key, $value); } /** * Set an array of options to a curl resource * * @param array $options */ public function setoptArray(array $options) { curl_setopt_array($this->curl, $options); } /** * Send a curl request * * @return mixed */ public function exec() { return curl_exec($this->curl); } /** * Return the curl error number * * @return int */ public function errno() { return curl_errno($this->curl); } /** * Return the curl error message * * @return string */ public function error() { return curl_error($this->curl); } /** * Get info from a curl reference * * @param $type * * @return mixed */ public function getinfo($type) { return curl_getinfo($this->curl, $type); } /** * Get the currently installed curl version * * @return array */ public function version() { return curl_version(); } /** * Close the resource connection to curl */ public function close() { curl_close($this->curl); } } >Ǔk %%V!MsmartSEO/lib/scripts/facebook-v5-5.0.0/HttpClients/FacebookCurlHttpClient.php obfacebookCurl = $facebookCurl ?: new FacebookCurl(); } /** * @inheritdoc */ public function send($url, $method, $body, array $headers, $timeOut) { $this->openConnection($url, $method, $body, $headers, $timeOut); $this->sendRequest(); if ($curlErrorCode = $this->facebookCurl->errno()) { throw new FacebookSDKException($this->facebookCurl->error(), $curlErrorCode); } // Separate the raw headers from the raw body list($rawHeaders, $rawBody) = $this->extractResponseHeadersAndBody(); $this->closeConnection(); return new GraphRawResponse($rawHeaders, $rawBody); } /** * Opens a new curl connection. * * @param string $url The endpoint to send the request to. * @param string $method The request method. * @param string $body The body of the request. * @param array $headers The request headers. * @param int $timeOut The timeout in seconds for the request. */ public function openConnection($url, $method, $body, array $headers, $timeOut) { $options = [ CURLOPT_CUSTOMREQUEST => $method, CURLOPT_HTTPHEADER => $this->compileRequestHeaders($headers), CURLOPT_URL => $url, CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => $timeOut, CURLOPT_RETURNTRANSFER => true, // Follow 301 redirects CURLOPT_HEADER => true, // Enable header processing CURLOPT_SSL_VERIFYHOST => 2, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_CAINFO => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem', ]; if ($method !== "GET") { $options[CURLOPT_POSTFIELDS] = $body; } $this->facebookCurl->init(); $this->facebookCurl->setoptArray($options); } /** * Closes an existing curl connection */ public function closeConnection() { $this->facebookCurl->close(); } /** * Send the request and get the raw response from curl */ public function sendRequest() { $this->rawResponse = $this->facebookCurl->exec(); } /** * Compiles the request headers into a curl-friendly format. * * @param array $headers The request headers. * * @return array */ public function compileRequestHeaders(array $headers) { $return = []; foreach ($headers as $key => $value) { $return[] = $key . ': ' . $value; } return $return; } /** * Extracts the headers and the body into a two-part array * * @return array */ public function extractResponseHeadersAndBody() { $parts = explode("\r\n\r\n", $this->rawResponse); $rawBody = array_pop($parts); $rawHeaders = implode("\r\n\r\n", $parts); return [trim($rawHeaders), trim($rawBody)]; } } m v]{$OsmartSEO/lib/scripts/facebook-v5-5.0.0/HttpClients/FacebookGuzzleHttpClient.php obguzzleClient = $guzzleClient ?: new Client(); } /** * @inheritdoc */ public function send($url, $method, $body, array $headers, $timeOut) { $options = [ 'headers' => $headers, 'body' => $body, 'timeout' => $timeOut, 'connect_timeout' => 10, 'verify' => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem', ]; $request = $this->guzzleClient->createRequest($method, $url, $options); try { $rawResponse = $this->guzzleClient->send($request); } catch (RequestException $e) { $rawResponse = $e->getResponse(); if ($e->getPrevious() instanceof RingException || !$rawResponse instanceof ResponseInterface) { throw new FacebookSDKException($e->getMessage(), $e->getCode()); } } $rawHeaders = $this->getHeadersAsString($rawResponse); $rawBody = $rawResponse->getBody(); $httpStatusCode = $rawResponse->getStatusCode(); return new GraphRawResponse($rawHeaders, $rawBody, $httpStatusCode); } /** * Returns the Guzzle array of headers as a string. * * @param ResponseInterface $response The Guzzle response. * * @return string */ public function getHeadersAsString(ResponseInterface $response) { $headers = $response->getHeaders(); $rawHeaders = []; foreach ($headers as $name => $values) { $rawHeaders[] = $name . ": " . implode(", ", $values); } return implode("\r\n", $rawHeaders); } } ,p XxRsmartSEO/lib/scripts/facebook-v5-5.0.0/HttpClients/FacebookHttpClientInterface.php obstream = stream_context_create($options); } /** * The response headers from the stream wrapper * * @return array */ public function getResponseHeaders() { return $this->responseHeaders; } /** * Send a stream wrapped request * * @param string $url * * @return mixed */ public function fileGetContents($url) { $rawResponse = file_get_contents($url, false, $this->stream); $this->responseHeaders = $http_response_header ?: []; return $rawResponse; } } 7|m OsmartSEO/lib/scripts/facebook-v5-5.0.0/HttpClients/FacebookStreamHttpClient.php obfacebookStream = $facebookStream ?: new FacebookStream(); } /** * @inheritdoc */ public function send($url, $method, $body, array $headers, $timeOut) { $options = [ 'http' => [ 'method' => $method, 'header' => $this->compileHeader($headers), 'content' => $body, 'timeout' => $timeOut, 'ignore_errors' => true ], 'ssl' => [ 'verify_peer' => true, 'verify_peer_name' => true, 'allow_self_signed' => true, // All root certificates are self-signed 'cafile' => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem', ], ]; $this->facebookStream->streamContextCreate($options); $rawBody = $this->facebookStream->fileGetContents($url); $rawHeaders = $this->facebookStream->getResponseHeaders(); if ($rawBody === false || empty($rawHeaders)) { throw new FacebookSDKException('Stream returned an empty response', 660); } $rawHeaders = implode("\r\n", $rawHeaders); return new GraphRawResponse($rawHeaders, $rawBody); } /** * Formats the headers for use in the stream wrapper. * * @param array $headers The request headers. * * @return string */ public function compileHeader(array $headers) { $header = []; foreach ($headers as $k => $v) { $header[] = $k . ': ' . $v; } return implode("\r\n", $header); } } bzPg  EIsmartSEO/lib/scripts/facebook-v5-5.0.0/HttpClients/HttpClientsFactory.php obsessionData[$key]) ? $this->sessionData[$key] : null; } /** * @inheritdoc */ public function set($key, $value) { $this->sessionData[$key] = $value; } } Jl| Z^smartSEO/lib/scripts/facebook-v5-5.0.0/PersistentData/FacebookSessionPersistentDataHandler.php obsessionPrefix . $key])) { return $_SESSION[$this->sessionPrefix . $key]; } return null; } /** * @inheritdoc */ public function set($key, $value) { $_SESSION[$this->sessionPrefix . $key] = $value; } }  Sm ,XOsmartSEO/lib/scripts/facebook-v5-5.0.0/PersistentData/PersistentDataFactory.php obo  z€QsmartSEO/lib/scripts/facebook-v5-5.0.0/PersistentData/PersistentDataInterface.php obvalidateLength($length); $binaryString = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); if ($binaryString === false) { throw new FacebookSDKException( static::ERROR_MESSAGE . 'mcrypt_create_iv() returned an error.' ); } return $this->binToHex($binaryString, $length); } } ľ~ 8`smartSEO/lib/scripts/facebook-v5-5.0.0/PseudoRandomString/OpenSslPseudoRandomStringGenerator.php obvalidateLength($length); $wasCryptographicallyStrong = false; $binaryString = openssl_random_pseudo_bytes($length, $wasCryptographicallyStrong); if ($binaryString === false) { throw new FacebookSDKException(static::ERROR_MESSAGE . 'openssl_random_pseudo_bytes() returned an unknown error.'); } if ($wasCryptographicallyStrong !== true) { throw new FacebookSDKException(static::ERROR_MESSAGE . 'openssl_random_pseudo_bytes() returned a pseudo-random string but it was not cryptographically secure and cannot be used.'); } return $this->binToHex($binaryString, $length); } } ~ \`smartSEO/lib/scripts/facebook-v5-5.0.0/PseudoRandomString/PseudoRandomStringGeneratorFactory.php obvalidateLength($length); return $this->binToHex(random_bytes($length), $length); } } *X~ t i`smartSEO/lib/scripts/facebook-v5-5.0.0/PseudoRandomString/UrandomPseudoRandomStringGenerator.php obvalidateLength($length); $stream = fopen('/dev/urandom', 'rb'); if (!is_resource($stream)) { throw new FacebookSDKException( static::ERROR_MESSAGE . 'Unable to open stream to /dev/urandom.' ); } if (!defined('HHVM_VERSION')) { stream_set_read_buffer($stream, 0); } $binaryString = fread($stream, $length); fclose($stream); if (!$binaryString) { throw new FacebookSDKException( static::ERROR_MESSAGE . 'Stream to /dev/urandom returned no data.' ); } return $this->binToHex($binaryString, $length); } } {V AA(x8smartSEO/lib/scripts/facebook-v5-5.0.0/SignedRequest.php obapp = $facebookApp; if (!$rawSignedRequest) { return; } $this->rawSignedRequest = $rawSignedRequest; $this->parse(); } /** * Returns the raw signed request data. * * @return string|null */ public function getRawSignedRequest() { return $this->rawSignedRequest; } /** * Returns the parsed signed request data. * * @return array|null */ public function getPayload() { return $this->payload; } /** * Returns a property from the signed request data if available. * * @param string $key * @param mixed|null $default * * @return mixed|null */ public function get($key, $default = null) { if (isset($this->payload[$key])) { return $this->payload[$key]; } return $default; } /** * Returns user_id from signed request data if available. * * @return string|null */ public function getUserId() { return $this->get('user_id'); } /** * Checks for OAuth data in the payload. * * @return boolean */ public function hasOAuthData() { return $this->get('oauth_token') || $this->get('code'); } /** * Creates a signed request from an array of data. * * @param array $payload * * @return string */ public function make(array $payload) { $payload['algorithm'] = isset($payload['algorithm']) ? $payload['algorithm'] : 'HMAC-SHA256'; $payload['issued_at'] = isset($payload['issued_at']) ? $payload['issued_at'] : time(); $encodedPayload = $this->base64UrlEncode(json_encode($payload)); $hashedSig = $this->hashSignature($encodedPayload); $encodedSig = $this->base64UrlEncode($hashedSig); return $encodedSig . '.' . $encodedPayload; } /** * Validates and decodes a signed request and saves * the payload to an array. */ protected function parse() { list($encodedSig, $encodedPayload) = $this->split(); // Signature validation $sig = $this->decodeSignature($encodedSig); $hashedSig = $this->hashSignature($encodedPayload); $this->validateSignature($hashedSig, $sig); $this->payload = $this->decodePayload($encodedPayload); // Payload validation $this->validateAlgorithm(); } /** * Splits a raw signed request into signature and payload. * * @returns array * * @throws FacebookSDKException */ protected function split() { if (strpos($this->rawSignedRequest, '.') === false) { throw new FacebookSDKException('Malformed signed request.', 606); } return explode('.', $this->rawSignedRequest, 2); } /** * Decodes the raw signature from a signed request. * * @param string $encodedSig * * @returns string * * @throws FacebookSDKException */ protected function decodeSignature($encodedSig) { $sig = $this->base64UrlDecode($encodedSig); if (!$sig) { throw new FacebookSDKException('Signed request has malformed encoded signature data.', 607); } return $sig; } /** * Decodes the raw payload from a signed request. * * @param string $encodedPayload * * @returns array * * @throws FacebookSDKException */ protected function decodePayload($encodedPayload) { $payload = $this->base64UrlDecode($encodedPayload); if ($payload) { $payload = json_decode($payload, true); } if (!is_array($payload)) { throw new FacebookSDKException('Signed request has malformed encoded payload data.', 607); } return $payload; } /** * Validates the algorithm used in a signed request. * * @throws FacebookSDKException */ protected function validateAlgorithm() { if ($this->get('algorithm') !== 'HMAC-SHA256') { throw new FacebookSDKException('Signed request is using the wrong algorithm.', 605); } } /** * Hashes the signature used in a signed request. * * @param string $encodedData * * @return string * * @throws FacebookSDKException */ protected function hashSignature($encodedData) { $hashedSig = hash_hmac( 'sha256', $encodedData, $this->app->getSecret(), $raw_output = true ); if (!$hashedSig) { throw new FacebookSDKException('Unable to hash signature from encoded payload data.', 602); } return $hashedSig; } /** * Validates the signature used in a signed request. * * @param string $hashedSig * @param string $sig * * @throws FacebookSDKException */ protected function validateSignature($hashedSig, $sig) { if (\hash_equals($hashedSig, $sig)) { return; } throw new FacebookSDKException('Signed request has an invalid signature.', 602); } /** * Base64 decoding which replaces characters: * + instead of - * / instead of _ * * @link http://en.wikipedia.org/wiki/Base64#URL_applications * * @param string $input base64 url encoded input * * @return string decoded string */ public function base64UrlDecode($input) { $urlDecodedBase64 = strtr($input, '-_', '+/'); $this->validateBase64($urlDecodedBase64); return base64_decode($urlDecodedBase64); } /** * Base64 encoding which replaces characters: * + instead of - * / instead of _ * * @link http://en.wikipedia.org/wiki/Base64#URL_applications * * @param string $input string to encode * * @return string base64 url encoded input */ public function base64UrlEncode($input) { return strtr(base64_encode($input), '+/', '-_'); } /** * Validates a base64 string. * * @param string $input base64 value to validate * * @throws FacebookSDKException */ protected function validateBase64($input) { if (!preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $input)) { throw new FacebookSDKException('Signed request contains malformed base64 encoding.', 608); } } } (h ))_}JsmartSEO/lib/scripts/facebook-v5-5.0.0/Url/FacebookUrlDetectionHandler.php obgetHttpScheme() . '://' . $this->getHostName() . $this->getServerVar('REQUEST_URI'); } /** * Get the currently active URL scheme. * * @return string */ protected function getHttpScheme() { return $this->isBehindSsl() ? 'https' : 'http'; } /** * Tries to detect if the server is running behind an SSL. * * @return boolean */ protected function isBehindSsl() { // Check for proxy first $protocol = $this->getHeader('X_FORWARDED_PROTO'); if ($protocol) { return $this->protocolWithActiveSsl($protocol); } $protocol = $this->getServerVar('HTTPS'); if ($protocol) { return $this->protocolWithActiveSsl($protocol); } return (string)$this->getServerVar('SERVER_PORT') === '443'; } /** * Detects an active SSL protocol value. * * @param string $protocol * * @return boolean */ protected function protocolWithActiveSsl($protocol) { $protocol = strtolower((string)$protocol); return in_array($protocol, ['on', '1', 'https', 'ssl'], true); } /** * Tries to detect the host name of the server. * * Some elements adapted from * * @see https://github.com/symfony/HttpFoundation/blob/master/Request.php * * @return string */ protected function getHostName() { // Check for proxy first $header = $this->getHeader('X_FORWARDED_HOST'); if ($header && $this->isValidForwardedHost($header)) { $elements = explode(',', $header); $host = $elements[count($elements) - 1]; } elseif (!$host = $this->getHeader('HOST')) { if (!$host = $this->getServerVar('SERVER_NAME')) { $host = $this->getServerVar('SERVER_ADDR'); } } // trim and remove port number from host // host is lowercase as per RFC 952/2181 $host = strtolower(preg_replace('/:\d+$/', '', trim($host))); // Port number $scheme = $this->getHttpScheme(); $port = $this->getCurrentPort(); $appendPort = ':' . $port; // Don't append port number if a normal port. if (($scheme == 'http' && $port == '80') || ($scheme == 'https' && $port == '443')) { $appendPort = ''; } return $host . $appendPort; } protected function getCurrentPort() { // Check for proxy first $port = $this->getHeader('X_FORWARDED_PORT'); if ($port) { return (string)$port; } $protocol = (string)$this->getHeader('X_FORWARDED_PROTO'); if ($protocol === 'https') { return '443'; } return (string)$this->getServerVar('SERVER_PORT'); } /** * Returns the a value from the $_SERVER super global. * * @param string $key * * @return string */ protected function getServerVar($key) { return isset($_SERVER[$key]) ? $_SERVER[$key] : ''; } /** * Gets a value from the HTTP request headers. * * @param string $key * * @return string */ protected function getHeader($key) { return $this->getServerVar('HTTP_' . $key); } /** * Checks if the value in X_FORWARDED_HOST is a valid hostname * Could prevent unintended redirections * * @param string $header * * @return boolean */ protected function isValidForwardedHost($header) { $elements = explode(',', $header); $host = $elements[count($elements) - 1]; return preg_match("/^([a-z\d](-*[a-z\d])*)(\.([a-z\d](-*[a-z\d])*))*$/i", $host) //valid chars check && 0 < strlen($host) && strlen($host) < 254 //overall length check && preg_match("/^[^\.]{1,63}(\.[^\.]{1,63})*$/", $host); //length of each label } } (c ((~SEsmartSEO/lib/scripts/facebook-v5-5.0.0/Url/FacebookUrlManipulator.php ob 0) { $query = '?' . http_build_query($params, null, '&'); } } $scheme = isset($parts['scheme']) ? $parts['scheme'] . '://' : ''; $host = isset($parts['host']) ? $parts['host'] : ''; $port = isset($parts['port']) ? ':' . $parts['port'] : ''; $path = isset($parts['path']) ? $parts['path'] : ''; $fragment = isset($parts['fragment']) ? '#' . $parts['fragment'] : ''; return $scheme . $host . $port . $path . $query . $fragment; } /** * Gracefully appends params to the URL. * * @param string $url The URL that will receive the params. * @param array $newParams The params to append to the URL. * * @return string */ public static function appendParamsToUrl($url, array $newParams = []) { if (empty($newParams)) { return $url; } if (strpos($url, '?') === false) { return $url . '?' . http_build_query($newParams, null, '&'); } list($path, $query) = explode('?', $url, 2); $existingParams = []; parse_str($query, $existingParams); // Favor params from the original URL over $newParams $newParams = array_merge($newParams, $existingParams); // Sort for a predicable order ksort($newParams); return $path . '?' . http_build_query($newParams, null, '&'); } /** * Returns the params from a URL in the form of an array. * * @param string $url The URL to parse the params from. * * @return array */ public static function getParamsAsArray($url) { $query = parse_url($url, PHP_URL_QUERY); if (!$query) { return []; } $params = []; parse_str($query, $params); return $params; } /** * Adds the params of the first URL to the second URL. * * Any params that already exist in the second URL will go untouched. * * @param string $urlToStealFrom The URL harvest the params from. * @param string $urlToAddTo The URL that will receive the new params. * * @return string The $urlToAddTo with any new params from $urlToStealFrom. */ public static function mergeUrlParams($urlToStealFrom, $urlToAddTo) { $newParams = static::getParamsAsArray($urlToStealFrom); // Nothing new to add, return as-is if (!$newParams) { return $urlToAddTo; } return static::appendParamsToUrl($urlToAddTo, $newParams); } /** * Check for a "/" prefix and prepend it if not exists. * * @param string|null $string * * @return string|null */ public static function forceSlashPrefix($string) { if (!$string) { return $string; } return strpos($string, '/') === 0 ? $string : '/' . $string; } /** * Trims off the hostname and Graph version from a URL. * * @param string $urlToTrim The URL the needs the surgery. * * @return string The $urlToTrim with the hostname and Graph version removed. */ public static function baseGraphUrlEndpoint($urlToTrim) { return '/' . preg_replace('/^https:\/\/.+\.facebook\.com(\/v.+?)?\//', '', $urlToTrim); } } ib  n [DsmartSEO/lib/scripts/facebook-v5-5.0.0/Url/UrlDetectionInterface.php ob * * @version 1.1 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * */ class GoogleAnalyticsAPI { const API_URL = 'https://www.googleapis.com/analytics/v3/data/ga'; const WEBPROPERTIES_URL = 'https://www.googleapis.com/analytics/v3/management/accounts/~all/webproperties'; const PROFILES_URL = 'https://www.googleapis.com/analytics/v3/management/accounts/~all/webproperties/~all/profiles'; public $auth = null; protected $accessToken = ''; protected $accountId = ''; protected $assoc = true; /** * Default query parameters * */ protected $defaultQueryParams = array(); /** * Constructor * * @access public * @param String $auth (default: 'web') 'web' for Web-applications with end-users involved, 'service' for service applications (server-to-server) */ public function __construct($auth='web') { if (!function_exists('curl_init')) throw new Exception('The curl extension for PHP is required.'); $this->auth = ($auth == 'web') ? new GoogleOauthWeb() : new GoogleOauthService(); $this->defaultQueryParams = array( 'start-date' => date('Y-m-d', strtotime('-1 month')), 'end-date' => date('Y-m-d'), 'metrics' => 'ga:visits', ); } public function __set($key, $value) { switch ($key) { case 'auth' : if (($value instanceof GoogleOauth) == false) { throw new Exception('auth needs to be a subclass of GoogleOauth'); } $this->auth = $value; break; case 'defaultQueryParams' : $this->setDefaultQueryParams($value); break; default: $this->{$key} = $value; } } public function setAccessToken($token) { $this->accessToken = $token; } public function setAccountId($id) { $this->accountId = $id; } /** * Set default query parameters * Useful settings: start-date, end-date, max-results * * @access public * @param array() $params Query parameters */ public function setDefaultQueryParams(array $params) { $params = array_merge($this->defaultQueryParams, $params); $this->defaultQueryParams = $params; } /** * Return objects from json_decode instead of arrays * * @access public * @param mixed $bool true to return objects */ public function returnObjects($bool) { $this->assoc = !$bool; $this->auth->returnObjects($bool); } /** * Query the Google Analytics API * * @access public * @param array $params (default: array()) Query parameters * @return array data */ public function query($params=array()) { return $this->_query($params); } /** * Get all WebProperties * * @access public * @return array data */ public function getWebProperties() { if (!$this->accessToken) throw new Exception('You must provide an accessToken'); $data = Http::curl(self::WEBPROPERTIES_URL, array('access_token' => $this->accessToken)); return json_decode($data, $this->assoc); } /** * Get all Profiles * * @access public * @return array data */ public function getProfiles() { if (!$this->accessToken) throw new Exception('You must provide an accessToken'); $data = Http::curl(self::PROFILES_URL, array('access_token' => $this->accessToken)); return json_decode($data, $this->assoc); } /***************************************************************************************************************************** * * The following methods implement queries for the most useful statistics, seperated by topics: Audience/Content/Traffic Sources * *****************************************************************************************************************************/ /* * AUDIENCE * */ public function getVisitsByDate($params=array()) { $defaults = array( 'metrics' => 'ga:visits', 'dimensions' => 'ga:date', ); $_params = array_merge($defaults, $params); return $this->_query($_params); } public function getAudienceStatistics($params=array()) { $defaults = array( 'metrics' => 'ga:visitors,ga:newVisits,ga:percentNewVisits,ga:visits,ga:bounces,ga:pageviews,ga:visitBounceRate,ga:timeOnSite,ga:avgTimeOnSite', ); $_params = array_merge($defaults, $params); return $this->_query($_params); } public function getVisitsByCountries($params=array()) { $defaults = array( 'metrics' => 'ga:visits', 'dimensions' => 'ga:country', 'sort' => '-ga:visits', ); $_params = array_merge($defaults, $params); return $this->_query($_params); } public function getVisitsByCities($params=array()) { $defaults = array( 'metrics' => 'ga:visits', 'dimensions' => 'ga:city', 'sort' => '-ga:visits', ); $_params = array_merge($defaults, $params); return $this->_query($_params); } public function getVisitsByLanguages($params=array()) { $defaults = array( 'metrics' => 'ga:visits', 'dimensions' => 'ga:language', 'sort' => '-ga:visits', ); $_params = array_merge($defaults, $params); return $this->_query($_params); } public function getVisitsBySystemBrowsers($params=array()) { $defaults = array( 'metrics' => 'ga:visits', 'dimensions' => 'ga:browser', 'sort' => '-ga:visits', ); $_params = array_merge($defaults, $params); return $this->_query($_params); } public function getVisitsBySystemOs($params=array()) { $defaults = array( 'metrics' => 'ga:visits', 'dimensions' => 'ga:operatingSystem', 'sort' => '-ga:visits', ); $_params = array_merge($defaults, $params); return $this->_query($_params); } public function getVisitsBySystemResolutions($params=array()) { $defaults = array( 'metrics' => 'ga:visits', 'dimensions' => 'ga:screenResolution', 'sort' => '-ga:visits', ); $_params = array_merge($defaults, $params); return $this->_query($_params); } public function getVisitsByMobileOs($params=array()) { $defaults = array( 'metrics' => 'ga:visits', 'dimensions' => 'ga:operatingSystem', 'sort' => '-ga:visits', 'segment' => 'gaid::-11', ); $_params = array_merge($defaults, $params); return $this->_query($_params); } public function getVisitsByMobileResolutions($params=array()) { $defaults = array( 'metrics' => 'ga:visits', 'dimensions' => 'ga:screenResolution', 'sort' => '-ga:visits', 'segment' => 'gaid::-11', ); $_params = array_merge($defaults, $params); return $this->_query($_params); } /* * CONTENT * */ public function getPageviewsByDate($params=array()) { $defaults = array( 'metrics' => 'ga:pageviews', 'dimensions' => 'ga:date', ); $_params = array_merge($defaults, $params); return $this->_query($_params); } public function getContentStatistics($params=array()) { $defaults = array( 'metrics' => 'ga:pageviews,ga:uniquePageviews', ); $_params = array_merge($defaults, $params); return $this->_query($_params); } public function getContentTopPages($params=array()) { $defaults = array( 'metrics' => 'ga:pageviews', 'dimensions' => 'ga:pagePath', 'sort' => '-ga:pageviews', ); $_params = array_merge($defaults, $params); return $this->_query($_params); } /* * TRAFFIC SOURCES * */ public function getTrafficSources($params=array()) { $defaults = array( 'metrics' => 'ga:visits', 'dimensions' => 'ga:medium', ); $_params = array_merge($defaults, $params); return $this->_query($_params); } public function getKeywords($params=array()) { $defaults = array( 'metrics' => 'ga:visits', 'dimensions' => 'ga:keyword', 'sort' => '-ga:visits', ); $_params = array_merge($defaults, $params); return $this->_query($_params); } public function getReferralTraffic($params=array()) { $defaults = array( 'metrics' => 'ga:visits', 'dimensions' => 'ga:source', 'sort' => '-ga:visits', ); $_params = array_merge($defaults, $params); return $this->_query($_params); } protected function _query($params=array()){ if (!$this->accessToken || !$this->accountId) { throw new Exception('You must provide the accessToken and an accountId'); } $_params = array_merge($this->defaultQueryParams, array('access_token' => $this->accessToken, 'ids' => $this->accountId)); $queryParams = array_merge($_params, $params); $data = Http::curl(self::API_URL, $queryParams); return json_decode($data, $this->assoc); } } /** * Abstract Auth class * */ abstract class GoogleOauth { const TOKEN_URL = 'https://accounts.google.com/o/oauth2/token'; const SCOPE_URL = 'https://www.googleapis.com/auth/analytics.readonly'; protected $assoc = true; protected $clientId = ''; public function __set($key, $value) { $this->{$key} = $value; } public function setClientId($id) { $this->clientId = $id; } public function returnObjects($bool) { $this->assoc = !$bool; } /** * To be implemented by the subclasses * */ public function getAccessToken($data=null) {} } /** * Oauth 2.0 for service applications requiring a private key * openssl extension for PHP is required! * @extends GoogleOauth * */ class GoogleOauthService extends GoogleOauth { const MAX_LIFETIME_SECONDS = 3600; const GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:jwt-bearer'; protected $email = ''; protected $privateKey = null; protected $password = 'notasecret'; /** * Constructor * * @access public * @param string $clientId (default: '') Client-ID of your project from the Google APIs console * @param string $email (default: '') E-Mail address of your project from the Google APIs console * @param mixed $privateKey (default: null) Path to your private key file (*.p12) */ public function __construct($clientId='', $email='', $privateKey=null) { if (!function_exists('openssl_sign')) throw new Exception('openssl extension for PHP is needed.'); $this->clientId = $clientId; $this->email = $email; $this->privateKey = $privateKey; } public function setEmail($email) { $this->email = $email; } public function setPrivateKey($key) { $this->privateKey = $key; } /** * Get the accessToken in exchange with the JWT * * @access public * @param mixed $data (default: null) No data needed in this implementation * @return array Array with keys: access_token, expires_in */ public function getAccessToken($data=null) { if (!$this->clientId || !$this->email || !$this->privateKey) { throw new Exception('You must provide the clientId, email and a path to your private Key'); } $jwt = $this->generateSignedJWT(); $params = array( 'grant_type' => self::GRANT_TYPE, 'assertion' => $jwt, ); $auth = Http::curl(GoogleOauth::TOKEN_URL, $params, true); return json_decode($auth, $this->assoc); } /** * Generate and sign a JWT request * See: https://developers.google.com/accounts/docs/OAuth2ServiceAccount * * @access protected */ protected function generateSignedJWT() { // Check if a valid privateKey file is provided if (!file_exists($this->privateKey) || !is_file($this->privateKey)) { throw new Exception('Private key does not exist'); } // Create header, claim and signature $header = array( 'alg' => 'RS256', 'typ' => 'JWT', ); $t = time(); $params = array( 'iss' => $this->email, 'scope' => GoogleOauth::SCOPE_URL, 'aud' => GoogleOauth::TOKEN_URL, 'exp' => $t + self::MAX_LIFETIME_SECONDS, 'iat' => $t, ); $encodings = array( base64_encode(json_encode($header)), base64_encode(json_encode($params)), ); // Compute Signature $input = implode('.', $encodings); $certs = array(); $pkcs12 = file_get_contents($this->privateKey); if (!openssl_pkcs12_read($pkcs12, $certs, $this->password)) { throw new Exception('Could not parse .p12 file'); } if (!isset($certs['pkey'])) { throw new Exception('Could not find private key in .p12 file'); } $keyId = openssl_pkey_get_private($certs['pkey']); if (!openssl_sign($input, $sig, $keyId, 'sha256')) { throw new Exception('Could not sign data'); } // Generate JWT $encodings[] = base64_encode($sig); $jwt = implode('.', $encodings); return $jwt; } } /** * Oauth 2.0 for web applications * @extends GoogleOauth * */ class GoogleOauthWeb extends GoogleOauth { const AUTH_URL = 'https://accounts.google.com/o/oauth2/auth'; const REVOKE_URL = 'https://accounts.google.com/o/oauth2/revoke'; protected $clientSecret = ''; protected $redirectUri = ''; /** * Constructor * * @access public * @param string $clientId (default: '') Client-ID of your web application from the Google APIs console * @param string $clientSecret (default: '') Client-Secret of your web application from the Google APIs console * @param string $redirectUri (default: '') Redirect URI to your app - must match with an URL provided in the Google APIs console */ public function __construct($clientId='', $clientSecret='', $redirectUri='') { $this->clientId = $clientId; $this->clientSecret = $clientSecret; $this->redirectUri = $redirectUri; } public function setClientSecret($secret) { $this->clientSecret = $secret; } public function setRedirectUri($uri) { $this->redirectUri = $uri; } /** * Build auth url * The user has to login with his Google Account and give your app access to the Analytics API * * @access public * @param array $params Custom parameters * @return string The auth login-url */ public function buildAuthUrl($params = array()) { if (!$this->clientId || !$this->redirectUri) { throw new Exception('You must provide the clientId and a redirectUri'); } $defaults = array( 'response_type' => 'code', 'client_id' => $this->clientId, 'redirect_uri' => $this->redirectUri, 'scope' => GoogleOauth::SCOPE_URL, 'access_type' => 'offline', 'approval_prompt' => 'force', ); $params = array_merge($defaults, $params); $url = self::AUTH_URL . '?' . http_build_query($params); return $url; } /** * Get the AccessToken in exchange with the code from the auth along with a refreshToken * * @access public * @param mixed $data The code received with GET after auth * @return array Array with the following keys: access_token, refresh_token, expires_in */ public function getAccessToken($data=null) { if (!$this->clientId || !$this->clientSecret || !$this->redirectUri) { throw new Exception('You must provide the clientId, clientSecret and a redirectUri'); } $params = array( 'code' => $data, 'client_id' => $this->clientId, 'client_secret' => $this->clientSecret, 'redirect_uri' => $this->redirectUri, 'grant_type' => 'authorization_code', ); $auth = Http::curl(GoogleOauth::TOKEN_URL, $params, true); return json_decode($auth, $this->assoc); } /** * Get a new accessToken with the refreshToken * * @access public * @param mixed $refreshToken The refreshToken * @return array Array with the following keys: access_token, expires_in */ public function refreshAccessToken($refreshToken) { if (!$this->clientId || !$this->clientSecret) { throw new Exception('You must provide the clientId and clientSecret'); } $params = array( 'client_id' => $this->clientId, 'client_secret' => $this->clientSecret, 'refresh_token' => $refreshToken, 'grant_type' => 'refresh_token', ); $auth = Http::curl(GoogleOauth::TOKEN_URL, $params, true); return json_decode($auth, $this->assoc); } /** * Revoke access * * @access public * @param mixed $token accessToken or refreshToken */ public function revokeAccess($token) { $params = array('token' => $token); $data = Http::curl(self::REVOKE_URL, $params); return json_decode($data, $this->assoc); } } /** * Send data with curl * */ class Http { /** * Send http requests with curl * * @access public * @static * @param mixed $url The url to send data * @param array $params (default: array()) Array with key/value pairs to send * @param bool $post (default: false) True when sending with POST */ public static function curl($url, $params=array(), $post=false) { $debug = true; $ret = array('status' => 'invalid', 'http_code' => 0, 'data' => ''); if (empty($url)) return false; if (!$post && !empty($params)) { $url = $url . "?" . http_build_query($params); } $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); if ($post) { curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $params); } //curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // old code //$data = curl_exec($curl); //$http_code = (int) curl_getinfo($curl, CURLINFO_HTTP_CODE); // Add the status code to the json data, useful for error-checking //$data = preg_replace('/^{/', '{"http_code":'.$http_code.',', $data); //curl_close($curl); // refactoring/ 2017-02-01 if (1) { $data = curl_exec($curl); $http_code = (int) curl_getinfo($curl, CURLINFO_HTTP_CODE); $ret = array_merge($ret, array('http_code' => $http_code)); if ($debug) { $ret = array_merge($ret, array('debug_details' => curl_getinfo($curl))); } if ( $data === false || curl_errno($curl) ) { // error occurred $ret = array_merge($ret, array( 'data' => curl_errno($curl) . ' : ' . curl_error($curl) )); } else { // success // Add the status code to the json data, useful for error-checking if ( 1 ) { $data = preg_replace('/^{/', '{"http_code":'.$http_code.',', $data); } $ret = array_merge($ret, array( 'status' => 'valid', 'data' => $data )); } curl_close($curl); // TO DEBUG curl result, uncomment this line //var_dump('
    ', $ret, '
    '); echo __FILE__ . ":" . __LINE__;die . PHP_EOL; } return $data; } }=ΫFL 7F\.smartSEO/lib/scripts/mobile-detect/LICENSE.txt obMIT License Copyright (c) <2011-2014> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Developer’s Certificate of Origin 1.1 By making a contribution to this project, I certify that: (a) The contribution was created in whole or in part by me and I have the right to submit it under the open source license indicated in the file; or (b) The contribution is based upon previous work that, to the best of my knowledge, is covered under an appropriate open source license and I have the right under that license to submit that work with modifications, whether created in whole or in part by me, under the same open source license (unless I am permitted to submit under a different license), as indicated in the file; or (c) The contribution was provided directly to me by some other person who certified (a), (b) or (c) and I have not modified it. (d) I understand and agree that this project and the contribution are public and that a record of the contribution (including all personal information I submit with it, including my sign-off) is maintained indefinitely and may be redistributed consistent with this project or the open source license(s) involved. RfU ;..5smartSEO/lib/scripts/mobile-detect/Mobile_Detect.json ob{ "version": "2.8.0", "headerMatch": { "HTTP_ACCEPT": { "matches": [ "application\/x-obml2d", "application\/vnd.rim.html", "text\/vnd.wap.wml", "application\/vnd.wap.xhtml+xml" ] }, "HTTP_X_WAP_PROFILE": null, "HTTP_X_WAP_CLIENTID": null, "HTTP_WAP_CONNECTION": null, "HTTP_PROFILE": null, "HTTP_X_OPERAMINI_PHONE_UA": null, "HTTP_X_NOKIA_IPADDRESS": null, "HTTP_X_NOKIA_GATEWAY_ID": null, "HTTP_X_ORANGE_ID": null, "HTTP_X_VODAFONE_3GPDPCONTEXT": null, "HTTP_X_HUAWEI_USERID": null, "HTTP_UA_OS": null, "HTTP_X_MOBILE_GATEWAY": null, "HTTP_X_ATT_DEVICEID": null, "HTTP_UA_CPU": { "matches": [ "ARM" ] } }, "uaHttpHeaders": [ "HTTP_USER_AGENT", "HTTP_X_OPERAMINI_PHONE_UA", "HTTP_X_DEVICE_USER_AGENT", "HTTP_X_ORIGINAL_USER_AGENT", "HTTP_X_SKYFIRE_PHONE", "HTTP_X_BOLT_PHONE_UA", "HTTP_DEVICE_STOCK_UA", "HTTP_X_UCBROWSER_DEVICE_UA" ], "uaMatch": { "phones": { "iPhone": "\\biPhone.*Mobile|\\biPod", "BlackBerry": "BlackBerry|\\bBB10\\b|rim[0-9]+", "HTC": "HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\\bEVO\\b|T-Mobile G1|Z520m", "Nexus": "Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile", "Dell": "Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\\b001DL\\b|\\b101DL\\b|\\bGS01\\b", "Motorola": "Motorola|DROIDX|DROID BIONIC|\\bDroid\\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925", "Samsung": "Samsung|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E", "LG": "\\bLG\\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802)", "Sony": "SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i", "Asus": "Asus.*Galaxy|PadFone.*Mobile", "Micromax": "Micromax.*\\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\\b", "Palm": "PalmSource|Palm", "Vertu": "Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature", "Pantech": "PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790", "Fly": "IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250", "iMobile": "i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)", "SimValley": "\\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\\b", "GenericPhone": "Tapatalk|PDA;|SAGEM|\\bmmp\\b|pocket|\\bpsp\\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\\bwap\\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser" }, "tablets": { "iPad": "iPad|iPad.*Mobile", "NexusTablet": "^.*Android.*Nexus(((?:(?!Mobile))|(?:(\\s(7|10).+))).)*$", "SamsungTablet": "SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-I9205|GT-P5200|GT-P5210|SM-T311|SM-T310|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T520|SM-T525", "Kindle": "Kindle|Silk.*Accelerated|Android.*\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE)\\b", "SurfaceTablet": "Windows NT [0-9.]+; ARM;", "HPTablet": "HP Slate 7|HP ElitePad 900|hp-tablet|EliteBook.*Touch", "AsusTablet": "^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\\bK00F\\b|TX201LA", "BlackBerryTablet": "PlayBook|RIM Tablet", "HTCtablet": "HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200", "MotorolaTablet": "xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617", "NookTablet": "Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2", "AcerTablet": "Android.*; \\b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810)\\b|W3-810|\\bA3-A10\\b", "ToshibaTablet": "Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO", "LGTablet": "\\bL-06C|LG-V900|LG-V500|LG-V909\\b", "FujitsuTablet": "Android.*\\b(F-01D|F-05E|F-10D|M532|Q572)\\b", "PrestigioTablet": "PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD", "LenovoTablet": "IdeaTab|S2110|S6000|K3011|A3000|A1000|A2107|A2109|A1107|ThinkPad([ ]+)?Tablet", "YarvikTablet": "Android.*\\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\\b", "MedionTablet": "Android.*\\bOYO\\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB", "ArnovaTablet": "AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT", "IntensoTablet": "INM8002KP|INM1010FP|INM805ND|Intenso Tab", "IRUTablet": "M702pro", "MegafonTablet": "MegaFon V9|\\bZTE V9\\b|Android.*\\bMT7A\\b", "EbodaTablet": "E-Boda (Supreme|Impresspeed|Izzycomm|Essential)", "AllViewTablet": "Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)", "ArchosTablet": "\\b(101G9|80G9|A101IT)\\b|Qilive 97R|ARCHOS 101G10", "AinolTablet": "NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark", "SonyTablet": "Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201", "CubeTablet": "Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT", "CobyTablet": "MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010", "MIDTablet": "M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733", "SMiTTablet": "Android.*(\\bMID\\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)", "RockChipTablet": "Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A", "FlyTablet": "IQ310|Fly Vision", "bqTablet": "bq.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant)|Maxwell.*Lite|Maxwell.*Plus", "HuaweiTablet": "MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim", "NecTablet": "\\bN-06D|\\bN-08D", "PantechTablet": "Pantech.*P4100", "BronchoTablet": "Broncho.*(N701|N708|N802|a710)", "VersusTablet": "TOUCHPAD.*[78910]|\\bTOUCHTAB\\b", "ZyncTablet": "z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900", "PositivoTablet": "TB07STA|TB10STA|TB07FTA|TB10FTA", "NabiTablet": "Android.*\\bNabi", "KoboTablet": "Kobo Touch|\\bK080\\b|\\bVox\\b Build|\\bArc\\b Build", "DanewTablet": "DSlide.*\\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\\b", "TexetTablet": "NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE", "PlaystationTablet": "Playstation.*(Portable|Vita)", "TrekstorTablet": "ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2", "PyleAudioTablet": "\\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\\b", "AdvanTablet": "Android.* \\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\b ", "DanyTechTablet": "Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1", "GalapadTablet": "Android.*\\bG1\\b", "MicromaxTablet": "Funbook|Micromax.*\\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\\b", "KarbonnTablet": "Android.*\\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\\b", "AllFineTablet": "Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide", "PROSCANTablet": "\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\b", "YONESTablet": "BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026", "ChangJiaTablet": "TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503", "GUTablet": "TX-A1301|TX-M9002|Q702|kf026", "PointOfViewTablet": "TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10", "OvermaxTablet": "OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)", "HCLTablet": "HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync", "DPSTablet": "DPS Dream 9|DPS Dual 7", "VistureTablet": "V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10", "CrestaTablet": "CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989", "MediatekTablet": "\\bMT8125|MT8389|MT8135|MT8377\\b", "ConcordeTablet": "Concorde([ ]+)?Tab|ConCorde ReadMan", "GoCleverTablet": "GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042", "ModecomTablet": "FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003", "VoninoTablet": "\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\\bQ8\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\b", "ECSTablet": "V07OT2|TM105A|S10OT1|TR10CS1", "StorexTablet": "eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab", "VodafoneTablet": "SmartTab([ ]+)?[0-9]+|SmartTabII10", "EssentielBTablet": "Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2", "RossMoorTablet": "RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711", "iMobileTablet": "i-mobile i-note", "TolinoTablet": "tolino tab [0-9.]+|tolino shine", "AudioSonicTablet": "\\bC-22Q|T7-QC|T-17B|T-17P\\b", "AMPETablet": "Android.* A78 ", "SkkTablet": "Android.* (SKYPAD|PHOENIX|CYCLOPS)", "TecnoTablet": "TECNO P9", "JXDTablet": "Android.*\\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\\b", "iJoyTablet": "Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)", "Hudl": "Hudl HT7S3", "TelstraTablet": "T-Hub2", "GenericTablet": "Android.*\\b97D\\b|Tablet(?!.*PC)|ViewPad7|BNTV250A|MID-WCDMA|LogicPD Zoom2|\\bA7EB\\b|CatNova8|A1_07|CT704|CT1002|\\bM721\\b|rk30sdk|\\bEVOTAB\\b|M758A|ET904|ALUMIUM10|Smartfren Tab" }, "browsers": { "Chrome": "\\bCrMo\\b|CriOS|Android.*Chrome\/[.0-9]* (Mobile)?", "Dolfin": "\\bDolfin\\b", "Opera": "Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR\/[0-9.]+|Coast\/[0-9.]+", "Skyfire": "Skyfire", "IE": "IEMobile|MSIEMobile", "Firefox": "fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile", "Bolt": "bolt", "TeaShark": "teashark", "Blazer": "Blazer", "Safari": "Version.*Mobile.*Safari|Safari.*Mobile", "Tizen": "Tizen", "UCBrowser": "UC.*Browser|UCWEB", "DiigoBrowser": "DiigoBrowser", "Puffin": "Puffin", "Mercury": "\\bMercury\\b", "GenericBrowser": "NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger" }, "os": { "AndroidOS": "Android", "BlackBerryOS": "blackberry|\\bBB10\\b|rim tablet os", "PalmOS": "PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino", "SymbianOS": "Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\\bS60\\b", "WindowsMobileOS": "Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;", "WindowsPhoneOS": "Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7", "iOS": "\\biPhone.*Mobile|\\biPod|\\biPad", "MeeGoOS": "MeeGo", "MaemoOS": "Maemo", "JavaOS": "J2ME\/|\\bMIDP\\b|\\bCLDC\\b", "webOS": "webOS|hpwOS", "badaOS": "\\bBada\\b", "BREWOS": "BREW" } } }|4T W+Հ4smartSEO/lib/scripts/mobile-detect/Mobile_Detect.php ob, Nick Ilyin * Original author: Victor Stanciu * * @license Code and contributions have 'MIT License' * More details: https://github.com/serbanghita/Mobile-Detect/blob/master/LICENSE.txt * * @link Homepage: http://mobiledetect.net * GitHub Repo: https://github.com/serbanghita/Mobile-Detect * Google Code: http://code.google.com/p/php-mobile-detect/ * README: https://github.com/serbanghita/Mobile-Detect/blob/master/README.md * HOWTO: https://github.com/serbanghita/Mobile-Detect/wiki/Code-examples * * @version 2.8.0 */ if ( !class_exists('aaMobile_Detect') ) { class aaMobile_Detect { /** * Mobile detection type. * * @deprecated since version 2.6.9 */ const DETECTION_TYPE_MOBILE = 'mobile'; /** * Extended detection type. * * @deprecated since version 2.6.9 */ const DETECTION_TYPE_EXTENDED = 'extended'; /** * A frequently used regular expression to extract version #s. * * @deprecated since version 2.6.9 */ const VER = '([\w._\+]+)'; /** * Top-level device. */ const MOBILE_GRADE_A = 'A'; /** * Mid-level device. */ const MOBILE_GRADE_B = 'B'; /** * Low-level device. */ const MOBILE_GRADE_C = 'C'; /** * Stores the version number of the current release. */ const VERSION = '2.8.0'; /** * A type for the version() method indicating a string return value. */ const VERSION_TYPE_STRING = 'text'; /** * A type for the version() method indicating a float return value. */ const VERSION_TYPE_FLOAT = 'float'; /** * The User-Agent HTTP header is stored in here. * @var string */ protected $userAgent = null; /** * HTTP headers in the PHP-flavor. So HTTP_USER_AGENT and SERVER_SOFTWARE. * @var array */ protected $httpHeaders = array(); /** * The detection type, using self::DETECTION_TYPE_MOBILE or self::DETECTION_TYPE_EXTENDED. * * @deprecated since version 2.6.9 * * @var string */ protected $detectionType = self::DETECTION_TYPE_MOBILE; /** * HTTP headers that trigger the 'isMobile' detection * to be true. * * @var array */ protected static $mobileHeaders = array( 'HTTP_ACCEPT' => array('matches' => array( // Opera Mini; @reference: http://dev.opera.com/articles/view/opera-binary-markup-language/ 'application/x-obml2d', // BlackBerry devices. 'application/vnd.rim.html', 'text/vnd.wap.wml', 'application/vnd.wap.xhtml+xml' )), 'HTTP_X_WAP_PROFILE' => null, 'HTTP_X_WAP_CLIENTID' => null, 'HTTP_WAP_CONNECTION' => null, 'HTTP_PROFILE' => null, // Reported by Opera on Nokia devices (eg. C3). 'HTTP_X_OPERAMINI_PHONE_UA' => null, 'HTTP_X_NOKIA_IPADDRESS' => null, 'HTTP_X_NOKIA_GATEWAY_ID' => null, 'HTTP_X_ORANGE_ID' => null, 'HTTP_X_VODAFONE_3GPDPCONTEXT' => null, 'HTTP_X_HUAWEI_USERID' => null, // Reported by Windows Smartphones. 'HTTP_UA_OS' => null, // Reported by Verizon, Vodafone proxy system. 'HTTP_X_MOBILE_GATEWAY' => null, // Seend this on HTC Sensation. @ref: SensationXE_Beats_Z715e. 'HTTP_X_ATT_DEVICEID' => null, // Seen this on a HTC. 'HTTP_UA_CPU' => array('matches' => array('ARM')), ); /** * List of mobile devices (phones). * * @var array */ protected static $phoneDevices = array( 'iPhone' => '\biPhone.*Mobile|\biPod', // |\biTunes 'BlackBerry' => 'BlackBerry|\bBB10\b|rim[0-9]+', 'HTC' => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m', 'Nexus' => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile', // @todo: Is 'Dell Streak' a tablet or a phone? ;) 'Dell' => 'Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b', 'Motorola' => 'Motorola|DROIDX|DROID BIONIC|\bDroid\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925', 'Samsung' => 'Samsung|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E', 'LG' => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802)', 'Sony' => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i', 'Asus' => 'Asus.*Galaxy|PadFone.*Mobile', // @ref: http://www.micromaxinfo.com/mobiles/smartphones // Added because the codes might conflict with Acer Tablets. 'Micromax' => 'Micromax.*\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\b', 'Palm' => 'PalmSource|Palm', // avantgo|blazer|elaine|hiptop|plucker|xiino ; @todo - complete the regex. 'Vertu' => 'Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature', // Just for fun ;) // @ref: http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA (PANTECH) // Most of the VEGA devices are legacy. PANTECH seem to be newer devices based on Android. 'Pantech' => 'PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790', // @ref: http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones. 'Fly' => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250', 'iMobile' => 'i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)', // Added simvalley mobile just for fun. They have some interesting devices. // @ref: http://www.simvalley.fr/telephonie---gps-_22_telephonie-mobile_telephones_.html 'SimValley' => '\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\b', // @Tapatalk is a mobile app; @ref: http://support.tapatalk.com/threads/smf-2-0-2-os-and-browser-detection-plugin-and-tapatalk.15565/#post-79039 'GenericPhone' => 'Tapatalk|PDA;|SAGEM|\bmmp\b|pocket|\bpsp\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\bwap\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser' ); /** * List of tablet devices. * * @var array */ protected static $tabletDevices = array( 'iPad' => 'iPad|iPad.*Mobile', // @todo: check for mobile friendly emails topic. 'NexusTablet' => '^.*Android.*Nexus(((?:(?!Mobile))|(?:(\s(7|10).+))).)*$', 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-I9205|GT-P5200|GT-P5210|SM-T311|SM-T310|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T520|SM-T525', // @reference: http://www.labnol.org/software/kindle-user-agent-string/20378/ 'Kindle' => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE)\b', // Only the Surface tablets with Windows RT are considered mobile. // @ref: http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx 'SurfaceTablet' => 'Windows NT [0-9.]+; ARM;', // @ref: http://shopping1.hp.com/is-bin/INTERSHOP.enfinity/WFS/WW-USSMBPublicStore-Site/en_US/-/USD/ViewStandardCatalog-Browse?CatalogCategoryID=JfIQ7EN5lqMAAAEyDcJUDwMT 'HPTablet' => 'HP Slate 7|HP ElitePad 900|hp-tablet|EliteBook.*Touch', // @note: watch out for PadFone, see #132 'AsusTablet' => '^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\bK00F\b|TX201LA', 'BlackBerryTablet' => 'PlayBook|RIM Tablet', 'HTCtablet' => 'HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200', 'MotorolaTablet' => 'xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617', 'NookTablet' => 'Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2', // @ref: http://www.acer.ro/ac/ro/RO/content/drivers // @ref: http://www.packardbell.co.uk/pb/en/GB/content/download (Packard Bell is part of Acer) // @ref: http://us.acer.com/ac/en/US/content/group/tablets // @note: Can conflict with Micromax and Motorola phones codes. 'AcerTablet' => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810)\b|W3-810|\bA3-A10\b', // @ref: http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/ // @ref: http://us.toshiba.com/tablets/tablet-finder // @ref: http://www.toshiba.co.jp/regza/tablet/ 'ToshibaTablet' => 'Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO', // @ref: http://www.nttdocomo.co.jp/english/service/developer/smart_phone/technical_info/spec/index.html 'LGTablet' => '\bL-06C|LG-V900|LG-V500|LG-V909\b', 'FujitsuTablet' => 'Android.*\b(F-01D|F-05E|F-10D|M532|Q572)\b', // Prestigio Tablets http://www.prestigio.com/support 'PrestigioTablet' => 'PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD', // @ref: http://support.lenovo.com/en_GB/downloads/default.page?# 'LenovoTablet' => 'IdeaTab|S2110|S6000|K3011|A3000|A1000|A2107|A2109|A1107|ThinkPad([ ]+)?Tablet', // @ref: http://www.yarvik.com/en/matrix/tablets/ 'YarvikTablet' => 'Android.*\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\b', 'MedionTablet' => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB', 'ArnovaTablet' => 'AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT', // http://www.intenso.de/kategorie_en.php?kategorie=33 // @todo: http://www.nbhkdz.com/read/b8e64202f92a2df129126bff.html - investigate 'IntensoTablet' => 'INM8002KP|INM1010FP|INM805ND|Intenso Tab', // IRU.ru Tablets http://www.iru.ru/catalog/soho/planetable/ 'IRUTablet' => 'M702pro', 'MegafonTablet' => 'MegaFon V9|\bZTE V9\b|Android.*\bMT7A\b', // @ref: http://www.e-boda.ro/tablete-pc.html 'EbodaTablet' => 'E-Boda (Supreme|Impresspeed|Izzycomm|Essential)', // @ref: http://www.allview.ro/produse/droseries/lista-tablete-pc/ 'AllViewTablet' => 'Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)', // @reference: http://wiki.archosfans.com/index.php?title=Main_Page 'ArchosTablet' => '\b(101G9|80G9|A101IT)\b|Qilive 97R|ARCHOS 101G10', // @ref: http://www.ainol.com/plugin.php?identifier=ainol&module=product 'AinolTablet' => 'NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark', // @todo: inspect http://esupport.sony.com/US/p/select-system.pl?DIRECTOR=DRIVER // @ref: Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser // @ref: http://www.sony.jp/support/tablet/ 'SonyTablet' => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201', // @ref: db + http://www.cube-tablet.com/buy-products.html 'CubeTablet' => 'Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT', // @ref: http://www.cobyusa.com/?p=pcat&pcat_id=3001 'CobyTablet' => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010', // @ref: http://www.match.net.cn/products.asp 'MIDTablet' => 'M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733', // @ref: http://pdadb.net/index.php?m=pdalist&list=SMiT (NoName Chinese Tablets) // @ref: http://www.imp3.net/14/show.php?itemid=20454 'SMiTTablet' => 'Android.*(\bMID\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)', // @ref: http://www.rock-chips.com/index.php?do=prod&pid=2 'RockChipTablet' => 'Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A', // @ref: http://www.fly-phone.com/devices/tablets/ ; http://www.fly-phone.com/service/ 'FlyTablet' => 'IQ310|Fly Vision', // @ref: http://www.bqreaders.com/gb/tablets-prices-sale.html 'bqTablet' => 'bq.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant)|Maxwell.*Lite|Maxwell.*Plus', // @ref: http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290 // @ref: http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets) 'HuaweiTablet' => 'MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim', // Nec or Medias Tab 'NecTablet' => '\bN-06D|\bN-08D', // Pantech Tablets: http://www.pantechusa.com/phones/ 'PantechTablet' => 'Pantech.*P4100', // Broncho Tablets: http://www.broncho.cn/ (hard to find) 'BronchoTablet' => 'Broncho.*(N701|N708|N802|a710)', // @ref: http://versusuk.com/support.html 'VersusTablet' => 'TOUCHPAD.*[78910]|\bTOUCHTAB\b', // @ref: http://www.zync.in/index.php/our-products/tablet-phablets 'ZyncTablet' => 'z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900', // @ref: http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/ 'PositivoTablet' => 'TB07STA|TB10STA|TB07FTA|TB10FTA', // @ref: https://www.nabitablet.com/ 'NabiTablet' => 'Android.*\bNabi', 'KoboTablet' => 'Kobo Touch|\bK080\b|\bVox\b Build|\bArc\b Build', // French Danew Tablets http://www.danew.com/produits-tablette.php 'DanewTablet' => 'DSlide.*\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\b', // Texet Tablets and Readers http://www.texet.ru/tablet/ 'TexetTablet' => 'NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE', // @note: Avoid detecting 'PLAYSTATION 3' as mobile. 'PlaystationTablet' => 'Playstation.*(Portable|Vita)', // @ref: http://www.trekstor.de/surftabs.html 'TrekstorTablet' => 'ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2', // @ref: http://www.pyleaudio.com/Products.aspx?%2fproducts%2fPersonal-Electronics%2fTablets 'PyleAudioTablet' => '\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\b', // @ref: http://www.advandigital.com/index.php?link=content-product&jns=JP001 // @Note: because of the short codenames we have to include whitespaces to reduce the possible conflicts. 'AdvanTablet' => 'Android.* \b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\b ', // @ref: http://www.danytech.com/category/tablet-pc 'DanyTechTablet' => 'Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1', // @ref: http://www.galapad.net/product.html 'GalapadTablet' => 'Android.*\bG1\b', // @ref: http://www.micromaxinfo.com/tablet/funbook 'MicromaxTablet' => 'Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b', // http://www.karbonnmobiles.com/products_tablet.php 'KarbonnTablet' => 'Android.*\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\b', // @ref: http://www.myallfine.com/Products.asp 'AllFineTablet' => 'Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide', // @ref: http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr= 'PROSCANTablet' => '\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\b', // @ref: http://www.yonesnav.com/products/products.php 'YONESTablet' => 'BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026', // @ref: http://www.cjshowroom.com/eproducts.aspx?classcode=004001001 // China manufacturer makes tablets for different small brands (eg. http://www.zeepad.net/index.html) 'ChangJiaTablet' => 'TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503', // @ref: http://www.gloryunion.cn/products.asp // @ref: http://www.allwinnertech.com/en/apply/mobile.html // @ref: http://www.ptcl.com.pk/pd_content.php?pd_id=284 (EVOTAB) // @todo: Softwiner tablets? // aka. Cute or Cool tablets. Not sure yet, must research to avoid collisions. 'GUTablet' => 'TX-A1301|TX-M9002|Q702|kf026', // A12R|D75A|D77|D79|R83|A95|A106C|R15|A75|A76|D71|D72|R71|R73|R77|D82|R85|D92|A97|D92|R91|A10F|A77F|W71F|A78F|W78F|W81F|A97F|W91F|W97F|R16G|C72|C73E|K72|K73|R96G // @ref: http://www.pointofview-online.com/showroom.php?shop_mode=product_listing&category_id=118 'PointOfViewTablet' => 'TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10', // @ref: http://www.overmax.pl/pl/katalog-produktow,p8/tablety,c14/ // @todo: add more tests. 'OvermaxTablet' => 'OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)', // @ref: http://hclmetablet.com/India/index.php 'HCLTablet' => 'HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync', // @ref: http://www.edigital.hu/Tablet_es_e-book_olvaso/Tablet-c18385.html 'DPSTablet' => 'DPS Dream 9|DPS Dual 7', // @ref: http://www.visture.com/index.asp 'VistureTablet' => 'V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10', // @ref: http://www.mijncresta.nl/tablet 'CrestaTablet' => 'CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989', // MediaTek - http://www.mediatek.com/_en/01_products/02_proSys.php?cata_sn=1&cata1_sn=1&cata2_sn=309 'MediatekTablet' => '\bMT8125|MT8389|MT8135|MT8377\b', // Concorde tab 'ConcordeTablet' => 'Concorde([ ]+)?Tab|ConCorde ReadMan', // GoClever Tablets - http://www.goclever.com/uk/products,c1/tablet,c5/ 'GoCleverTablet' => 'GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042', // Modecom Tablets - http://www.modecom.eu/tablets/portal/ 'ModecomTablet' => 'FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003', // Vonino Tablets - http://www.vonino.eu/tablets 'VoninoTablet' => '\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\bQ8\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\b', // ECS Tablets - http://www.ecs.com.tw/ECSWebSite/Product/Product_Tablet_List.aspx?CategoryID=14&MenuID=107&childid=M_107&LanID=0 'ECSTablet' => 'V07OT2|TM105A|S10OT1|TR10CS1', // Storex Tablets - http://storex.fr/espace_client/support.html // @note: no need to add all the tablet codes since they are guided by the first regex. 'StorexTablet' => 'eZee[_\']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab', // Generic Vodafone tablets. 'VodafoneTablet' => 'SmartTab([ ]+)?[0-9]+|SmartTabII10', // French tablets - Essentiel B http://www.boulanger.fr/tablette_tactile_e-book/tablette_tactile_essentiel_b/cl_68908.htm?multiChoiceToDelete=brand&mc_brand=essentielb // Aka: http://www.essentielb.fr/ 'EssentielBTablet' => 'Smart[ \']?TAB[ ]+?[0-9]+|Family[ \']?TAB2', // Ross & Moor - http://ross-moor.ru/ 'RossMoorTablet' => 'RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711', // i-mobile http://product.i-mobilephone.com/Mobile_Device 'iMobileTablet' => 'i-mobile i-note', // @ref: http://www.tolino.de/de/vergleichen/ 'TolinoTablet' => 'tolino tab [0-9.]+|tolino shine', // AudioSonic - a Kmart brand // http://www.kmart.com.au/webapp/wcs/stores/servlet/Search?langId=-1&storeId=10701&catalogId=10001&categoryId=193001&pageSize=72¤tPage=1&searchCategory=193001%2b4294965664&sortBy=p_MaxPrice%7c1 'AudioSonicTablet' => '\bC-22Q|T7-QC|T-17B|T-17P\b', // AMPE Tablets - http://www.ampe.com.my/product-category/tablets/ // @todo: add them gradually to avoid conflicts. 'AMPETablet' => 'Android.* A78 ', // Skk Mobile - http://skkmobile.com.ph/product_tablets.php 'SkkTablet' => 'Android.* (SKYPAD|PHOENIX|CYCLOPS)', // Tecno Mobile (only tablet) - http://www.tecno-mobile.com/index.php/product?filterby=smart&list_order=all&page=1 'TecnoTablet' => 'TECNO P9', // JXD (consoles & tablets) - http://jxd.hk/products.asp?selectclassid=009008&clsid=3 'JXDTablet' => 'Android.*\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\b', // i-Joy tablets - http://www.i-joy.es/en/cat/products/tablets/ 'iJoyTablet' => 'Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)', // @ref: http://www.tesco.com/direct/hudl/ 'Hudl' => 'Hudl HT7S3', // @ref: http://www.telstra.com.au/home-phone/thub-2/ 'TelstraTablet' => 'T-Hub2', 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|ViewPad7|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|rk30sdk|\bEVOTAB\b|M758A|ET904|ALUMIUM10|Smartfren Tab', ); /** * List of mobile Operating Systems. * * @var array */ protected static $operatingSystems = array( 'AndroidOS' => 'Android', 'BlackBerryOS' => 'blackberry|\bBB10\b|rim tablet os', 'PalmOS' => 'PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino', 'SymbianOS' => 'Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b', // @reference: http://en.wikipedia.org/wiki/Windows_Mobile 'WindowsMobileOS' => 'Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;', // @reference: http://en.wikipedia.org/wiki/Windows_Phone // http://wifeng.cn/?r=blog&a=view&id=106 // http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx 'WindowsPhoneOS' => 'Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7', 'iOS' => '\biPhone.*Mobile|\biPod|\biPad', // http://en.wikipedia.org/wiki/MeeGo // @todo: research MeeGo in UAs 'MeeGoOS' => 'MeeGo', // http://en.wikipedia.org/wiki/Maemo // @todo: research Maemo in UAs 'MaemoOS' => 'Maemo', 'JavaOS' => 'J2ME/|\bMIDP\b|\bCLDC\b', // '|Java/' produces bug #135 'webOS' => 'webOS|hpwOS', 'badaOS' => '\bBada\b', 'BREWOS' => 'BREW', ); /** * List of mobile User Agents. * * @var array */ protected static $browsers = array( // @reference: https://developers.google.com/chrome/mobile/docs/user-agent 'Chrome' => '\bCrMo\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?', 'Dolfin' => '\bDolfin\b', 'Opera' => 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+|Coast/[0-9.]+', 'Skyfire' => 'Skyfire', 'IE' => 'IEMobile|MSIEMobile', // |Trident/[.0-9]+ 'Firefox' => 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile', 'Bolt' => 'bolt', 'TeaShark' => 'teashark', 'Blazer' => 'Blazer', // @reference: http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/OptimizingforSafarioniPhone/OptimizingforSafarioniPhone.html#//apple_ref/doc/uid/TP40006517-SW3 'Safari' => 'Version.*Mobile.*Safari|Safari.*Mobile', // @ref: http://en.wikipedia.org/wiki/Midori_(web_browser) //'Midori' => 'midori', 'Tizen' => 'Tizen', 'UCBrowser' => 'UC.*Browser|UCWEB', // @ref: https://github.com/serbanghita/Mobile-Detect/issues/7 'DiigoBrowser' => 'DiigoBrowser', // http://www.puffinbrowser.com/index.php 'Puffin' => 'Puffin', // @ref: http://mercury-browser.com/index.html 'Mercury' => '\bMercury\b', // @reference: http://en.wikipedia.org/wiki/Minimo // http://en.wikipedia.org/wiki/Vision_Mobile_Browser 'GenericBrowser' => 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger' ); /** * Utilities. * * @var array */ protected static $utilities = array( // Experimental. When a mobile device wants to switch to 'Desktop Mode'. // @ref: http://scottcate.com/technology/windows-phone-8-ie10-desktop-or-mobile/ // @ref: https://github.com/serbanghita/Mobile-Detect/issues/57#issuecomment-15024011 'DesktopMode' => 'WPDesktop', 'TV' => 'SonyDTV|HbbTV', // experimental 'WebKit' => '(webkit)[ /]([\w.]+)', 'Bot' => 'Googlebot|DoCoMo|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|facebookexternalhit', 'MobileBot' => 'Googlebot-Mobile|DoCoMo|YahooSeeker/M1A1-R2D2', // @todo: Include JXD consoles. 'Console' => '\b(Nintendo|Nintendo WiiU|PLAYSTATION|Xbox)\b', 'Watch' => 'SM-V700', ); /** * All possible HTTP headers that represent the * User-Agent string. * * @var array */ protected static $uaHttpHeaders = array( // The default User-Agent string. 'HTTP_USER_AGENT', // Header can occur on devices using Opera Mini. 'HTTP_X_OPERAMINI_PHONE_UA', // Vodafone specific header: http://www.seoprinciple.com/mobile-web-community-still-angry-at-vodafone/24/ 'HTTP_X_DEVICE_USER_AGENT', 'HTTP_X_ORIGINAL_USER_AGENT', 'HTTP_X_SKYFIRE_PHONE', 'HTTP_X_BOLT_PHONE_UA', 'HTTP_DEVICE_STOCK_UA', 'HTTP_X_UCBROWSER_DEVICE_UA' ); /** * The individual segments that could exist in a User-Agent string. VER refers to the regular * expression defined in the constant self::VER. * * @var array */ protected static $properties = array( // Build 'Mobile' => 'Mobile/[VER]', 'Build' => 'Build/[VER]', 'Version' => 'Version/[VER]', 'VendorID' => 'VendorID/[VER]', // Devices 'iPad' => 'iPad.*CPU[a-z ]+[VER]', 'iPhone' => 'iPhone.*CPU[a-z ]+[VER]', 'iPod' => 'iPod.*CPU[a-z ]+[VER]', //'BlackBerry' => array('BlackBerry[VER]', 'BlackBerry [VER];'), 'Kindle' => 'Kindle/[VER]', // Browser 'Chrome' => array('Chrome/[VER]', 'CriOS/[VER]', 'CrMo/[VER]'), 'Coast' => array('Coast/[VER]'), 'Dolfin' => 'Dolfin/[VER]', // @reference: https://developer.mozilla.org/en-US/docs/User_Agent_Strings_Reference 'Firefox' => 'Firefox/[VER]', 'Fennec' => 'Fennec/[VER]', // @reference: http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx 'IE' => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];'), // http://en.wikipedia.org/wiki/NetFront 'NetFront' => 'NetFront/[VER]', 'NokiaBrowser' => 'NokiaBrowser/[VER]', 'Opera' => array( ' OPR/[VER]', 'Opera Mini/[VER]', 'Version/[VER]' ), 'Opera Mini' => 'Opera Mini/[VER]', 'Opera Mobi' => 'Version/[VER]', 'UC Browser' => 'UC Browser[VER]', 'MQQBrowser' => 'MQQBrowser/[VER]', 'MicroMessenger' => 'MicroMessenger/[VER]', // @note: Safari 7534.48.3 is actually Version 5.1. // @note: On BlackBerry the Version is overwriten by the OS. 'Safari' => array( 'Version/[VER]', 'Safari/[VER]' ), 'Skyfire' => 'Skyfire/[VER]', 'Tizen' => 'Tizen/[VER]', 'Webkit' => 'webkit[ /][VER]', // Engine 'Gecko' => 'Gecko/[VER]', 'Trident' => 'Trident/[VER]', 'Presto' => 'Presto/[VER]', // OS 'iOS' => ' \bOS\b [VER] ', 'Android' => 'Android [VER]', 'BlackBerry' => array('BlackBerry[\w]+/[VER]', 'BlackBerry.*Version/[VER]', 'Version/[VER]'), 'BREW' => 'BREW [VER]', 'Java' => 'Java/[VER]', // @reference: http://windowsteamblog.com/windows_phone/b/wpdev/archive/2011/08/29/introducing-the-ie9-on-windows-phone-mango-user-agent-string.aspx // @reference: http://en.wikipedia.org/wiki/Windows_NT#Releases 'Windows Phone OS' => array( 'Windows Phone OS [VER]', 'Windows Phone [VER]'), 'Windows Phone' => 'Windows Phone [VER]', 'Windows CE' => 'Windows CE/[VER]', // http://social.msdn.microsoft.com/Forums/en-US/windowsdeveloperpreviewgeneral/thread/6be392da-4d2f-41b4-8354-8dcee20c85cd 'Windows NT' => 'Windows NT [VER]', 'Symbian' => array('SymbianOS/[VER]', 'Symbian/[VER]'), 'webOS' => array('webOS/[VER]', 'hpwOS/[VER];'), ); /** * Construct an instance of this class. * * @param array $headers Specify the headers as injection. Should be PHP _SERVER flavored. * If left empty, will use the global _SERVER['HTTP_*'] vars instead. * @param string $userAgent Inject the User-Agent header. If null, will use HTTP_USER_AGENT * from the $headers array instead. */ public function __construct( array $headers = null, $userAgent = null ){ $this->setHttpHeaders($headers); $this->setUserAgent($userAgent); } /** * Get the current script version. * This is useful for the demo.php file, * so people can check on what version they are testing * for mobile devices. * * @return string The version number in semantic version format. */ public static function getScriptVersion() { return self::VERSION; } /** * Set the HTTP Headers. Must be PHP-flavored. This method will reset existing headers. * * @param array $httpHeaders The headers to set. If null, then using PHP's _SERVER to extract * the headers. The default null is left for backwards compatibilty. */ public function setHttpHeaders($httpHeaders = null) { //use global _SERVER if $httpHeaders aren't defined if (!is_array($httpHeaders) || !count($httpHeaders)) { $httpHeaders = $_SERVER; } //clear existing headers $this->httpHeaders = array(); //Only save HTTP headers. In PHP land, that means only _SERVER vars that //start with HTTP_. foreach ($httpHeaders as $key => $value) { if (substr($key,0,5) == 'HTTP_') { $this->httpHeaders[$key] = $value; } } } /** * Retrieves the HTTP headers. * * @return array */ public function getHttpHeaders() { return $this->httpHeaders; } /** * Retrieves a particular header. If it doesn't exist, no exception/error is caused. * Simply null is returned. * * @param string $header The name of the header to retrieve. Can be HTTP compliant such as * "User-Agent" or "X-Device-User-Agent" or can be php-esque with the * all-caps, HTTP_ prefixed, underscore seperated awesomeness. * * @return string|null The value of the header. */ public function getHttpHeader($header) { //are we using PHP-flavored headers? if (strpos($header, '_') === false) { $header = str_replace('-', '_', $header); $header = strtoupper($header); } //test the alternate, too $altHeader = 'HTTP_' . $header; //Test both the regular and the HTTP_ prefix if (isset($this->httpHeaders[$header])) { return $this->httpHeaders[$header]; } elseif (isset($this->httpHeaders[$altHeader])) { return $this->httpHeaders[$altHeader]; } } public function getMobileHeaders() { return self::$mobileHeaders; } /** * Get all possible HTTP headers that * can contain the User-Agent string. * * @return array List of HTTP headers. */ public function getUaHttpHeaders() { return self::$uaHttpHeaders; } /** * Set the User-Agent to be used. * * @param string $userAgent The user agent string to set. */ public function setUserAgent($userAgent = null) { if (!empty($userAgent)) { return $this->userAgent = $userAgent; } else { $this->userAgent = null; foreach($this->getUaHttpHeaders() as $altHeader){ if(!empty($this->httpHeaders[$altHeader])){ // @todo: should use getHttpHeader(), but it would be slow. (Serban) $this->userAgent .= $this->httpHeaders[$altHeader] . " "; } } return $this->userAgent = (!empty($this->userAgent) ? trim($this->userAgent) : null); } } /** * Retrieve the User-Agent. * * @return string|null The user agent if it's set. */ public function getUserAgent() { return $this->userAgent; } /** * Set the detection type. Must be one of self::DETECTION_TYPE_MOBILE or * self::DETECTION_TYPE_EXTENDED. Otherwise, nothing is set. * * @deprecated since version 2.6.9 * * @param string $type The type. Must be a self::DETECTION_TYPE_* constant. The default * parameter is null which will default to self::DETECTION_TYPE_MOBILE. */ public function setDetectionType($type = null) { if ($type === null) { $type = self::DETECTION_TYPE_MOBILE; } if ($type != self::DETECTION_TYPE_MOBILE && $type != self::DETECTION_TYPE_EXTENDED) { return; } $this->detectionType = $type; } /** * Retrieve the list of known phone devices. * * @return array List of phone devices. */ public static function getPhoneDevices() { return self::$phoneDevices; } /** * Retrieve the list of known tablet devices. * * @return array List of tablet devices. */ public static function getTabletDevices() { return self::$tabletDevices; } /** * Alias for getBrowsers() method. * * @return array List of user agents. */ public static function getUserAgents() { return self::getBrowsers(); } /** * Retrieve the list of known browsers. Specifically, the user agents. * * @return array List of browsers / user agents. */ public static function getBrowsers() { return self::$browsers; } /** * Retrieve the list of known utilities. * * @return array List of utilities. */ public static function getUtilities() { return self::$utilities; } /** * Method gets the mobile detection rules. This method is used for the magic methods $detect->is*(). * * @deprecated since version 2.6.9 * * @return array All the rules (but not extended). */ public static function getMobileDetectionRules() { static $rules; if (!$rules) { $rules = array_merge( self::$phoneDevices, self::$tabletDevices, self::$operatingSystems, self::$browsers ); } return $rules; } /** * Method gets the mobile detection rules + utilities. * The reason this is separate is because utilities rules * don't necessary imply mobile. This method is used inside * the new $detect->is('stuff') method. * * @deprecated since version 2.6.9 * * @return array All the rules + extended. */ public function getMobileDetectionRulesExtended() { static $rules; if (!$rules) { // Merge all rules together. $rules = array_merge( self::$phoneDevices, self::$tabletDevices, self::$operatingSystems, self::$browsers, self::$utilities ); } return $rules; } /** * Retrieve the current set of rules. * * @deprecated since version 2.6.9 * * @return array */ public function getRules() { if ($this->detectionType == self::DETECTION_TYPE_EXTENDED) { return self::getMobileDetectionRulesExtended(); } else { return self::getMobileDetectionRules(); } } /** * Retrieve the list of mobile operating systems. * * @return array The list of mobile operating systems. */ public static function getOperatingSystems() { return self::$operatingSystems; } /** * Check the HTTP headers for signs of mobile. * This is the fastest mobile check possible; it's used * inside isMobile() method. * * @return bool */ public function checkHttpHeadersForMobile() { foreach($this->getMobileHeaders() as $mobileHeader => $matchType){ if( isset($this->httpHeaders[$mobileHeader]) ){ if( is_array($matchType['matches']) ){ foreach($matchType['matches'] as $_match){ if( strpos($this->httpHeaders[$mobileHeader], $_match) !== false ){ return true; } } return false; } else { return true; } } } return false; } /** * Magic overloading method. * * @method boolean is[...]() * @param string $name * @param array $arguments * @return mixed * @throws BadMethodCallException when the method doesn't exist and doesn't start with 'is' */ public function __call($name, $arguments) { //make sure the name starts with 'is', otherwise if (substr($name, 0, 2) != 'is') { throw new BadMethodCallException("No such method exists: $name"); } $this->setDetectionType(self::DETECTION_TYPE_MOBILE); $key = substr($name, 2); return $this->matchUAAgainstKey($key); } /** * Find a detection rule that matches the current User-agent. * * @param null $userAgent deprecated * @return boolean */ protected function matchDetectionRulesAgainstUA($userAgent = null) { // Begin general search. foreach ($this->getRules() as $_regex) { if (empty($_regex)) { continue; } if ($this->match($_regex, $userAgent)) { return true; } } return false; } /** * Search for a certain key in the rules array. * If the key is found the try to match the corresponding * regex agains the User-Agent. * * @param string $key * @param null $userAgent deprecated * @return mixed */ protected function matchUAAgainstKey($key, $userAgent = null) { // Make the keys lowercase so we can match: isIphone(), isiPhone(), isiphone(), etc. $key = strtolower($key); //change the keys to lower case $_rules = array_change_key_case($this->getRules()); if (array_key_exists($key, $_rules)) { if (empty($_rules[$key])) { return null; } return $this->match($_rules[$key], $userAgent); } return false; } /** * Check if the device is mobile. * Returns true if any type of mobile device detected, including special ones * @param null $userAgent deprecated * @param null $httpHeaders deprecated * @return bool */ public function isMobile($userAgent = null, $httpHeaders = null) { if ($httpHeaders) { $this->setHttpHeaders($httpHeaders); } if ($userAgent) { $this->setUserAgent($userAgent); } $this->setDetectionType(self::DETECTION_TYPE_MOBILE); if ($this->checkHttpHeadersForMobile()) { return true; } else { return $this->matchDetectionRulesAgainstUA(); } } /** * Check if the device is a tablet. * Return true if any type of tablet device is detected. * * @param string $userAgent deprecated * @param array $httpHeaders deprecated * @return bool */ public function isTablet($userAgent = null, $httpHeaders = null) { $this->setDetectionType(self::DETECTION_TYPE_MOBILE); foreach (self::$tabletDevices as $_regex) { if ($this->match($_regex, $userAgent)) { return true; } } return false; } /** * This method checks for a certain property in the * userAgent. * @todo: The httpHeaders part is not yet used. * * @param $key * @param string $userAgent deprecated * @param string $httpHeaders deprecated * @return bool|int|null */ public function is($key, $userAgent = null, $httpHeaders = null) { // Set the UA and HTTP headers only if needed (eg. batch mode). if ($httpHeaders) { $this->setHttpHeaders($httpHeaders); } if ($userAgent) { $this->setUserAgent($userAgent); } $this->setDetectionType(self::DETECTION_TYPE_EXTENDED); return $this->matchUAAgainstKey($key); } /** * Some detection rules are relative (not standard), * because of the diversity of devices, vendors and * their conventions in representing the User-Agent or * the HTTP headers. * * This method will be used to check custom regexes against * the User-Agent string. * * @param $regex * @param string $userAgent * @return bool * * @todo: search in the HTTP headers too. */ public function match($regex, $userAgent = null) { // Escape the special character which is the delimiter. $regex = str_replace('/', '\/', $regex); return (bool) preg_match('/'.$regex.'/is', (!empty($userAgent) ? $userAgent : $this->userAgent)); } /** * Get the properties array. * * @return array */ public static function getProperties() { return self::$properties; } /** * Prepare the version number. * * @todo Remove the error supression from str_replace() call. * * @param string $ver The string version, like "2.6.21.2152"; * * @return float */ public function prepareVersionNo($ver) { $ver = str_replace(array('_', ' ', '/'), '.', $ver); $arrVer = explode('.', $ver, 2); if (isset($arrVer[1])) { $arrVer[1] = @str_replace('.', '', $arrVer[1]); // @todo: treat strings versions. } return (float) implode('.', $arrVer); } /** * Check the version of the given property in the User-Agent. * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31) * * @param string $propertyName The name of the property. See self::getProperties() array * keys for all possible properties. * @param string $type Either self::VERSION_TYPE_STRING to get a string value or * self::VERSION_TYPE_FLOAT indicating a float value. This parameter * is optional and defaults to self::VERSION_TYPE_STRING. Passing an * invalid parameter will default to the this type as well. * * @return string|float The version of the property we are trying to extract. */ public function version($propertyName, $type = self::VERSION_TYPE_STRING) { if (empty($propertyName)) { return false; } //set the $type to the default if we don't recognize the type if ($type != self::VERSION_TYPE_STRING && $type != self::VERSION_TYPE_FLOAT) { $type = self::VERSION_TYPE_STRING; } $properties = self::getProperties(); // Check if the property exists in the properties array. if (array_key_exists($propertyName, $properties)) { // Prepare the pattern to be matched. // Make sure we always deal with an array (string is converted). $properties[$propertyName] = (array) $properties[$propertyName]; foreach ($properties[$propertyName] as $propertyMatchString) { $propertyPattern = str_replace('[VER]', self::VER, $propertyMatchString); // Escape the special character which is the delimiter. $propertyPattern = str_replace('/', '\/', $propertyPattern); // Identify and extract the version. preg_match('/'.$propertyPattern.'/is', $this->userAgent, $match); if (!empty($match[1])) { $version = ( $type == self::VERSION_TYPE_FLOAT ? $this->prepareVersionNo($match[1]) : $match[1] ); return $version; } } } return false; } /** * Retrieve the mobile grading, using self::MOBILE_GRADE_* constants. * * @return string One of the self::MOBILE_GRADE_* constants. */ public function mobileGrade() { $isMobile = $this->isMobile(); if ( // Apple iOS 3.2-5.1 - Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3), iPad 3 (5.1), original iPhone (3.1), iPhone 3 (3.2), 3GS (4.3), 4 (4.3 / 5.0), and 4S (5.1) $this->version('iPad', self::VERSION_TYPE_FLOAT)>=4.3 || $this->version('iPhone', self::VERSION_TYPE_FLOAT)>=3.1 || $this->version('iPod', self::VERSION_TYPE_FLOAT)>=3.1 || // Android 2.1-2.3 - Tested on the HTC Incredible (2.2), original Droid (2.2), HTC Aria (2.1), Google Nexus S (2.3). Functional on 1.5 & 1.6 but performance may be sluggish, tested on Google G1 (1.5) // Android 3.1 (Honeycomb) - Tested on the Samsung Galaxy Tab 10.1 and Motorola XOOM // Android 4.0 (ICS) - Tested on a Galaxy Nexus. Note: transition performance can be poor on upgraded devices // Android 4.1 (Jelly Bean) - Tested on a Galaxy Nexus and Galaxy 7 ( $this->version('Android', self::VERSION_TYPE_FLOAT)>2.1 && $this->is('Webkit') ) || // Windows Phone 7-7.5 - Tested on the HTC Surround (7.0) HTC Trophy (7.5), LG-E900 (7.5), Nokia Lumia 800 $this->version('Windows Phone OS', self::VERSION_TYPE_FLOAT)>=7.0 || // Blackberry 7 - Tested on BlackBerry® Torch 9810 // Blackberry 6.0 - Tested on the Torch 9800 and Style 9670 $this->is('BlackBerry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)>=6.0 || // Blackberry Playbook (1.0-2.0) - Tested on PlayBook $this->match('Playbook.*Tablet') || // Palm WebOS (1.4-2.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0) ( $this->version('webOS', self::VERSION_TYPE_FLOAT)>=1.4 && $this->match('Palm|Pre|Pixi') ) || // Palm WebOS 3.0 - Tested on HP TouchPad $this->match('hp.*TouchPad') || // Firefox Mobile (12 Beta) - Tested on Android 2.3 device ( $this->is('Firefox') && $this->version('Firefox', self::VERSION_TYPE_FLOAT)>=12 ) || // Chrome for Android - Tested on Android 4.0, 4.1 device ( $this->is('Chrome') && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT)>=4.0 ) || // Skyfire 4.1 - Tested on Android 2.3 device ( $this->is('Skyfire') && $this->version('Skyfire', self::VERSION_TYPE_FLOAT)>=4.1 && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 ) || // Opera Mobile 11.5-12: Tested on Android 2.3 ( $this->is('Opera') && $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT)>11 && $this->is('AndroidOS') ) || // Meego 1.2 - Tested on Nokia 950 and N9 $this->is('MeeGoOS') || // Tizen (pre-release) - Tested on early hardware $this->is('Tizen') || // Samsung Bada 2.0 - Tested on a Samsung Wave 3, Dolphin browser // @todo: more tests here! $this->is('Dolfin') && $this->version('Bada', self::VERSION_TYPE_FLOAT)>=2.0 || // UC Browser - Tested on Android 2.3 device ( ($this->is('UC Browser') || $this->is('Dolfin')) && $this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 ) || // Kindle 3 and Fire - Tested on the built-in WebKit browser for each ( $this->match('Kindle Fire') || $this->is('Kindle') && $this->version('Kindle', self::VERSION_TYPE_FLOAT)>=3.0 ) || // Nook Color 1.4.1 - Tested on original Nook Color, not Nook Tablet $this->is('AndroidOS') && $this->is('NookTablet') || // Chrome Desktop 11-21 - Tested on OS X 10.7 and Windows 7 $this->version('Chrome', self::VERSION_TYPE_FLOAT)>=11 && !$isMobile || // Safari Desktop 4-5 - Tested on OS X 10.7 and Windows 7 $this->version('Safari', self::VERSION_TYPE_FLOAT)>=5.0 && !$isMobile || // Firefox Desktop 4-13 - Tested on OS X 10.7 and Windows 7 $this->version('Firefox', self::VERSION_TYPE_FLOAT)>=4.0 && !$isMobile || // Internet Explorer 7-9 - Tested on Windows XP, Vista and 7 $this->version('MSIE', self::VERSION_TYPE_FLOAT)>=7.0 && !$isMobile || // Opera Desktop 10-12 - Tested on OS X 10.7 and Windows 7 // @reference: http://my.opera.com/community/openweb/idopera/ $this->version('Opera', self::VERSION_TYPE_FLOAT)>=10 && !$isMobile ){ return self::MOBILE_GRADE_A; } if ( $this->version('iPad', self::VERSION_TYPE_FLOAT)<4.3 || $this->version('iPhone', self::VERSION_TYPE_FLOAT)<3.1 || $this->version('iPod', self::VERSION_TYPE_FLOAT)<3.1 || // Blackberry 5.0: Tested on the Storm 2 9550, Bold 9770 $this->is('Blackberry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)>=5 && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<6 || //Opera Mini (5.0-6.5) - Tested on iOS 3.2/4.3 and Android 2.3 ( $this->version('Opera Mini', self::VERSION_TYPE_FLOAT)>=5.0 && $this->version('Opera Mini', self::VERSION_TYPE_FLOAT)<=6.5 && ($this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 || $this->is('iOS')) ) || // Nokia Symbian^3 - Tested on Nokia N8 (Symbian^3), C7 (Symbian^3), also works on N97 (Symbian^1) $this->match('NokiaN8|NokiaC7|N97.*Series60|Symbian/3') || // @todo: report this (tested on Nokia N71) $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT)>=11 && $this->is('SymbianOS') ){ return self::MOBILE_GRADE_B; } if ( // Blackberry 4.x - Tested on the Curve 8330 $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<5.0 || // Windows Mobile - Tested on the HTC Leo (WinMo 5.2) $this->match('MSIEMobile|Windows CE.*Mobile') || $this->version('Windows Mobile', self::VERSION_TYPE_FLOAT)<=5.2 ){ return self::MOBILE_GRADE_C; } //All older smartphone platforms and featurephones - Any device that doesn't support media queries //will receive the basic, C grade experience. return self::MOBILE_GRADE_C; } /** * return device type */ public function type() { $response = array( 'type' => 'desktop', 'device' => '', ); if ($this->isMobile()) { $response['type'] = 'mobile'; foreach (self::$phoneDevices as $key=>$val) { if ($this->is($key)) { $response['device'] = $key; } } } if ($this->isTablet()) { $response['type'] = 'tablet'; foreach (self::$tabletDevices as $key=>$val) { if ($this->is($key)) { $response['device'] = $key; } } } return $response; } } } // end class exists! ˀL  5q,smartSEO/lib/scripts/php-query/php-query.php ob * @license http://www.opensource.org/licenses/mit-license.php MIT License * @package pspphpQuery */ // class names for instanceof // TODO move them as class constants into pspphpQuery if ( !defined('DOMDOCUMENT') ) { define('DOMDOCUMENT', 'DOMDocument'); } if ( !defined('DOMELEMENT') ) { define('DOMELEMENT', 'DOMElement'); } if ( !defined('DOMNODELIST') ) { define('DOMNODELIST', 'DOMNodeList'); } if ( !defined('DOMNODE') ) { define('DOMNODE', 'DOMNode'); } /** * pspDOMEvent class. * * Based on * @link http://developer.mozilla.org/En/DOM:event * @author Tobiasz Cudnik * @package pspphpQuery * @todo implement ArrayAccess ? */ class pspDOMEvent { /** * Returns a boolean indicating whether the event bubbles up through the DOM or not. * * @var unknown_type */ public $bubbles = true; /** * Returns a boolean indicating whether the event is cancelable. * * @var unknown_type */ public $cancelable = true; /** * Returns a reference to the currently registered target for the event. * * @var unknown_type */ public $currentTarget; /** * Returns detail about the event, depending on the type of event. * * @var unknown_type * @link http://developer.mozilla.org/en/DOM/event.detail */ public $detail; // ??? /** * Used to indicate which phase of the event flow is currently being evaluated. * * NOT IMPLEMENTED * * @var unknown_type * @link http://developer.mozilla.org/en/DOM/event.eventPhase */ public $eventPhase; // ??? /** * The explicit original target of the event (Mozilla-specific). * * NOT IMPLEMENTED * * @var unknown_type */ public $explicitOriginalTarget; // moz only /** * The original target of the event, before any retargetings (Mozilla-specific). * * NOT IMPLEMENTED * * @var unknown_type */ public $originalTarget; // moz only /** * Identifies a secondary target for the event. * * @var unknown_type */ public $relatedTarget; /** * Returns a reference to the target to which the event was originally dispatched. * * @var unknown_type */ public $target; /** * Returns the time that the event was created. * * @var unknown_type */ public $timeStamp; /** * Returns the name of the event (case-insensitive). */ public $type; public $runDefault = true; public $data = null; public function __construct($data) { foreach($data as $k => $v) { $this->$k = $v; } if (! $this->timeStamp) $this->timeStamp = time(); } /** * Cancels the event (if it is cancelable). * */ public function preventDefault() { $this->runDefault = false; } /** * Stops the propagation of events further along in the DOM. * */ public function stopPropagation() { $this->bubbles = false; } } /** * pspDOMDocumentWrapper class simplifies work with DOMDocument. * * Know bug: * - in XHTML fragments,
    changes to
    * * @todo check XML catalogs compatibility * @author Tobiasz Cudnik * @package pspphpQuery */ class pspDOMDocumentWrapper { /** * @var DOMDocument */ public $document; public $id; /** * @todo Rewrite as method and quess if null. * @var unknown_type */ public $contentType = ''; public $xpath; public $uuid = 0; public $data = array(); public $dataNodes = array(); public $events = array(); public $eventsNodes = array(); public $eventsGlobal = array(); /** * @TODO iframes support http://code.google.com/p/phpquery/issues/detail?id=28 * @var unknown_type */ public $frames = array(); /** * Document root, by default equals to document itself. * Used by documentFragments. * * @var DOMNode */ public $root; public $isDocumentFragment; public $isXML = false; public $isXHTML = false; public $isHTML = false; public $charset; public function __construct($markup = null, $contentType = null, $newDocumentID = null) { if (isset($markup)) $this->load($markup, $contentType, $newDocumentID); $this->id = $newDocumentID ? $newDocumentID : md5(microtime()); } public function load($markup, $contentType = null, $newDocumentID = null) { // pspphpQuery::$documents[$id] = $this; $this->contentType = strtolower($contentType); if ($markup instanceof DOMDOCUMENT) { $this->document = $markup; $this->root = $this->document; $this->charset = $this->document->encoding; // TODO isDocumentFragment } else { $loaded = $this->loadMarkup($markup); } if ($loaded) { // $this->document->formatOutput = true; $this->document->preserveWhiteSpace = true; $this->xpath = new DOMXPath($this->document); $this->afterMarkupLoad(); return true; // remember last loaded document // return pspphpQuery::selectDocument($id); } return false; } protected function afterMarkupLoad() { if ($this->isXHTML) { $this->xpath->registerNamespace("html", "http://www.w3.org/1999/xhtml"); } } protected function loadMarkup($markup) { $loaded = false; if ($this->contentType) { self::debug("Load markup for content type {$this->contentType}"); // content determined by contentType list($contentType, $charset) = $this->contentTypeToArray($this->contentType); switch($contentType) { case 'text/html': pspphpQuery::debug("Loading HTML, content type '{$this->contentType}'"); $loaded = $this->loadMarkupHTML($markup, $charset); break; case 'text/xml': case 'application/xhtml+xml': pspphpQuery::debug("Loading XML, content type '{$this->contentType}'"); $loaded = $this->loadMarkupXML($markup, $charset); break; default: // for feeds or anything that sometimes doesn't use text/xml if (strpos('xml', $this->contentType) !== false) { pspphpQuery::debug("Loading XML, content type '{$this->contentType}'"); $loaded = $this->loadMarkupXML($markup, $charset); } else pspphpQuery::debug("Could not determine document type from content type '{$this->contentType}'"); } } else { // content type autodetection if ($this->isXML($markup)) { pspphpQuery::debug("Loading XML, isXML() == true"); $loaded = $this->loadMarkupXML($markup); if (! $loaded && $this->isXHTML) { pspphpQuery::debug('Loading as XML failed, trying to load as HTML, isXHTML == true'); $loaded = $this->loadMarkupHTML($markup); } } else { pspphpQuery::debug("Loading HTML, isXML() == false"); $loaded = $this->loadMarkupHTML($markup); } } return $loaded; } protected function loadMarkupReset() { $this->isXML = $this->isXHTML = $this->isHTML = false; } protected function documentCreate($charset, $version = '1.0') { if (! $version) $version = '1.0'; $this->document = new DOMDocument($version, $charset); $this->charset = $this->document->encoding; // $this->document->encoding = $charset; $this->document->formatOutput = true; $this->document->preserveWhiteSpace = true; } protected function loadMarkupHTML($markup, $requestedCharset = null) { if (pspphpQuery::$debug) pspphpQuery::debug('Full markup load (HTML): '.substr($markup, 0, 250)); $this->loadMarkupReset(); $this->isHTML = true; if (!isset($this->isDocumentFragment)) $this->isDocumentFragment = self::isDocumentFragmentHTML($markup); $charset = null; $documentCharset = $this->charsetFromHTML($markup); $addDocumentCharset = false; if ($documentCharset) { $charset = $documentCharset; $markup = $this->charsetFixHTML($markup); } else if ($requestedCharset) { $charset = $requestedCharset; } if (! $charset) $charset = pspphpQuery::$defaultCharset; // HTTP 1.1 says that the default charset is ISO-8859-1 // @see http://www.w3.org/International/O-HTTP-charset if (! $documentCharset) { $documentCharset = 'ISO-8859-1'; $addDocumentCharset = true; } // Should be careful here, still need 'magic encoding detection' since lots of pages have other 'default encoding' // Worse, some pages can have mixed encodings... we'll try not to worry about that $requestedCharset = strtoupper($requestedCharset); $documentCharset = strtoupper($documentCharset); pspphpQuery::debug("DOC: $documentCharset REQ: $requestedCharset"); if ($requestedCharset && $documentCharset && $requestedCharset !== $documentCharset) { pspphpQuery::debug("CHARSET CONVERT"); // Document Encoding Conversion // http://code.google.com/p/phpquery/issues/detail?id=86 if (function_exists('mb_detect_encoding')) { $possibleCharsets = array($documentCharset, $requestedCharset, 'AUTO'); $docEncoding = mb_detect_encoding($markup, implode(', ', $possibleCharsets)); if (! $docEncoding) $docEncoding = $documentCharset; // ok trust the document pspphpQuery::debug("DETECTED '$docEncoding'"); // Detected does not match what document says... if ($docEncoding !== $documentCharset) { // Tricky.. } if ($docEncoding !== $requestedCharset) { pspphpQuery::debug("CONVERT $docEncoding => $requestedCharset"); $markup = mb_convert_encoding($markup, $requestedCharset, $docEncoding); $markup = $this->charsetAppendToHTML($markup, $requestedCharset); $charset = $requestedCharset; } } else { pspphpQuery::debug("TODO: charset conversion without mbstring..."); } } $return = false; if ($this->isDocumentFragment) { pspphpQuery::debug("Full markup load (HTML), DocumentFragment detected, using charset '$charset'"); $return = $this->documentFragmentLoadMarkup($this, $charset, $markup); } else { if ($addDocumentCharset) { pspphpQuery::debug("Full markup load (HTML), appending charset: '$charset'"); $markup = $this->charsetAppendToHTML($markup, $charset); } pspphpQuery::debug("Full markup load (HTML), documentCreate('$charset')"); $this->documentCreate($charset); $return = pspphpQuery::$debug === 2 ? $this->document->loadHTML($markup) : @$this->document->loadHTML($markup); if ($return) $this->root = $this->document; } if ($return && ! $this->contentType) $this->contentType = 'text/html'; return $return; } protected function loadMarkupXML($markup, $requestedCharset = null) { if (pspphpQuery::$debug) pspphpQuery::debug('Full markup load (XML): '.substr($markup, 0, 250)); $this->loadMarkupReset(); $this->isXML = true; // check agains XHTML in contentType or markup $isContentTypeXHTML = $this->isXHTML(); $isMarkupXHTML = $this->isXHTML($markup); if ($isContentTypeXHTML || $isMarkupXHTML) { self::debug('Full markup load (XML), XHTML detected'); $this->isXHTML = true; } // determine document fragment if (! isset($this->isDocumentFragment)) $this->isDocumentFragment = $this->isXHTML ? self::isDocumentFragmentXHTML($markup) : self::isDocumentFragmentXML($markup); // this charset will be used $charset = null; // charset from XML declaration @var string $documentCharset = $this->charsetFromXML($markup); if (! $documentCharset) { if ($this->isXHTML) { // this is XHTML, try to get charset from content-type meta header $documentCharset = $this->charsetFromHTML($markup); if ($documentCharset) { pspphpQuery::debug("Full markup load (XML), appending XHTML charset '$documentCharset'"); $this->charsetAppendToXML($markup, $documentCharset); $charset = $documentCharset; } } if (! $documentCharset) { // if still no document charset... $charset = $requestedCharset; } } else if ($requestedCharset) { $charset = $requestedCharset; } if (! $charset) { $charset = pspphpQuery::$defaultCharset; } if ($requestedCharset && $documentCharset && $requestedCharset != $documentCharset) { // TODO place for charset conversion // $charset = $requestedCharset; } $return = false; if ($this->isDocumentFragment) { pspphpQuery::debug("Full markup load (XML), DocumentFragment detected, using charset '$charset'"); $return = $this->documentFragmentLoadMarkup($this, $charset, $markup); } else { // FIXME ??? if ($isContentTypeXHTML && ! $isMarkupXHTML) if (! $documentCharset) { pspphpQuery::debug("Full markup load (XML), appending charset '$charset'"); $markup = $this->charsetAppendToXML($markup, $charset); } // see http://pl2.php.net/manual/en/book.dom.php#78929 // LIBXML_DTDLOAD (>= PHP 5.1) // does XML ctalogues works with LIBXML_NONET // $this->document->resolveExternals = true; // TODO test LIBXML_COMPACT for performance improvement // create document $this->documentCreate($charset); if (phpversion() < 5.1) { $this->document->resolveExternals = true; $return = pspphpQuery::$debug === 2 ? $this->document->loadXML($markup) : @$this->document->loadXML($markup); } else { /** @link http://pl2.php.net/manual/en/libxml.constants.php */ $libxmlStatic = pspphpQuery::$debug === 2 ? LIBXML_DTDLOAD|LIBXML_DTDATTR|LIBXML_NONET : LIBXML_DTDLOAD|LIBXML_DTDATTR|LIBXML_NONET|LIBXML_NOWARNING|LIBXML_NOERROR; $return = $this->document->loadXML($markup, $libxmlStatic); // if (! $return) // $return = $this->document->loadHTML($markup); } if ($return) $this->root = $this->document; } if ($return) { if (! $this->contentType) { if ($this->isXHTML) $this->contentType = 'application/xhtml+xml'; else $this->contentType = 'text/xml'; } return $return; } else { throw new Exception("Error loading XML markup"); } } protected function isXHTML($markup = null) { if (! isset($markup)) { return strpos($this->contentType, 'xhtml') !== false; } // XXX ok ? return strpos($markup, "doctype) && is_object($dom->doctype) // ? $dom->doctype->publicId // : self::$defaultDoctype; } protected function isXML($markup) { // return strpos($markup, ']+http-equiv\\s*=\\s*(["|\'])Content-Type\\1([^>]+?)>@i', $markup, $matches ); if (! isset($matches[0])) return array(null, null); // get attr 'content' preg_match('@content\\s*=\\s*(["|\'])(.+?)\\1@', $matches[0], $matches); if (! isset($matches[0])) return array(null, null); return $this->contentTypeToArray($matches[2]); } protected function charsetFromHTML($markup) { $contentType = $this->contentTypeFromHTML($markup); return $contentType[1]; } protected function charsetFromXML($markup) { $matches; // find declaration preg_match('@<'.'?xml[^>]+encoding\\s*=\\s*(["|\'])(.*?)\\1@i', $markup, $matches ); return isset($matches[2]) ? strtolower($matches[2]) : null; } /** * Repositions meta[type=charset] at the start of head. Bypasses DOMDocument bug. * * @link http://code.google.com/p/phpquery/issues/detail?id=80 * @param $html */ protected function charsetFixHTML($markup) { $matches = array(); // find meta tag preg_match('@\s*]+http-equiv\\s*=\\s*(["|\'])Content-Type\\1([^>]+?)>@i', $markup, $matches, PREG_OFFSET_CAPTURE ); if (! isset($matches[0])) return; $metaContentType = $matches[0][0]; $markup = substr($markup, 0, $matches[0][1]) .substr($markup, $matches[0][1]+strlen($metaContentType)); $headStart = stripos($markup, ''); $markup = substr($markup, 0, $headStart+6).$metaContentType .substr($markup, $headStart+6); return $markup; } protected function charsetAppendToHTML($html, $charset, $xhtml = false) { // remove existing meta[type=content-type] $html = preg_replace('@\s*]+http-equiv\\s*=\\s*(["|\'])Content-Type\\1([^>]+?)>@i', '', $html); $meta = ''; if (strpos($html, ')@s', "{$meta}", $html ); } } else { return preg_replace( '@)@s', ''.$meta, $html ); } } protected function charsetAppendToXML($markup, $charset) { $declaration = '<'.'?xml version="1.0" encoding="'.$charset.'"?'.'>'; return $declaration.$markup; } public static function isDocumentFragmentHTML($markup) { return stripos($markup, 'documentFragmentCreate($node, $sourceCharset); // if ($fake === false) // throw new Exception("Error loading documentFragment markup"); // else // $return = array_merge($return, // $this->import($fake->root->childNodes) // ); // } else { // $return[] = $this->document->importNode($node, true); // } // } // return $return; // } else { // // string markup // $fake = $this->documentFragmentCreate($source, $sourceCharset); // if ($fake === false) // throw new Exception("Error loading documentFragment markup"); // else // return $this->import($fake->root->childNodes); // } if (is_array($source) || $source instanceof DOMNODELIST) { // dom nodes self::debug('Importing nodes to document'); foreach($source as $node) $return[] = $this->document->importNode($node, true); } else { // string markup $fake = $this->documentFragmentCreate($source, $sourceCharset); if ($fake === false) throw new Exception("Error loading documentFragment markup"); else return $this->import($fake->root->childNodes); } return $return; } /** * Creates new document fragment. * * @param $source * @return pspDOMDocumentWrapper */ protected function documentFragmentCreate($source, $charset = null) { $fake = new pspDOMDocumentWrapper(); $fake->contentType = $this->contentType; $fake->isXML = $this->isXML; $fake->isHTML = $this->isHTML; $fake->isXHTML = $this->isXHTML; $fake->root = $fake->document; if (! $charset) $charset = $this->charset; // $fake->documentCreate($this->charset); if ($source instanceof DOMNODE && !($source instanceof DOMNODELIST)) $source = array($source); if (is_array($source) || $source instanceof DOMNODELIST) { // dom nodes // load fake document if (! $this->documentFragmentLoadMarkup($fake, $charset)) return false; $nodes = $fake->import($source); foreach($nodes as $node) $fake->root->appendChild($node); } else { // string markup $this->documentFragmentLoadMarkup($fake, $charset, $source); } return $fake; } /** * * @param $document pspDOMDocumentWrapper * @param $markup * @return $document */ private function documentFragmentLoadMarkup($fragment, $charset, $markup = null) { // TODO error handling // TODO copy doctype // tempolary turn off $fragment->isDocumentFragment = false; if ($fragment->isXML) { if ($fragment->isXHTML) { // add FAKE element to set default namespace $fragment->loadMarkupXML('' .'' .''.$markup.''); $fragment->root = $fragment->document->firstChild->nextSibling; } else { $fragment->loadMarkupXML(''.$markup.''); $fragment->root = $fragment->document->firstChild; } } else { $markup2 = pspphpQuery::$defaultDoctype.''; $noBody = strpos($markup, 'loadMarkupHTML($markup2); // TODO resolv body tag merging issue $fragment->root = $noBody ? $fragment->document->firstChild->nextSibling->firstChild->nextSibling : $fragment->document->firstChild->nextSibling->firstChild->nextSibling; } if (! $fragment->root) return false; $fragment->isDocumentFragment = true; return true; } protected function documentFragmentToMarkup($fragment) { pspphpQuery::debug('documentFragmentToMarkup'); $tmp = $fragment->isDocumentFragment; $fragment->isDocumentFragment = false; $markup = $fragment->markup(); if ($fragment->isXML) { $markup = substr($markup, 0, strrpos($markup, '')); if ($fragment->isXHTML) { $markup = substr($markup, strpos($markup, '')+6); } } else { $markup = substr($markup, strpos($markup, '')+6); $markup = substr($markup, 0, strrpos($markup, '')); } $fragment->isDocumentFragment = $tmp; if (pspphpQuery::$debug) pspphpQuery::debug('documentFragmentToMarkup: '.substr($markup, 0, 150)); return $markup; } /** * Return document markup, starting with optional $nodes as root. * * @param $nodes DOMNode|DOMNodeList * @return string */ public function markup($nodes = null, $innerMarkup = false) { if (isset($nodes) && count($nodes) == 1 && $nodes[0] instanceof DOMDOCUMENT) $nodes = null; if (isset($nodes)) { $markup = ''; if (!is_array($nodes) && !($nodes instanceof DOMNODELIST) ) $nodes = array($nodes); if ($this->isDocumentFragment && ! $innerMarkup) foreach($nodes as $i => $node) if ($node->isSameNode($this->root)) { // var_dump($node); $nodes = array_slice($nodes, 0, $i) + pspphpQuery::DOMNodeListToArray($node->childNodes) + array_slice($nodes, $i+1); } if ($this->isXML && ! $innerMarkup) { self::debug("Getting outerXML with charset '{$this->charset}'"); // we need outerXML, so we can benefit from // $node param support in saveXML() foreach($nodes as $node) $markup .= $this->document->saveXML($node); } else { $loop = array(); if ($innerMarkup) foreach($nodes as $node) { if ($node->childNodes) foreach($node->childNodes as $child) $loop[] = $child; else $loop[] = $node; } else $loop = $nodes; self::debug("Getting markup, moving selected nodes (".count($loop).") to new DocumentFragment"); $fake = $this->documentFragmentCreate($loop); $markup = $this->documentFragmentToMarkup($fake); } if ($this->isXHTML) { self::debug("Fixing XHTML"); $markup = self::markupFixXHTML($markup); } self::debug("Markup: ".substr($markup, 0, 250)); return $markup; } else { if ($this->isDocumentFragment) { // documentFragment, html only... self::debug("Getting markup, DocumentFragment detected"); // return $this->markup( //// $this->document->getElementsByTagName('body')->item(0) // $this->document->root, true // ); $markup = $this->documentFragmentToMarkup($this); // no need for markupFixXHTML, as it's done thought markup($nodes) method return $markup; } else { self::debug("Getting markup (".($this->isXML?'XML':'HTML')."), final with charset '{$this->charset}'"); $markup = $this->isXML ? $this->document->saveXML() : $this->document->saveHTML(); if ($this->isXHTML) { self::debug("Fixing XHTML"); $markup = self::markupFixXHTML($markup); } self::debug("Markup: ".substr($markup, 0, 250)); return $markup; } } } protected static function markupFixXHTML($markup) { $markup = self::expandEmptyTag('script', $markup); $markup = self::expandEmptyTag('select', $markup); $markup = self::expandEmptyTag('textarea', $markup); return $markup; } public static function debug($text) { pspphpQuery::debug($text); } /** * expandEmptyTag * * @param $tag * @param $xml * @return unknown_type * @author mjaque at ilkebenson dot com * @link http://php.net/manual/en/domdocument.savehtml.php#81256 */ public static function expandEmptyTag($tag, $xml){ $indice = 0; while ($indice< strlen($xml)){ $pos = strpos($xml, "<$tag ", $indice); if ($pos){ $posCierre = strpos($xml, ">", $pos); if ($xml[$posCierre-1] == "/"){ $xml = substr_replace($xml, ">", $posCierre-1, 2); } $indice = $posCierre; } else break; } return $xml; } } /** * Event handling class. * * @author Tobiasz Cudnik * @package pspphpQuery * @static */ abstract class psppspphpQueryEvents { /** * Trigger a type of event on every matched element. * * @param DOMNode|pspphpQueryObject|string $document * @param unknown_type $type * @param unknown_type $data * * @TODO exclusive events (with !) * @TODO global events (test) * @TODO support more than event in $type (space-separated) */ public static function trigger($document, $type, $data = array(), $node = null) { // trigger: function(type, data, elem, donative, extra) { $documentID = pspphpQuery::getDocumentID($document); $namespace = null; if (strpos($type, '.') !== false) list($name, $namespace) = explode('.', $type); else $name = $type; if (! $node) { if (self::issetGlobal($documentID, $type)) { $pq = pspphpQuery::getDocument($documentID); // TODO check add($pq->document) $pq->find('*')->add($pq->document) ->trigger($type, $data); } } else { if (isset($data[0]) && $data[0] instanceof pspDOMEvent) { $event = $data[0]; $event->relatedTarget = $event->target; $event->target = $node; $data = array_slice($data, 1); } else { $event = new pspDOMEvent(array( 'type' => $type, 'target' => $node, 'timeStamp' => time(), )); } $i = 0; while($node) { // TODO whois pspphpQuery::debug("Triggering ".($i?"bubbled ":'')."event '{$type}' on " ."node \n");//.pspphpQueryObject::whois($node)."\n"); $event->currentTarget = $node; $eventNode = self::getNode($documentID, $node); if (isset($eventNode->eventHandlers)) { foreach($eventNode->eventHandlers as $eventType => $handlers) { $eventNamespace = null; if (strpos($type, '.') !== false) list($eventName, $eventNamespace) = explode('.', $eventType); else $eventName = $eventType; if ($name != $eventName) continue; if ($namespace && $eventNamespace && $namespace != $eventNamespace) continue; foreach($handlers as $handler) { pspphpQuery::debug("Calling event handler\n"); $event->data = $handler['data'] ? $handler['data'] : null; $params = array_merge(array($event), $data); $return = pspphpQuery::callbackRun($handler['callback'], $params); if ($return === false) { $event->bubbles = false; } } } } // to bubble or not to bubble... if (! $event->bubbles) break; $node = $node->parentNode; $i++; } } } /** * Binds a handler to one or more events (like click) for each matched element. * Can also bind custom events. * * @param DOMNode|pspphpQueryObject|string $document * @param unknown_type $type * @param unknown_type $data Optional * @param unknown_type $callback * * @TODO support '!' (exclusive) events * @TODO support more than event in $type (space-separated) * @TODO support binding to global events */ public static function add($document, $node, $type, $data, $callback = null) { pspphpQuery::debug("Binding '$type' event"); $documentID = pspphpQuery::getDocumentID($document); // if (is_null($callback) && is_callable($data)) { // $callback = $data; // $data = null; // } $eventNode = self::getNode($documentID, $node); if (! $eventNode) $eventNode = self::setNode($documentID, $node); if (!isset($eventNode->eventHandlers[$type])) $eventNode->eventHandlers[$type] = array(); $eventNode->eventHandlers[$type][] = array( 'callback' => $callback, 'data' => $data, ); } /** * Enter description here... * * @param DOMNode|pspphpQueryObject|string $document * @param unknown_type $type * @param unknown_type $callback * * @TODO namespace events * @TODO support more than event in $type (space-separated) */ public static function remove($document, $node, $type = null, $callback = null) { $documentID = pspphpQuery::getDocumentID($document); $eventNode = self::getNode($documentID, $node); if (is_object($eventNode) && isset($eventNode->eventHandlers[$type])) { if ($callback) { foreach($eventNode->eventHandlers[$type] as $k => $handler) if ($handler['callback'] == $callback) unset($eventNode->eventHandlers[$type][$k]); } else { unset($eventNode->eventHandlers[$type]); } } } protected static function getNode($documentID, $node) { foreach(pspphpQuery::$documents[$documentID]->eventsNodes as $eventNode) { if ($node->isSameNode($eventNode)) return $eventNode; } } protected static function setNode($documentID, $node) { pspphpQuery::$documents[$documentID]->eventsNodes[] = $node; return pspphpQuery::$documents[$documentID]->eventsNodes[ count(pspphpQuery::$documents[$documentID]->eventsNodes)-1 ]; } protected static function issetGlobal($documentID, $type) { return isset(pspphpQuery::$documents[$documentID]) ? in_array($type, pspphpQuery::$documents[$documentID]->eventsGlobal) : false; } } interface pspIpspCallbackNamed { function hasName(); function getName(); } /** * pspCallback class introduces currying-like pattern. * * Example: * function foo($param1, $param2, $param3) { * var_dump($param1, $param2, $param3); * } * $fooCurried = new pspCallback('foo', * 'param1 is now statically set', * new pspCallbackParam, new pspCallbackParam * ); * pspphpQuery::callbackRun($fooCurried, * array('param2 value', 'param3 value' * ); * * pspCallback class is supported in all pspphpQuery methods which accepts callbacks. * * @link http://code.google.com/p/phpquery/wiki/pspCallbacks#Param_Structures * @author Tobiasz Cudnik * * @TODO??? return fake forwarding function created via create_function * @TODO honor paramStructure */ class pspCallback implements pspIpspCallbackNamed { public $callback = null; public $params = null; protected $name; public function __construct($callback, $param1 = null, $param2 = null, $param3 = null) { $params = func_get_args(); $params = array_slice($params, 1); if ($callback instanceof pspCallback) { // TODO implement recurention } else { $this->callback = $callback; $this->params = $params; } } public function getName() { return 'pspCallback: '.$this->name; } public function hasName() { return isset($this->name) && $this->name; } public function setName($name) { $this->name = $name; return $this; } // TODO test me // public function addParams() { // $params = func_get_args(); // return new pspCallback($this->callback, $this->params+$params); // } } /** * Shorthand for new pspCallback(create_function(...), ...); * * @author Tobiasz Cudnik */ class pspCallbackBody extends pspCallback { public function __construct($paramList, $code, $param1 = null, $param2 = null, $param3 = null) { $params = func_get_args(); $params = array_slice($params, 2); $this->callback = create_function($paramList, $code); $this->params = $params; } } /** * pspCallback type which on execution returns reference passed during creation. * * @author Tobiasz Cudnik */ class pspCallbackReturnReference extends pspCallback implements pspIpspCallbackNamed { protected $reference; public function __construct(&$reference, $name = null){ $this->reference =& $reference; $this->callback = array($this, 'callback'); } public function callback() { return $this->reference; } public function getName() { return 'pspCallback: '.$this->name; } public function hasName() { return isset($this->name) && $this->name; } } /** * pspCallback type which on execution returns value passed during creation. * * @author Tobiasz Cudnik */ class pspCallbackReturnValue extends pspCallback implements pspIpspCallbackNamed { protected $value; protected $name; public function __construct($value, $name = null){ $this->value =& $value; $this->name = $name; $this->callback = array($this, 'callback'); } public function callback() { return $this->value; } public function __toString() { return $this->getName(); } public function getName() { return 'pspCallback: '.$this->name; } public function hasName() { return isset($this->name) && $this->name; } } /** * pspCallbackParameterToReference can be used when we don't really want a callback, * only parameter passed to it. pspCallbackParameterToReference takes first * parameter's value and passes it to reference. * * @author Tobiasz Cudnik */ class pspCallbackParameterToReference extends pspCallback { /** * @param $reference * @TODO implement $paramIndex; * param index choose which callback param will be passed to reference */ public function __construct(&$reference){ $this->callback =& $reference; } } //class pspCallbackReference extends pspCallback { // /** // * // * @param $reference // * @param $paramIndex // * @todo implement $paramIndex; param index choose which callback param will be passed to reference // */ // public function __construct(&$reference, $name = null){ // $this->callback =& $reference; // } //} class pspCallbackParam {} /** * Class representing pspphpQuery objects. * * @author Tobiasz Cudnik * @package pspphpQuery * @method pspphpQueryObject clone() clone() * @method pspphpQueryObject empty() empty() * @method pspphpQueryObject next() next($selector = null) * @method pspphpQueryObject prev() prev($selector = null) * @property Int $length */ class pspphpQueryObject implements Iterator, Countable, ArrayAccess { public $documentID = null; /** * DOMDocument class. * * @var DOMDocument */ public $document = null; public $charset = null; /** * * @var pspDOMDocumentWrapper */ public $documentWrapper = null; /** * XPath interface. * * @var DOMXPath */ public $xpath = null; /** * Stack of selected elements. * @TODO refactor to ->nodes * @var array */ public $elements = array(); /** * @access private */ protected $elementsBackup = array(); /** * @access private */ protected $previous = null; /** * @access private * @TODO deprecate */ protected $root = array(); /** * Indicated if doument is just a fragment (no tag). * * Every document is realy a full document, so even documentFragments can * be queried against , but getDocument(id)->htmlOuter() will return * only contents of . * * @var bool */ public $documentFragment = true; /** * Iterator interface helper * @access private */ protected $elementsInterator = array(); /** * Iterator interface helper * @access private */ protected $valid = false; /** * Iterator interface helper * @access private */ protected $current = null; /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function __construct($documentID) { // if ($documentID instanceof self) // var_dump($documentID->getDocumentID()); $id = $documentID instanceof self ? $documentID->getDocumentID() : $documentID; // var_dump($id); if (! isset(pspphpQuery::$documents[$id] )) { // var_dump(pspphpQuery::$documents); throw new Exception("Document with ID '{$id}' isn't loaded. Use pspphpQuery::newDocument(\$html) or pspphpQuery::newDocumentFile(\$file) first."); } $this->documentID = $id; $this->documentWrapper =& pspphpQuery::$documents[$id]; $this->document =& $this->documentWrapper->document; $this->xpath =& $this->documentWrapper->xpath; $this->charset =& $this->documentWrapper->charset; $this->documentFragment =& $this->documentWrapper->isDocumentFragment; // TODO check $this->DOM->documentElement; // $this->root = $this->document->documentElement; $this->root =& $this->documentWrapper->root; // $this->toRoot(); $this->elements = array($this->root); } /** * * @access private * @param $attr * @return unknown_type */ public function __get($attr) { switch($attr) { // FIXME doesnt work at all ? case 'length': return $this->size(); break; default: return $this->$attr; } } /** * Saves actual object to $var by reference. * Useful when need to break chain. * @param pspphpQueryObject $var * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function toReference(&$var) { return $var = $this; } public function documentFragment($state = null) { if ($state) { pspphpQuery::$documents[$this->getDocumentID()]['documentFragment'] = $state; return $this; } return $this->documentFragment; } /** * @access private * @TODO documentWrapper */ protected function isRoot( $node) { // return $node instanceof DOMDOCUMENT || $node->tagName == 'html'; return $node instanceof DOMDOCUMENT || ($node instanceof DOMELEMENT && $node->tagName == 'html') || $this->root->isSameNode($node); } /** * @access private */ protected function stackIsRoot() { return $this->size() == 1 && $this->isRoot($this->elements[0]); } /** * Enter description here... * NON JQUERY METHOD * * Watch out, it doesn't creates new instance, can be reverted with end(). * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function toRoot() { $this->elements = array($this->root); return $this; // return $this->newInstance(array($this->root)); } /** * Saves object's DocumentID to $var by reference. * * $myDocumentId; * pspphpQuery::newDocument('
    ') * ->getDocumentIDRef($myDocumentId) * ->find('div')->... * * * @param unknown_type $domId * @see pspphpQuery::newDocument * @see pspphpQuery::newDocumentFile * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function getDocumentIDRef(&$documentID) { $documentID = $this->getDocumentID(); return $this; } /** * Returns object with stack set to document root. * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function getDocument() { return pspphpQuery::getDocument($this->getDocumentID()); } /** * * @return DOMDocument */ public function getDOMDocument() { return $this->document; } /** * Get object's Document ID. * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function getDocumentID() { return $this->documentID; } /** * Unloads whole document from memory. * CAUTION! None further operations will be possible on this document. * All objects refering to it will be useless. * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function unloadDocument() { pspphpQuery::unloadDocuments($this->getDocumentID()); } public function isHTML() { return $this->documentWrapper->isHTML; } public function isXHTML() { return $this->documentWrapper->isXHTML; } public function isXML() { return $this->documentWrapper->isXML; } /** * Enter description here... * * @link http://docs.jquery.com/Ajax/serialize * @return string */ public function serialize() { return pspphpQuery::param($this->serializeArray()); } /** * Enter description here... * * @link http://docs.jquery.com/Ajax/serializeArray * @return array */ public function serializeArray($submit = null) { $source = $this->filter('form, input, select, textarea') ->find('input, select, textarea') ->andSelf() ->not('form'); $return = array(); // $source->dumpDie(); foreach($source as $input) { $input = pspphpQuery::pspPQ($input); if ($input->is('[disabled]')) continue; if (!$input->is('[name]')) continue; if ($input->is('[type=checkbox]') && !$input->is('[checked]')) continue; // jquery diff if ($submit && $input->is('[type=submit]')) { if ($submit instanceof DOMELEMENT && ! $input->elements[0]->isSameNode($submit)) continue; else if (is_string($submit) && $input->attr('name') != $submit) continue; } $return[] = array( 'name' => $input->attr('name'), 'value' => $input->val(), ); } return $return; } /** * @access private */ protected function debug($in) { if (! pspphpQuery::$debug ) return; print('
    ');
    		print_r($in);
    		// file debug
    //		file_put_contents(dirname(__FILE__).'/pspphpQuery.log', print_r($in, true)."\n", FILE_APPEND);
    		// quite handy debug trace
    //		if ( is_array($in))
    //			print_r(array_slice(debug_backtrace(), 3));
    		print("
    \n"); } /** * @access private */ protected function isRegexp($pattern) { return in_array( $pattern[ mb_strlen($pattern)-1 ], array('^','*','$') ); } /** * Determines if $char is really a char. * * @param string $char * @return bool * @todo rewrite me to charcode range ! ;) * @access private */ protected function isChar($char) { return extension_loaded('mbstring') && pspphpQuery::$mbstringSupport ? mb_eregi('\w', $char) : preg_match('@\w@', $char); } /** * @access private */ protected function parseSelector($query) { // clean spaces // TODO include this inside parsing ? $query = trim( preg_replace('@\s+@', ' ', preg_replace('@\s*(>|\\+|~)\s*@', '\\1', $query) ) ); $queries = array(array()); if (! $query) return $queries; $return =& $queries[0]; $specialChars = array('>',' '); // $specialCharsMapping = array('/' => '>'); $specialCharsMapping = array(); $strlen = mb_strlen($query); $classChars = array('.', '-'); $pseudoChars = array('-'); $tagChars = array('*', '|', '-'); // split multibyte string // http://code.google.com/p/phpquery/issues/detail?id=76 $_query = array(); for ($i=0; $i<$strlen; $i++) $_query[] = mb_substr($query, $i, 1); $query = $_query; // it works, but i dont like it... $i = 0; while( $i < $strlen) { $c = $query[$i]; $tmp = ''; // TAG if ($this->isChar($c) || in_array($c, $tagChars)) { while(isset($query[$i]) && ($this->isChar($query[$i]) || in_array($query[$i], $tagChars))) { $tmp .= $query[$i]; $i++; } $return[] = $tmp; // IDs } else if ( $c == '#') { $i++; while( isset($query[$i]) && ($this->isChar($query[$i]) || $query[$i] == '-')) { $tmp .= $query[$i]; $i++; } $return[] = '#'.$tmp; // SPECIAL CHARS } else if (in_array($c, $specialChars)) { $return[] = $c; $i++; // MAPPED SPECIAL MULTICHARS // } else if ( $c.$query[$i+1] == '//') { // $return[] = ' '; // $i = $i+2; // MAPPED SPECIAL CHARS } else if ( isset($specialCharsMapping[$c])) { $return[] = $specialCharsMapping[$c]; $i++; // COMMA } else if ( $c == ',') { $queries[] = array(); $return =& $queries[ count($queries)-1 ]; $i++; while( isset($query[$i]) && $query[$i] == ' ') $i++; // CLASSES } else if ($c == '.') { while( isset($query[$i]) && ($this->isChar($query[$i]) || in_array($query[$i], $classChars))) { $tmp .= $query[$i]; $i++; } $return[] = $tmp; // ~ General Sibling Selector } else if ($c == '~') { $spaceAllowed = true; $tmp .= $query[$i++]; while( isset($query[$i]) && ($this->isChar($query[$i]) || in_array($query[$i], $classChars) || $query[$i] == '*' || ($query[$i] == ' ' && $spaceAllowed) )) { if ($query[$i] != ' ') $spaceAllowed = false; $tmp .= $query[$i]; $i++; } $return[] = $tmp; // + Adjacent sibling selectors } else if ($c == '+') { $spaceAllowed = true; $tmp .= $query[$i++]; while( isset($query[$i]) && ($this->isChar($query[$i]) || in_array($query[$i], $classChars) || $query[$i] == '*' || ($spaceAllowed && $query[$i] == ' ') )) { if ($query[$i] != ' ') $spaceAllowed = false; $tmp .= $query[$i]; $i++; } $return[] = $tmp; // ATTRS } else if ($c == '[') { $stack = 1; $tmp .= $c; while( isset($query[++$i])) { $tmp .= $query[$i]; if ( $query[$i] == '[') { $stack++; } else if ( $query[$i] == ']') { $stack--; if (! $stack ) break; } } $return[] = $tmp; $i++; // PSEUDO CLASSES } else if ($c == ':') { $stack = 1; $tmp .= $query[$i++]; while( isset($query[$i]) && ($this->isChar($query[$i]) || in_array($query[$i], $pseudoChars))) { $tmp .= $query[$i]; $i++; } // with arguments ? if ( isset($query[$i]) && $query[$i] == '(') { $tmp .= $query[$i]; $stack = 1; while( isset($query[++$i])) { $tmp .= $query[$i]; if ( $query[$i] == '(') { $stack++; } else if ( $query[$i] == ')') { $stack--; if (! $stack ) break; } } $return[] = $tmp; $i++; } else { $return[] = $tmp; } } else { $i++; } } foreach($queries as $k => $q) { if (isset($q[0])) { if (isset($q[0][0]) && $q[0][0] == ':') array_unshift($queries[$k], '*'); if ($q[0] != '>') array_unshift($queries[$k], ' '); } } return $queries; } /** * Return matched DOM nodes. * * @param int $index * @return array|DOMElement Single DOMElement or array of DOMElement. */ public function get($index = null, $callback1 = null, $callback2 = null, $callback3 = null) { $return = isset($index) ? (isset($this->elements[$index]) ? $this->elements[$index] : null) : $this->elements; // pass thou callbacks $args = func_get_args(); $args = array_slice($args, 1); foreach($args as $callback) { if (is_array($return)) foreach($return as $k => $v) $return[$k] = pspphpQuery::callbackRun($callback, array($v)); else $return = pspphpQuery::callbackRun($callback, array($return)); } return $return; } /** * Return matched DOM nodes. * jQuery difference. * * @param int $index * @return array|string Returns string if $index != null * @todo implement callbacks * @todo return only arrays ? * @todo maybe other name... */ public function getString($index = null, $callback1 = null, $callback2 = null, $callback3 = null) { if ($index) $return = $this->eq($index)->text(); else { $return = array(); for($i = 0; $i < $this->size(); $i++) { $return[] = $this->eq($i)->text(); } } // pass thou callbacks $args = func_get_args(); $args = array_slice($args, 1); foreach($args as $callback) { $return = pspphpQuery::callbackRun($callback, array($return)); } return $return; } /** * Return matched DOM nodes. * jQuery difference. * * @param int $index * @return array|string Returns string if $index != null * @todo implement callbacks * @todo return only arrays ? * @todo maybe other name... */ public function getStrings($index = null, $callback1 = null, $callback2 = null, $callback3 = null) { if ($index) $return = $this->eq($index)->text(); else { $return = array(); for($i = 0; $i < $this->size(); $i++) { $return[] = $this->eq($i)->text(); } // pass thou callbacks $args = func_get_args(); $args = array_slice($args, 1); } foreach($args as $callback) { if (is_array($return)) foreach($return as $k => $v) $return[$k] = pspphpQuery::callbackRun($callback, array($v)); else $return = pspphpQuery::callbackRun($callback, array($return)); } return $return; } /** * Returns new instance of actual class. * * @param array $newStack Optional. Will replace old stack with new and move old one to history.c */ public function newInstance($newStack = null) { $class = get_class($this); // support inheritance by passing old object to overloaded constructor $new = $class != 'pspphpQuery' ? new $class($this, $this->getDocumentID()) : new pspphpQueryObject($this->getDocumentID()); $new->previous = $this; if (is_null($newStack)) { $new->elements = $this->elements; if ($this->elementsBackup) $this->elements = $this->elementsBackup; } else if (is_string($newStack)) { $new->elements = pspphpQuery::pspPQ($newStack, $this->getDocumentID())->stack(); } else { $new->elements = $newStack; } return $new; } /** * Enter description here... * * In the future, when PHP will support XLS 2.0, then we would do that this way: * contains(tokenize(@class, '\s'), "something") * @param unknown_type $class * @param unknown_type $node * @return boolean * @access private */ protected function matchClasses($class, $node) { // multi-class if ( mb_strpos($class, '.', 1)) { $classes = explode('.', substr($class, 1)); $classesCount = count( $classes ); $nodeClasses = explode(' ', $node->getAttribute('class') ); $nodeClassesCount = count( $nodeClasses ); if ( $classesCount > $nodeClassesCount ) return false; $diff = count( array_diff( $classes, $nodeClasses ) ); if (! $diff ) return true; // single-class } else { return in_array( // strip leading dot from class name substr($class, 1), // get classes for element as array explode(' ', $node->getAttribute('class') ) ); } } /** * @access private */ protected function runQuery($XQuery, $selector = null, $compare = null) { if ($compare && ! method_exists($this, $compare)) return false; $stack = array(); if (! $this->elements) $this->debug('Stack empty, skipping...'); // var_dump($this->elements[0]->nodeType); // element, document foreach($this->stack(array(1, 9, 13)) as $k => $stackNode) { $detachAfter = false; // to work on detached nodes we need temporary place them somewhere // thats because context xpath queries sucks ;] $testNode = $stackNode; while ($testNode) { if (! $testNode->parentNode && ! $this->isRoot($testNode)) { $this->root->appendChild($testNode); $detachAfter = $testNode; break; } $testNode = isset($testNode->parentNode) ? $testNode->parentNode : null; } // XXX tmp ? $xpath = $this->documentWrapper->isXHTML ? $this->getNodeXpath($stackNode, 'html') : $this->getNodeXpath($stackNode); // FIXME pseudoclasses-only query, support XML $query = $XQuery == '//' && $xpath == '/html[1]' ? '//*' : $xpath.$XQuery; $this->debug("XPATH: {$query}"); // run query, get elements $nodes = $this->xpath->query($query); $this->debug("QUERY FETCHED"); if (! $nodes->length ) $this->debug('Nothing found'); $debug = array(); foreach($nodes as $node) { $matched = false; if ( $compare) { pspphpQuery::$debug ? $this->debug("Found: ".$this->whois( $node ).", comparing with {$compare}()") : null; $pspphpQueryDebug = pspphpQuery::$debug; pspphpQuery::$debug = false; // TODO ??? use pspphpQuery::callbackRun() if (call_user_func_array(array($this, $compare), array($selector, $node))) $matched = true; pspphpQuery::$debug = $pspphpQueryDebug; } else { $matched = true; } if ( $matched) { if (pspphpQuery::$debug) $debug[] = $this->whois( $node ); $stack[] = $node; } } if (pspphpQuery::$debug) { $this->debug("Matched ".count($debug).": ".implode(', ', $debug)); } if ($detachAfter) $this->root->removeChild($detachAfter); } $this->elements = $stack; } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function find($selectors, $context = null, $noHistory = false) { if (!$noHistory) // backup last stack /for end()/ $this->elementsBackup = $this->elements; // allow to define context // TODO combine code below with pspphpQuery::pspPQ() context guessing code // as generic function if ($context) { if (! is_array($context) && $context instanceof DOMELEMENT) $this->elements = array($context); else if (is_array($context)) { $this->elements = array(); foreach ($context as $c) if ($c instanceof DOMELEMENT) $this->elements[] = $c; } else if ( $context instanceof self ) $this->elements = $context->elements; } $queries = $this->parseSelector($selectors); $this->debug(array('FIND', $selectors, $queries)); $XQuery = ''; // remember stack state because of multi-queries $oldStack = $this->elements; // here we will be keeping found elements $stack = array(); foreach($queries as $selector) { $this->elements = $oldStack; $delimiterBefore = false; foreach($selector as $s) { // TAG $isTag = extension_loaded('mbstring') && pspphpQuery::$mbstringSupport ? mb_ereg_match('^[\w|\||-]+$', $s) || $s == '*' : preg_match('@^[\w|\||-]+$@', $s) || $s == '*'; if ($isTag) { if ($this->isXML()) { // namespace support if (mb_strpos($s, '|') !== false) { $ns = $tag = null; list($ns, $tag) = explode('|', $s); $XQuery .= "$ns:$tag"; } else if ($s == '*') { $XQuery .= "*"; } else { $XQuery .= "*[local-name()='$s']"; } } else { $XQuery .= $s; } // ID } else if ($s[0] == '#') { if ($delimiterBefore) $XQuery .= '*'; $XQuery .= "[@id='".substr($s, 1)."']"; // ATTRIBUTES } else if ($s[0] == '[') { if ($delimiterBefore) $XQuery .= '*'; // strip side brackets $attr = trim($s, ']['); $execute = false; // attr with specifed value if (mb_strpos($s, '=')) { $value = null; list($attr, $value) = explode('=', $attr); $value = trim($value, "'\""); if ($this->isRegexp($attr)) { // cut regexp character $attr = substr($attr, 0, -1); $execute = true; $XQuery .= "[@{$attr}]"; } else { $XQuery .= "[@{$attr}='{$value}']"; } // attr without specified value } else { $XQuery .= "[@{$attr}]"; } if ($execute) { $this->runQuery($XQuery, $s, 'is'); $XQuery = ''; if (! $this->length()) break; } // CLASSES } else if ($s[0] == '.') { // TODO use return $this->find("./self::*[contains(concat(\" \",@class,\" \"), \" $class \")]"); // thx wizDom ;) if ($delimiterBefore) $XQuery .= '*'; $XQuery .= '[@class]'; $this->runQuery($XQuery, $s, 'matchClasses'); $XQuery = ''; if (! $this->length() ) break; // ~ General Sibling Selector } else if ($s[0] == '~') { $this->runQuery($XQuery); $XQuery = ''; $this->elements = $this ->siblings( substr($s, 1) )->elements; if (! $this->length() ) break; // + Adjacent sibling selectors } else if ($s[0] == '+') { // TODO /following-sibling:: $this->runQuery($XQuery); $XQuery = ''; $subSelector = substr($s, 1); $subElements = $this->elements; $this->elements = array(); foreach($subElements as $node) { // search first DOMElement sibling $test = $node->nextSibling; while($test && ! ($test instanceof DOMELEMENT)) $test = $test->nextSibling; if ($test && $this->is($subSelector, $test)) $this->elements[] = $test; } if (! $this->length() ) break; // PSEUDO CLASSES } else if ($s[0] == ':') { // TODO optimization for :first :last if ($XQuery) { $this->runQuery($XQuery); $XQuery = ''; } if (! $this->length()) break; $this->pseudoClasses($s); if (! $this->length()) break; // DIRECT DESCENDANDS } else if ($s == '>') { $XQuery .= '/'; $delimiterBefore = 2; // ALL DESCENDANDS } else if ($s == ' ') { $XQuery .= '//'; $delimiterBefore = 2; // ERRORS } else { pspphpQuery::debug("Unrecognized token '$s'"); } $delimiterBefore = $delimiterBefore === 2; } // run query if any if ($XQuery && $XQuery != '//') { $this->runQuery($XQuery); $XQuery = ''; } foreach($this->elements as $node) if (! $this->elementsContainsNode($node, $stack)) $stack[] = $node; } $this->elements = $stack; return $this->newInstance(); } /** * @todo create API for classes with pseudoselectors * @access private */ protected function pseudoClasses($class) { // TODO clean args parsing ? $class = ltrim($class, ':'); $haveArgs = mb_strpos($class, '('); if ($haveArgs !== false) { $args = substr($class, $haveArgs+1, -1); $class = substr($class, 0, $haveArgs); } switch($class) { case 'even': case 'odd': $stack = array(); foreach($this->elements as $i => $node) { if ($class == 'even' && ($i%2) == 0) $stack[] = $node; else if ( $class == 'odd' && $i % 2 ) $stack[] = $node; } $this->elements = $stack; break; case 'eq': $k = intval($args); $this->elements = isset( $this->elements[$k] ) ? array( $this->elements[$k] ) : array(); break; case 'gt': $this->elements = array_slice($this->elements, $args+1); break; case 'lt': $this->elements = array_slice($this->elements, 0, $args+1); break; case 'first': if (isset($this->elements[0])) $this->elements = array($this->elements[0]); break; case 'last': if ($this->elements) $this->elements = array($this->elements[count($this->elements)-1]); break; /*case 'parent': $stack = array(); foreach($this->elements as $node) { if ( $node->childNodes->length ) $stack[] = $node; } $this->elements = $stack; break;*/ case 'contains': $text = trim($args, "\"'"); $stack = array(); foreach($this->elements as $node) { if (mb_stripos($node->textContent, $text) === false) continue; $stack[] = $node; } $this->elements = $stack; break; case 'not': $selector = self::unQuote($args); $this->elements = $this->not($selector)->stack(); break; case 'slice': // TODO jQuery difference ? $args = explode(',', str_replace(', ', ',', trim($args, "\"'")) ); $start = $args[0]; $end = isset($args[1]) ? $args[1] : null; if ($end > 0) $end = $end-$start; $this->elements = array_slice($this->elements, $start, $end); break; case 'has': $selector = trim($args, "\"'"); $stack = array(); foreach($this->stack(1) as $el) { if ($this->find($selector, $el, true)->length) $stack[] = $el; } $this->elements = $stack; break; case 'submit': case 'reset': $this->elements = pspphpQuery::merge( $this->map(array($this, 'is'), "input[type=$class]", new pspCallbackParam() ), $this->map(array($this, 'is'), "button[type=$class]", new pspCallbackParam() ) ); break; // $stack = array(); // foreach($this->elements as $node) // if ($node->is('input[type=submit]') || $node->is('button[type=submit]')) // $stack[] = $el; // $this->elements = $stack; case 'input': $this->elements = $this->map( array($this, 'is'), 'input', new pspCallbackParam() )->elements; break; case 'password': case 'checkbox': case 'radio': case 'hidden': case 'image': case 'file': $this->elements = $this->map( array($this, 'is'), "input[type=$class]", new pspCallbackParam() )->elements; break; case 'parent': $this->elements = $this->map( create_function('$node', ' return $node instanceof DOMELEMENT && $node->childNodes->length ? $node : null;') )->elements; break; case 'empty': $this->elements = $this->map( create_function('$node', ' return $node instanceof DOMELEMENT && $node->childNodes->length ? null : $node;') )->elements; break; case 'disabled': case 'selected': case 'checked': $this->elements = $this->map( array($this, 'is'), "[$class]", new pspCallbackParam() )->elements; break; case 'enabled': $this->elements = $this->map( create_function('$node', ' return pspPQ($node)->not(":disabled") ? $node : null;') )->elements; break; case 'header': $this->elements = $this->map( create_function('$node', '$isHeader = isset($node->tagName) && in_array($node->tagName, array( "h1", "h2", "h3", "h4", "h5", "h6", "h7" )); return $isHeader ? $node : null;') )->elements; // $this->elements = $this->map( // create_function('$node', '$node = pspPQ($node); // return $node->is("h1") // || $node->is("h2") // || $node->is("h3") // || $node->is("h4") // || $node->is("h5") // || $node->is("h6") // || $node->is("h7") // ? $node // : null;') // )->elements; break; case 'only-child': $this->elements = $this->map( create_function('$node', 'return pspPQ($node)->siblings()->size() == 0 ? $node : null;') )->elements; break; case 'first-child': $this->elements = $this->map( create_function('$node', 'return pspPQ($node)->prevAll()->size() == 0 ? $node : null;') )->elements; break; case 'last-child': $this->elements = $this->map( create_function('$node', 'return pspPQ($node)->nextAll()->size() == 0 ? $node : null;') )->elements; break; case 'nth-child': $param = trim($args, "\"'"); if (! $param) break; // nth-child(n+b) to nth-child(1n+b) if ($param{0} == 'n') $param = '1'.$param; // :nth-child(index/even/odd/equation) if ($param == 'even' || $param == 'odd') $mapped = $this->map( create_function('$node, $param', '$index = pspPQ($node)->prevAll()->size()+1; if ($param == "even" && ($index%2) == 0) return $node; else if ($param == "odd" && $index%2 == 1) return $node; else return null;'), new pspCallbackParam(), $param ); else if (mb_strlen($param) > 1 && $param{1} == 'n') // an+b $mapped = $this->map( create_function('$node, $param', '$prevs = pspPQ($node)->prevAll()->size(); $index = 1+$prevs; $b = mb_strlen($param) > 3 ? $param{3} : 0; $a = $param{0}; if ($b && $param{2} == "-") $b = -$b; if ($a > 0) { return ($index-$b)%$a == 0 ? $node : null; pspphpQuery::debug($a."*".floor($index/$a)."+$b-1 == ".($a*floor($index/$a)+$b-1)." ?= $prevs"); return $a*floor($index/$a)+$b-1 == $prevs ? $node : null; } else if ($a == 0) return $index == $b ? $node : null; else // negative value return $index <= $b ? $node : null; // if (! $b) // return $index%$a == 0 // ? $node // : null; // else // return ($index-$b)%$a == 0 // ? $node // : null; '), new pspCallbackParam(), $param ); else // index $mapped = $this->map( create_function('$node, $index', '$prevs = pspPQ($node)->prevAll()->size(); if ($prevs && $prevs == $index-1) return $node; else if (! $prevs && $index == 1) return $node; else return null;'), new pspCallbackParam(), $param ); $this->elements = $mapped->elements; break; default: $this->debug("Unknown pseudoclass '{$class}', skipping..."); } } /** * @access private */ protected function __pseudoClassParam($paramsString) { // TODO; } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function is($selector, $nodes = null) { pspphpQuery::debug(array("Is:", $selector)); if (! $selector) return false; $oldStack = $this->elements; $returnArray = false; if ($nodes && is_array($nodes)) { $this->elements = $nodes; } else if ($nodes) $this->elements = array($nodes); $this->filter($selector, true); $stack = $this->elements; $this->elements = $oldStack; if ($nodes) return $stack ? $stack : null; return (bool)count($stack); } /** * Enter description here... * jQuery difference. * * pspCallback: * - $index int * - $node DOMNode * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @link http://docs.jquery.com/Traversing/filter */ public function filterpspCallback($callback, $_skipHistory = false) { if (! $_skipHistory) { $this->elementsBackup = $this->elements; $this->debug("Filtering by callback"); } $newStack = array(); foreach($this->elements as $index => $node) { $result = pspphpQuery::callbackRun($callback, array($index, $node)); if (is_null($result) || (! is_null($result) && $result)) $newStack[] = $node; } $this->elements = $newStack; return $_skipHistory ? $this : $this->newInstance(); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @link http://docs.jquery.com/Traversing/filter */ public function filter($selectors, $_skipHistory = false) { if ($selectors instanceof pspCallback OR $selectors instanceof Closure) return $this->filterpspCallback($selectors, $_skipHistory); if (! $_skipHistory) $this->elementsBackup = $this->elements; $notSimpleSelector = array(' ', '>', '~', '+', '/'); if (! is_array($selectors)) $selectors = $this->parseSelector($selectors); if (! $_skipHistory) $this->debug(array("Filtering:", $selectors)); $finalStack = array(); foreach($selectors as $selector) { $stack = array(); if (! $selector) break; // avoid first space or / if (in_array($selector[0], $notSimpleSelector)) $selector = array_slice($selector, 1); // PER NODE selector chunks foreach($this->stack() as $node) { $break = false; foreach($selector as $s) { if (!($node instanceof DOMELEMENT)) { // all besides DOMElement if ( $s[0] == '[') { $attr = trim($s, '[]'); if ( mb_strpos($attr, '=')) { list( $attr, $val ) = explode('=', $attr); if ($attr == 'nodeType' && $node->nodeType != $val) $break = true; } } else $break = true; } else { // DOMElement only // ID if ( $s[0] == '#') { if ( $node->getAttribute('id') != substr($s, 1) ) $break = true; // CLASSES } else if ( $s[0] == '.') { if (! $this->matchClasses( $s, $node ) ) $break = true; // ATTRS } else if ( $s[0] == '[') { // strip side brackets $attr = trim($s, '[]'); if (mb_strpos($attr, '=')) { list($attr, $val) = explode('=', $attr); $val = self::unQuote($val); if ($attr == 'nodeType') { if ($val != $node->nodeType) $break = true; } else if ($this->isRegexp($attr)) { $val = extension_loaded('mbstring') && pspphpQuery::$mbstringSupport ? quotemeta(trim($val, '"\'')) : preg_quote(trim($val, '"\''), '@'); // switch last character switch( substr($attr, -1)) { // quotemeta used insted of preg_quote // http://code.google.com/p/phpquery/issues/detail?id=76 case '^': $pattern = '^'.$val; break; case '*': $pattern = '.*'.$val.'.*'; break; case '$': $pattern = '.*'.$val.'$'; break; } // cut last character $attr = substr($attr, 0, -1); $isMatch = extension_loaded('mbstring') && pspphpQuery::$mbstringSupport ? mb_ereg_match($pattern, $node->getAttribute($attr)) : preg_match("@{$pattern}@", $node->getAttribute($attr)); if (! $isMatch) $break = true; } else if ($node->getAttribute($attr) != $val) $break = true; } else if (! $node->hasAttribute($attr)) $break = true; // PSEUDO CLASSES } else if ( $s[0] == ':') { // skip // TAG } else if (trim($s)) { if ($s != '*') { // TODO namespaces if (isset($node->tagName)) { if ($node->tagName != $s) $break = true; } else if ($s == 'html' && ! $this->isRoot($node)) $break = true; } // AVOID NON-SIMPLE SELECTORS } else if (in_array($s, $notSimpleSelector)) { $break = true; $this->debug(array('Skipping non simple selector', $selector)); } } if ($break) break; } // if element passed all chunks of selector - add it to new stack if (! $break ) $stack[] = $node; } $tmpStack = $this->elements; $this->elements = $stack; // PER ALL NODES selector chunks foreach($selector as $s) // PSEUDO CLASSES if ($s[0] == ':') $this->pseudoClasses($s); foreach($this->elements as $node) // XXX it should be merged without duplicates // but jQuery doesnt do that $finalStack[] = $node; $this->elements = $tmpStack; } $this->elements = $finalStack; if ($_skipHistory) { return $this; } else { $this->debug("Stack length after filter(): ".count($finalStack)); return $this->newInstance(); } } /** * * @param $value * @return unknown_type * @TODO implement in all methods using passed parameters */ protected static function unQuote($value) { return $value[0] == '\'' || $value[0] == '"' ? substr($value, 1, -1) : $value; } /** * Enter description here... * * @link http://docs.jquery.com/Ajax/load * @return pspphpQuery|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @todo Support $selector */ public function load($url, $data = null, $callback = null) { if ($data && ! is_array($data)) { $callback = $data; $data = null; } if (mb_strpos($url, ' ') !== false) { $matches = null; if (extension_loaded('mbstring') && pspphpQuery::$mbstringSupport) mb_ereg('^([^ ]+) (.*)$', $url, $matches); else preg_match('^([^ ]+) (.*)$', $url, $matches); $url = $matches[1]; $selector = $matches[2]; // FIXME this sucks, pass as callback param $this->_loadSelector = $selector; } $ajax = array( 'url' => $url, 'type' => $data ? 'POST' : 'GET', 'data' => $data, 'complete' => $callback, 'success' => array($this, '__loadSuccess') ); pspphpQuery::ajax($ajax); return $this; } /** * @access private * @param $html * @return unknown_type */ public function __loadSuccess($html) { if ($this->_loadSelector) { $html = pspphpQuery::newDocument($html)->find($this->_loadSelector); unset($this->_loadSelector); } foreach($this->stack(1) as $node) { pspphpQuery::pspPQ($node, $this->getDocumentID()) ->markup($html); } } /** * Enter description here... * * @return pspphpQuery|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @todo */ public function css() { // TODO return $this; } /** * @todo * */ public function show(){ // TODO return $this; } /** * @todo * */ public function hide(){ // TODO return $this; } /** * Trigger a type of event on every matched element. * * @param unknown_type $type * @param unknown_type $data * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @TODO support more than event in $type (space-separated) */ public function trigger($type, $data = array()) { foreach($this->elements as $node) psppspphpQueryEvents::trigger($this->getDocumentID(), $type, $data, $node); return $this; } /** * This particular method triggers all bound event handlers on an element (for a specific event type) WITHOUT executing the browsers default actions. * * @param unknown_type $type * @param unknown_type $data * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @TODO */ public function triggerHandler($type, $data = array()) { // TODO; } /** * Binds a handler to one or more events (like click) for each matched element. * Can also bind custom events. * * @param unknown_type $type * @param unknown_type $data Optional * @param unknown_type $callback * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @TODO support '!' (exclusive) events * @TODO support more than event in $type (space-separated) */ public function bind($type, $data, $callback = null) { // TODO check if $data is callable, not using is_callable if (! isset($callback)) { $callback = $data; $data = null; } foreach($this->elements as $node) psppspphpQueryEvents::add($this->getDocumentID(), $node, $type, $data, $callback); return $this; } /** * Enter description here... * * @param unknown_type $type * @param unknown_type $callback * @return unknown * @TODO namespace events * @TODO support more than event in $type (space-separated) */ public function unbind($type = null, $callback = null) { foreach($this->elements as $node) psppspphpQueryEvents::remove($this->getDocumentID(), $node, $type, $callback); return $this; } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function change($callback = null) { if ($callback) return $this->bind('change', $callback); return $this->trigger('change'); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function submit($callback = null) { if ($callback) return $this->bind('submit', $callback); return $this->trigger('submit'); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function click($callback = null) { if ($callback) return $this->bind('click', $callback); return $this->trigger('click'); } /** * Enter description here... * * @param String|pspphpQuery * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function wrapAllOld($wrapper) { $wrapper = pspPQ($wrapper)->_clone(); if (! $wrapper->length() || ! $this->length() ) return $this; $wrapper->insertBefore($this->elements[0]); $deepest = $wrapper->elements[0]; while($deepest->firstChild && $deepest->firstChild instanceof DOMELEMENT) $deepest = $deepest->firstChild; pspPQ($deepest)->append($this); return $this; } /** * Enter description here... * * TODO testme... * @param String|pspphpQuery * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function wrapAll($wrapper) { if (! $this->length()) return $this; return pspphpQuery::pspPQ($wrapper, $this->getDocumentID()) ->clone() ->insertBefore($this->get(0)) ->map(array($this, '___wrapAllpspCallback')) ->append($this); } /** * * @param $node * @return unknown_type * @access private */ public function ___wrapAllpspCallback($node) { $deepest = $node; while($deepest->firstChild && $deepest->firstChild instanceof DOMELEMENT) $deepest = $deepest->firstChild; return $deepest; } /** * Enter description here... * NON JQUERY METHOD * * @param String|pspphpQuery * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function wrapAllPHP($codeBefore, $codeAfter) { return $this ->slice(0, 1) ->beforePHP($codeBefore) ->end() ->slice(-1) ->afterPHP($codeAfter) ->end(); } /** * Enter description here... * * @param String|pspphpQuery * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function wrap($wrapper) { foreach($this->stack() as $node) pspphpQuery::pspPQ($node, $this->getDocumentID())->wrapAll($wrapper); return $this; } /** * Enter description here... * * @param String|pspphpQuery * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function wrapPHP($codeBefore, $codeAfter) { foreach($this->stack() as $node) pspphpQuery::pspPQ($node, $this->getDocumentID())->wrapAllPHP($codeBefore, $codeAfter); return $this; } /** * Enter description here... * * @param String|pspphpQuery * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function wrapInner($wrapper) { foreach($this->stack() as $node) pspphpQuery::pspPQ($node, $this->getDocumentID())->contents()->wrapAll($wrapper); return $this; } /** * Enter description here... * * @param String|pspphpQuery * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function wrapInnerPHP($codeBefore, $codeAfter) { foreach($this->stack(1) as $node) pspphpQuery::pspPQ($node, $this->getDocumentID())->contents() ->wrapAllPHP($codeBefore, $codeAfter); return $this; } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @testme Support for text nodes */ public function contents() { $stack = array(); foreach($this->stack(1) as $el) { // FIXME (fixed) http://code.google.com/p/phpquery/issues/detail?id=56 // if (! isset($el->childNodes)) // continue; foreach($el->childNodes as $node) { $stack[] = $node; } } return $this->newInstance($stack); } /** * Enter description here... * * jQuery difference. * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function contentsUnwrap() { foreach($this->stack(1) as $node) { if (! $node->parentNode ) continue; $childNodes = array(); // any modification in DOM tree breaks childNodes iteration, so cache them first foreach($node->childNodes as $chNode ) $childNodes[] = $chNode; foreach($childNodes as $chNode ) // $node->parentNode->appendChild($chNode); $node->parentNode->insertBefore($chNode, $node); $node->parentNode->removeChild($node); } return $this; } /** * Enter description here... * * jQuery difference. */ public function switchWith($markup) { $markup = pspPQ($markup, $this->getDocumentID()); $content = null; foreach($this->stack(1) as $node) { pspPQ($node) ->contents()->toReference($content)->end() ->replaceWith($markup->clone()->append($content)); } return $this; } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function eq($num) { $oldStack = $this->elements; $this->elementsBackup = $this->elements; $this->elements = array(); if ( isset($oldStack[$num]) ) $this->elements[] = $oldStack[$num]; return $this->newInstance(); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function size() { return count($this->elements); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @deprecated Use length as attribute */ public function length() { return $this->size(); } public function count() { return $this->size(); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @todo $level */ public function end($level = 1) { // $this->elements = array_pop( $this->history ); // return $this; // $this->previous->DOM = $this->DOM; // $this->previous->XPath = $this->XPath; return $this->previous ? $this->previous : $this; } /** * Enter description here... * Normal use ->clone() . * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @access private */ public function _clone() { $newStack = array(); //pr(array('copy... ', $this->whois())); //$this->dumpHistory('copy'); $this->elementsBackup = $this->elements; foreach($this->elements as $node) { $newStack[] = $node->cloneNode(true); } $this->elements = $newStack; return $this->newInstance(); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function replaceWithPHP($code) { return $this->replaceWith(pspphpQuery::php($code)); } /** * Enter description here... * * @param String|pspphpQuery $content * @link http://docs.jquery.com/Manipulation/replaceWith#content * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function replaceWith($content) { return $this->after($content)->remove(); } /** * Enter description here... * * @param String $selector * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @todo this works ? */ public function replaceAll($selector) { foreach(pspphpQuery::pspPQ($selector, $this->getDocumentID()) as $node) pspphpQuery::pspPQ($node, $this->getDocumentID()) ->after($this->_clone()) ->remove(); return $this; } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function remove($selector = null) { $loop = $selector ? $this->filter($selector)->elements : $this->elements; foreach($loop as $node) { if (! $node->parentNode ) continue; if (isset($node->tagName)) $this->debug("Removing '{$node->tagName}'"); $node->parentNode->removeChild($node); // Mutation event $event = new pspDOMEvent(array( 'target' => $node, 'type' => 'DOMNodeRemoved' )); psppspphpQueryEvents::trigger($this->getDocumentID(), $event->type, array($event), $node ); } return $this; } protected function markupEvents($newMarkup, $oldMarkup, $node) { if ($node->tagName == 'textarea' && $newMarkup != $oldMarkup) { $event = new pspDOMEvent(array( 'target' => $node, 'type' => 'change' )); psppspphpQueryEvents::trigger($this->getDocumentID(), $event->type, array($event), $node ); } } /** * jQuey difference * * @param $markup * @return unknown_type * @TODO trigger change event for textarea */ public function markup($markup = null, $callback1 = null, $callback2 = null, $callback3 = null) { $args = func_get_args(); if ($this->documentWrapper->isXML) return call_user_func_array(array($this, 'xml'), $args); else return call_user_func_array(array($this, 'html'), $args); } /** * jQuey difference * * @param $markup * @return unknown_type */ public function markupOuter($callback1 = null, $callback2 = null, $callback3 = null) { $args = func_get_args(); if ($this->documentWrapper->isXML) return call_user_func_array(array($this, 'xmlOuter'), $args); else return call_user_func_array(array($this, 'htmlOuter'), $args); } /** * Enter description here... * * @param unknown_type $html * @return string|pspphpQuery|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @TODO force html result */ public function html($html = null, $callback1 = null, $callback2 = null, $callback3 = null) { if (isset($html)) { // INSERT $nodes = $this->documentWrapper->import($html); $this->empty(); foreach($this->stack(1) as $alreadyAdded => $node) { // for now, limit events for textarea if (($this->isXHTML() || $this->isHTML()) && $node->tagName == 'textarea') $oldHtml = pspPQ($node, $this->getDocumentID())->markup(); foreach($nodes as $newNode) { $node->appendChild($alreadyAdded ? $newNode->cloneNode(true) : $newNode ); } // for now, limit events for textarea if (($this->isXHTML() || $this->isHTML()) && $node->tagName == 'textarea') $this->markupEvents($html, $oldHtml, $node); } return $this; } else { // FETCH $return = $this->documentWrapper->markup($this->elements, true); $args = func_get_args(); foreach(array_slice($args, 1) as $callback) { $return = pspphpQuery::callbackRun($callback, array($return)); } return $return; } } /** * @TODO force xml result */ public function xml($xml = null, $callback1 = null, $callback2 = null, $callback3 = null) { $args = func_get_args(); return call_user_func_array(array($this, 'html'), $args); } /** * Enter description here... * @TODO force html result * * @return String */ public function htmlOuter($callback1 = null, $callback2 = null, $callback3 = null) { $markup = $this->documentWrapper->markup($this->elements); // pass thou callbacks $args = func_get_args(); foreach($args as $callback) { $markup = pspphpQuery::callbackRun($callback, array($markup)); } return $markup; } /** * @TODO force xml result */ public function xmlOuter($callback1 = null, $callback2 = null, $callback3 = null) { $args = func_get_args(); return call_user_func_array(array($this, 'htmlOuter'), $args); } public function __toString() { return $this->markupOuter(); } /** * Just like html(), but returns markup with VALID (dangerous) PHP tags. * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @todo support returning markup with PHP tags when called without param */ public function php($code = null) { return $this->markupPHP($code); } /** * Enter description here... * * @param $code * @return unknown_type */ public function markupPHP($code = null) { return isset($code) ? $this->markup(pspphpQuery::php($code)) : pspphpQuery::markupToPHP($this->markup()); } /** * Enter description here... * * @param $code * @return unknown_type */ public function markupOuterPHP() { return pspphpQuery::markupToPHP($this->markupOuter()); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function children($selector = null) { $stack = array(); foreach($this->stack(1) as $node) { // foreach($node->getElementsByTagName('*') as $newNode) { foreach($node->childNodes as $newNode) { if ($newNode->nodeType != 1) continue; if ($selector && ! $this->is($selector, $newNode)) continue; if ($this->elementsContainsNode($newNode, $stack)) continue; $stack[] = $newNode; } } $this->elementsBackup = $this->elements; $this->elements = $stack; return $this->newInstance(); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function ancestors($selector = null) { return $this->children( $selector ); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function append( $content) { return $this->insert($content, __FUNCTION__); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function appendPHP( $content) { return $this->insert("", 'append'); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function appendTo( $seletor) { return $this->insert($seletor, __FUNCTION__); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function prepend( $content) { return $this->insert($content, __FUNCTION__); } /** * Enter description here... * * @todo accept many arguments, which are joined, arrays maybe also * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function prependPHP( $content) { return $this->insert("", 'prepend'); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function prependTo( $seletor) { return $this->insert($seletor, __FUNCTION__); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function before($content) { return $this->insert($content, __FUNCTION__); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function beforePHP( $content) { return $this->insert("", 'before'); } /** * Enter description here... * * @param String|pspphpQuery * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function insertBefore( $seletor) { return $this->insert($seletor, __FUNCTION__); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function after( $content) { return $this->insert($content, __FUNCTION__); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function afterPHP( $content) { return $this->insert("", 'after'); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function insertAfter( $seletor) { return $this->insert($seletor, __FUNCTION__); } /** * Internal insert method. Don't use it. * * @param unknown_type $target * @param unknown_type $type * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @access private */ public function insert($target, $type) { $this->debug("Inserting data with '{$type}'"); $to = false; switch( $type) { case 'appendTo': case 'prependTo': case 'insertBefore': case 'insertAfter': $to = true; } switch(gettype($target)) { case 'string': $insertFrom = $insertTo = array(); if ($to) { // INSERT TO $insertFrom = $this->elements; if (pspphpQuery::isMarkup($target)) { // $target is new markup, import it $insertTo = $this->documentWrapper->import($target); // insert into selected element } else { // $tagret is a selector $thisStack = $this->elements; $this->toRoot(); $insertTo = $this->find($target)->elements; $this->elements = $thisStack; } } else { // INSERT FROM $insertTo = $this->elements; $insertFrom = $this->documentWrapper->import($target); } break; case 'object': $insertFrom = $insertTo = array(); // pspphpQuery if ($target instanceof self) { if ($to) { $insertTo = $target->elements; if ($this->documentFragment && $this->stackIsRoot()) // get all body children // $loop = $this->find('body > *')->elements; // TODO test it, test it hard... // $loop = $this->newInstance($this->root)->find('> *')->elements; $loop = $this->root->childNodes; else $loop = $this->elements; // import nodes if needed $insertFrom = $this->getDocumentID() == $target->getDocumentID() ? $loop : $target->documentWrapper->import($loop); } else { $insertTo = $this->elements; if ( $target->documentFragment && $target->stackIsRoot() ) // get all body children // $loop = $target->find('body > *')->elements; $loop = $target->root->childNodes; else $loop = $target->elements; // import nodes if needed $insertFrom = $this->getDocumentID() == $target->getDocumentID() ? $loop : $this->documentWrapper->import($loop); } // DOMNODE } elseif ($target instanceof DOMNODE) { // import node if needed // if ( $target->ownerDocument != $this->DOM ) // $target = $this->DOM->importNode($target, true); if ( $to) { $insertTo = array($target); if ($this->documentFragment && $this->stackIsRoot()) // get all body children $loop = $this->root->childNodes; // $loop = $this->find('body > *')->elements; else $loop = $this->elements; foreach($loop as $fromNode) // import nodes if needed $insertFrom[] = ! $fromNode->ownerDocument->isSameNode($target->ownerDocument) ? $target->ownerDocument->importNode($fromNode, true) : $fromNode; } else { // import node if needed if (! $target->ownerDocument->isSameNode($this->document)) $target = $this->document->importNode($target, true); $insertTo = $this->elements; $insertFrom[] = $target; } } break; } pspphpQuery::debug("From ".count($insertFrom)."; To ".count($insertTo)." nodes"); foreach($insertTo as $insertNumber => $toNode) { // we need static relative elements in some cases switch( $type) { case 'prependTo': case 'prepend': $firstChild = $toNode->firstChild; break; case 'insertAfter': case 'after': $nextSibling = $toNode->nextSibling; break; } foreach($insertFrom as $fromNode) { // clone if inserted already before $insert = $insertNumber ? $fromNode->cloneNode(true) : $fromNode; switch($type) { case 'appendTo': case 'append': // $toNode->insertBefore( // $fromNode, // $toNode->lastChild->nextSibling // ); $toNode->appendChild($insert); $eventTarget = $insert; break; case 'prependTo': case 'prepend': $toNode->insertBefore( $insert, $firstChild ); break; case 'insertBefore': case 'before': if (! $toNode->parentNode) throw new Exception("No parentNode, can't do {$type}()"); else $toNode->parentNode->insertBefore( $insert, $toNode ); break; case 'insertAfter': case 'after': if (! $toNode->parentNode) throw new Exception("No parentNode, can't do {$type}()"); else $toNode->parentNode->insertBefore( $insert, $nextSibling ); break; } // Mutation event $event = new pspDOMEvent(array( 'target' => $insert, 'type' => 'DOMNodeInserted' )); psppspphpQueryEvents::trigger($this->getDocumentID(), $event->type, array($event), $insert ); } } return $this; } /** * Enter description here... * * @return Int */ public function index($subject) { $index = -1; $subject = $subject instanceof pspphpQueryObject ? $subject->elements[0] : $subject; foreach($this->newInstance() as $k => $node) { if ($node->isSameNode($subject)) $index = $k; } return $index; } /** * Enter description here... * * @param unknown_type $start * @param unknown_type $end * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @testme */ public function slice($start, $end = null) { // $last = count($this->elements)-1; // $end = $end // ? min($end, $last) // : $last; // if ($start < 0) // $start = $last+$start; // if ($start > $last) // return array(); if ($end > 0) $end = $end-$start; return $this->newInstance( array_slice($this->elements, $start, $end) ); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function reverse() { $this->elementsBackup = $this->elements; $this->elements = array_reverse($this->elements); return $this->newInstance(); } /** * Return joined text content. * @return String */ public function text($text = null, $callback1 = null, $callback2 = null, $callback3 = null) { if (isset($text)) return $this->html(htmlspecialchars($text)); $args = func_get_args(); $args = array_slice($args, 1); $return = ''; foreach($this->elements as $node) { $text = $node->textContent; if (count($this->elements) > 1 && $text) $text .= "\n"; foreach($args as $callback) { $text = pspphpQuery::callbackRun($callback, array($text)); } $return .= $text; } return $return; } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function plugin($class, $file = null) { pspphpQuery::plugin($class, $file); return $this; } /** * Deprecated, use $pq->plugin() instead. * * @deprecated * @param $class * @param $file * @return unknown_type */ public static function extend($class, $file = null) { return $this->plugin($class, $file); } /** * * @access private * @param $method * @param $args * @return unknown_type */ public function __call($method, $args) { $aliasMethods = array('clone', 'empty'); if (isset(pspphpQuery::$extendMethods[$method])) { array_unshift($args, $this); return pspphpQuery::callbackRun( pspphpQuery::$extendMethods[$method], $args ); } else if (isset(pspphpQuery::$pluginsMethods[$method])) { array_unshift($args, $this); $class = pspphpQuery::$pluginsMethods[$method]; $realClass = "pspphpQueryObjectPlugin_$class"; $return = call_user_func_array( array($realClass, $method), $args ); // XXX deprecate ? return is_null($return) ? $this : $return; } else if (in_array($method, $aliasMethods)) { return call_user_func_array(array($this, '_'.$method), $args); } else throw new Exception("Method '{$method}' doesnt exist"); } /** * Safe rename of next(). * * Use it ONLY when need to call next() on an iterated object (in same time). * Normaly there is no need to do such thing ;) * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @access private */ public function _next($selector = null) { return $this->newInstance( $this->getElementSiblings('nextSibling', $selector, true) ); } /** * Use prev() and next(). * * @deprecated * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @access private */ public function _prev($selector = null) { return $this->prev($selector); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function prev($selector = null) { return $this->newInstance( $this->getElementSiblings('previousSibling', $selector, true) ); } /** * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @todo */ public function prevAll($selector = null) { return $this->newInstance( $this->getElementSiblings('previousSibling', $selector) ); } /** * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @todo FIXME: returns source elements insted of next siblings */ public function nextAll($selector = null) { return $this->newInstance( $this->getElementSiblings('nextSibling', $selector) ); } /** * @access private */ protected function getElementSiblings($direction, $selector = null, $limitToOne = false) { $stack = array(); $count = 0; foreach($this->stack() as $node) { $test = $node; while( isset($test->{$direction}) && $test->{$direction}) { $test = $test->{$direction}; if (! $test instanceof DOMELEMENT) continue; $stack[] = $test; if ($limitToOne) break; } } if ($selector) { $stackOld = $this->elements; $this->elements = $stack; $stack = $this->filter($selector, true)->stack(); $this->elements = $stackOld; } return $stack; } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function siblings($selector = null) { $stack = array(); $siblings = array_merge( $this->getElementSiblings('previousSibling', $selector), $this->getElementSiblings('nextSibling', $selector) ); foreach($siblings as $node) { if (! $this->elementsContainsNode($node, $stack)) $stack[] = $node; } return $this->newInstance($stack); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function not($selector = null) { if (is_string($selector)) pspphpQuery::debug(array('not', $selector)); else pspphpQuery::debug('not'); $stack = array(); if ($selector instanceof self || $selector instanceof DOMNODE) { foreach($this->stack() as $node) { if ($selector instanceof self) { $matchFound = false; foreach($selector->stack() as $notNode) { if ($notNode->isSameNode($node)) $matchFound = true; } if (! $matchFound) $stack[] = $node; } else if ($selector instanceof DOMNODE) { if (! $selector->isSameNode($node)) $stack[] = $node; } else { if (! $this->is($selector)) $stack[] = $node; } } } else { $orgStack = $this->stack(); $matched = $this->filter($selector, true)->stack(); // $matched = array(); // // simulate OR in filter() instead of AND 5y // foreach($this->parseSelector($selector) as $s) { // $matched = array_merge($matched, // $this->filter(array($s))->stack() // ); // } foreach($orgStack as $node) if (! $this->elementsContainsNode($node, $matched)) $stack[] = $node; } return $this->newInstance($stack); } /** * Enter description here... * * @param string|pspphpQueryObject * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function add($selector = null) { if (! $selector) return $this; $stack = array(); $this->elementsBackup = $this->elements; $found = pspphpQuery::pspPQ($selector, $this->getDocumentID()); $this->merge($found->elements); return $this->newInstance(); } /** * @access private */ protected function merge() { foreach(func_get_args() as $nodes) foreach($nodes as $newNode ) if (! $this->elementsContainsNode($newNode) ) $this->elements[] = $newNode; } /** * @access private * TODO refactor to stackContainsNode */ protected function elementsContainsNode($nodeToCheck, $elementsStack = null) { $loop = ! is_null($elementsStack) ? $elementsStack : $this->elements; foreach($loop as $node) { if ( $node->isSameNode( $nodeToCheck ) ) return true; } return false; } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function parent($selector = null) { $stack = array(); foreach($this->elements as $node ) if ( $node->parentNode && ! $this->elementsContainsNode($node->parentNode, $stack) ) $stack[] = $node->parentNode; $this->elementsBackup = $this->elements; $this->elements = $stack; if ( $selector ) $this->filter($selector, true); return $this->newInstance(); } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function parents($selector = null) { $stack = array(); if (! $this->elements ) $this->debug('parents() - stack empty'); foreach($this->elements as $node) { $test = $node; while( $test->parentNode) { $test = $test->parentNode; if ($this->isRoot($test)) break; if (! $this->elementsContainsNode($test, $stack)) { $stack[] = $test; continue; } } } $this->elementsBackup = $this->elements; $this->elements = $stack; if ( $selector ) $this->filter($selector, true); return $this->newInstance(); } /** * Internal stack iterator. * * @access private */ public function stack($nodeTypes = null) { if (!isset($nodeTypes)) return $this->elements; if (!is_array($nodeTypes)) $nodeTypes = array($nodeTypes); $return = array(); foreach($this->elements as $node) { if (in_array($node->nodeType, $nodeTypes)) $return[] = $node; } return $return; } // TODO phpdoc; $oldAttr is result of hasAttribute, before any changes protected function attrEvents($attr, $oldAttr, $oldValue, $node) { // skip events for XML documents if (! $this->isXHTML() && ! $this->isHTML()) return; $event = null; // identify $isInputValue = $node->tagName == 'input' && ( in_array($node->getAttribute('type'), array('text', 'password', 'hidden')) || !$node->getAttribute('type') ); $isRadio = $node->tagName == 'input' && $node->getAttribute('type') == 'radio'; $isCheckbox = $node->tagName == 'input' && $node->getAttribute('type') == 'checkbox'; $isOption = $node->tagName == 'option'; if ($isInputValue && $attr == 'value' && $oldValue != $node->getAttribute($attr)) { $event = new pspDOMEvent(array( 'target' => $node, 'type' => 'change' )); } else if (($isRadio || $isCheckbox) && $attr == 'checked' && ( // check (! $oldAttr && $node->hasAttribute($attr)) // un-check || (! $node->hasAttribute($attr) && $oldAttr) )) { $event = new pspDOMEvent(array( 'target' => $node, 'type' => 'change' )); } else if ($isOption && $node->parentNode && $attr == 'selected' && ( // select (! $oldAttr && $node->hasAttribute($attr)) // un-select || (! $node->hasAttribute($attr) && $oldAttr) )) { $event = new pspDOMEvent(array( 'target' => $node->parentNode, 'type' => 'change' )); } if ($event) { psppspphpQueryEvents::trigger($this->getDocumentID(), $event->type, array($event), $node ); } } public function attr($attr = null, $value = null) { foreach($this->stack(1) as $node) { if (! is_null($value)) { $loop = $attr == '*' ? $this->getNodeAttrs($node) : array($attr); foreach($loop as $a) { $oldValue = $node->getAttribute($a); $oldAttr = $node->hasAttribute($a); // TODO raises an error when charset other than UTF-8 // while document's charset is also not UTF-8 @$node->setAttribute($a, $value); $this->attrEvents($a, $oldAttr, $oldValue, $node); } } else if ($attr == '*') { // jQuery difference $return = array(); foreach($node->attributes as $n => $v) $return[$n] = $v->value; return $return; } else return $node->hasAttribute($attr) ? $node->getAttribute($attr) : null; } return is_null($value) ? '' : $this; } /** * @access private */ protected function getNodeAttrs($node) { $return = array(); foreach($node->attributes as $n => $o) $return[] = $n; return $return; } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @todo check CDATA ??? */ public function attrPHP($attr, $code) { if (! is_null($code)) { $value = '<'.'?php '.$code.' ?'.'>'; // TODO tempolary solution // http://code.google.com/p/phpquery/issues/detail?id=17 // if (function_exists('mb_detect_encoding') && mb_detect_encoding($value) == 'ASCII') // $value = mb_convert_encoding($value, 'UTF-8', 'HTML-ENTITIES'); } foreach($this->stack(1) as $node) { if (! is_null($code)) { // $attrNode = $this->DOM->createAttribute($attr); $node->setAttribute($attr, $value); // $attrNode->value = $value; // $node->appendChild($attrNode); } else if ( $attr == '*') { // jQuery diff $return = array(); foreach($node->attributes as $n => $v) $return[$n] = $v->value; return $return; } else return $node->getAttribute($attr); } return $this; } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function removeAttr($attr) { foreach($this->stack(1) as $node) { $loop = $attr == '*' ? $this->getNodeAttrs($node) : array($attr); foreach($loop as $a) { $oldValue = $node->getAttribute($a); $node->removeAttribute($a); $this->attrEvents($a, $oldValue, null, $node); } } return $this; } /** * Return form element value. * * @return String Fields value. */ public function val($val = null) { if (! isset($val)) { if ($this->eq(0)->is('select')) { $selected = $this->eq(0)->find('option[selected=selected]'); if ($selected->is('[value]')) return $selected->attr('value'); else return $selected->text(); } else if ($this->eq(0)->is('textarea')) return $this->eq(0)->markup(); else return $this->eq(0)->attr('value'); } else { $_val = null; foreach($this->stack(1) as $node) { $node = pspPQ($node, $this->getDocumentID()); if (is_array($val) && in_array($node->attr('type'), array('checkbox', 'radio'))) { $isChecked = in_array($node->attr('value'), $val) || in_array($node->attr('name'), $val); if ($isChecked) $node->attr('checked', 'checked'); else $node->removeAttr('checked'); } else if ($node->get(0)->tagName == 'select') { if (! isset($_val)) { $_val = array(); if (! is_array($val)) $_val = array((string)$val); else foreach($val as $v) $_val[] = $v; } foreach($node['option']->stack(1) as $option) { $option = pspPQ($option, $this->getDocumentID()); $selected = false; // XXX: workaround for string comparsion, see issue #96 // http://code.google.com/p/phpquery/issues/detail?id=96 $selected = is_null($option->attr('value')) ? in_array($option->markup(), $_val) : in_array($option->attr('value'), $_val); // $optionValue = $option->attr('value'); // $optionText = $option->text(); // $optionTextLenght = mb_strlen($optionText); // foreach($_val as $v) // if ($optionValue == $v) // $selected = true; // else if ($optionText == $v && $optionTextLenght == mb_strlen($v)) // $selected = true; if ($selected) $option->attr('selected', 'selected'); else $option->removeAttr('selected'); } } else if ($node->get(0)->tagName == 'textarea') $node->markup($val); else $node->attr('value', $val); } } return $this; } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function andSelf() { if ( $this->previous ) $this->elements = array_merge($this->elements, $this->previous->elements); return $this; } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function addClass( $className) { if (! $className) return $this; foreach($this->stack(1) as $node) { if (! $this->is(".$className", $node)) $node->setAttribute( 'class', trim($node->getAttribute('class').' '.$className) ); } return $this; } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function addClassPHP( $className) { foreach($this->stack(1) as $node) { $classes = $node->getAttribute('class'); $newValue = $classes ? $classes.' <'.'?php '.$className.' ?'.'>' : '<'.'?php '.$className.' ?'.'>'; $node->setAttribute('class', $newValue); } return $this; } /** * Enter description here... * * @param string $className * @return bool */ public function hasClass($className) { foreach($this->stack(1) as $node) { if ( $this->is(".$className", $node)) return true; } return false; } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function removeClass($className) { foreach($this->stack(1) as $node) { $classes = explode( ' ', $node->getAttribute('class')); if ( in_array($className, $classes)) { $classes = array_diff($classes, array($className)); if ( $classes ) $node->setAttribute('class', implode(' ', $classes)); else $node->removeAttribute('class'); } } return $this; } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function toggleClass($className) { foreach($this->stack(1) as $node) { if ( $this->is( $node, '.'.$className )) $this->removeClass($className); else $this->addClass($className); } return $this; } /** * Proper name without underscore (just ->empty()) also works. * * Removes all child nodes from the set of matched elements. * * Example: * pspPQ("p")._empty() * * HTML: *

    Hello, Person and person

    * * Result: * [

    ] * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @access private */ public function _empty() { foreach($this->stack(1) as $node) { // thx to 'dave at dgx dot cz' $node->nodeValue = ''; } return $this; } /** * Enter description here... * * @param array|string $callback Expects $node as first param, $index as second * @param array $scope External variables passed to callback. Use compact('varName1', 'varName2'...) and extract($scope) * @param array $arg1 Will ba passed as third and futher args to callback. * @param array $arg2 Will ba passed as fourth and futher args to callback, and so on... * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function each($callback, $param1 = null, $param2 = null, $param3 = null) { $paramStructure = null; if (func_num_args() > 1) { $paramStructure = func_get_args(); $paramStructure = array_slice($paramStructure, 1); } foreach($this->elements as $v) pspphpQuery::callbackRun($callback, array($v), $paramStructure); return $this; } /** * Run callback on actual object. * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function callback($callback, $param1 = null, $param2 = null, $param3 = null) { $params = func_get_args(); $params[0] = $this; pspphpQuery::callbackRun($callback, $params); return $this; } /** * Enter description here... * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @todo add $scope and $args as in each() ??? */ public function map($callback, $param1 = null, $param2 = null, $param3 = null) { // $stack = array(); //// foreach($this->newInstance() as $node) { // foreach($this->newInstance() as $node) { // $result = call_user_func($callback, $node); // if ($result) // $stack[] = $result; // } $params = func_get_args(); array_unshift($params, $this->elements); return $this->newInstance( call_user_func_array(array('pspphpQuery', 'map'), $params) // pspphpQuery::map($this->elements, $callback) ); } /** * Enter description here... * * @param $key * @param $value */ public function data($key, $value = null) { if (! isset($value)) { // TODO? implement specific jQuery behavior od returning parent values // is child which we look up doesn't exist return pspphpQuery::data($this->get(0), $key, $value, $this->getDocumentID()); } else { foreach($this as $node) pspphpQuery::data($node, $key, $value, $this->getDocumentID()); return $this; } } /** * Enter description here... * * @param $key */ public function removeData($key) { foreach($this as $node) pspphpQuery::removeData($node, $key, $this->getDocumentID()); return $this; } // INTERFACE IMPLEMENTATIONS // ITERATOR INTERFACE /** * @access private */ public function rewind(){ $this->debug('iterating foreach'); // pspphpQuery::selectDocument($this->getDocumentID()); $this->elementsBackup = $this->elements; $this->elementsInterator = $this->elements; $this->valid = isset( $this->elements[0] ) ? 1 : 0; // $this->elements = $this->valid // ? array($this->elements[0]) // : array(); $this->current = 0; } /** * @access private */ public function current(){ return $this->elementsInterator[ $this->current ]; } /** * @access private */ public function key(){ return $this->current; } /** * Double-function method. * * First: main iterator interface method. * Second: Returning next sibling, alias for _next(). * * Proper functionality is choosed automagicaly. * * @see pspphpQueryObject::_next() * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function next($cssSelector = null){ // if ($cssSelector || $this->valid) // return $this->_next($cssSelector); $this->valid = isset( $this->elementsInterator[ $this->current+1 ] ) ? true : false; if (! $this->valid && $this->elementsInterator) { $this->elementsInterator = null; } else if ($this->valid) { $this->current++; } else { return $this->_next($cssSelector); } } /** * @access private */ public function valid(){ return $this->valid; } // ITERATOR INTERFACE END // ARRAYACCESS INTERFACE /** * @access private */ public function offsetExists($offset) { return $this->find($offset)->size() > 0; } /** * @access private */ public function offsetGet($offset) { return $this->find($offset); } /** * @access private */ public function offsetSet($offset, $value) { // $this->find($offset)->replaceWith($value); $this->find($offset)->html($value); } /** * @access private */ public function offsetUnset($offset) { // empty throw new Exception("Can't do unset, use array interface only for calling queries and replacing HTML."); } // ARRAYACCESS INTERFACE END /** * Returns node's XPath. * * @param unknown_type $oneNode * @return string * @TODO use native getNodePath is avaible * @access private */ protected function getNodeXpath($oneNode = null, $namespace = null) { $return = array(); $loop = $oneNode ? array($oneNode) : $this->elements; // if ($namespace) // $namespace .= ':'; foreach($loop as $node) { if ($node instanceof DOMDOCUMENT) { $return[] = ''; continue; } $xpath = array(); while(! ($node instanceof DOMDOCUMENT)) { $i = 1; $sibling = $node; while($sibling->previousSibling) { $sibling = $sibling->previousSibling; $isElement = $sibling instanceof DOMELEMENT; if ($isElement && $sibling->tagName == $node->tagName) $i++; } $xpath[] = $this->isXML() ? "*[local-name()='{$node->tagName}'][{$i}]" : "{$node->tagName}[{$i}]"; $node = $node->parentNode; } $xpath = join('/', array_reverse($xpath)); $return[] = '/'.$xpath; } return $oneNode ? $return[0] : $return; } // HELPERS public function whois($oneNode = null) { $return = array(); $loop = $oneNode ? array( $oneNode ) : $this->elements; foreach($loop as $node) { if (isset($node->tagName)) { $tag = in_array($node->tagName, array('php', 'js')) ? strtoupper($node->tagName) : $node->tagName; $return[] = $tag .($node->getAttribute('id') ? '#'.$node->getAttribute('id'):'') .($node->getAttribute('class') ? '.'.join('.', split(' ', $node->getAttribute('class'))):'') .($node->getAttribute('name') ? '[name="'.$node->getAttribute('name').'"]':'') .($node->getAttribute('value') && strpos($node->getAttribute('value'), '<'.'?php') === false ? '[value="'.substr(str_replace("\n", '', $node->getAttribute('value')), 0, 15).'"]':'') .($node->getAttribute('value') && strpos($node->getAttribute('value'), '<'.'?php') !== false ? '[value=PHP]':'') .($node->getAttribute('selected') ? '[selected]':'') .($node->getAttribute('checked') ? '[checked]':'') ; } else if ($node instanceof DOMTEXT) { if (trim($node->textContent)) $return[] = 'Text:'.substr(str_replace("\n", ' ', $node->textContent), 0, 15); } else { } } return $oneNode && isset($return[0]) ? $return[0] : $return; } /** * Dump htmlOuter and preserve chain. Usefull for debugging. * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * */ public function dump() { print 'DUMP #'.(pspphpQuery::$dumpCount++).' '; $debug = pspphpQuery::$debug; pspphpQuery::$debug = false; // print __FILE__.':'.__LINE__."\n"; var_dump($this->htmlOuter()); return $this; } public function dumpWhois() { print 'DUMP #'.(pspphpQuery::$dumpCount++).' '; $debug = pspphpQuery::$debug; pspphpQuery::$debug = false; // print __FILE__.':'.__LINE__."\n"; var_dump('whois', $this->whois()); pspphpQuery::$debug = $debug; return $this; } public function dumpLength() { print 'DUMP #'.(pspphpQuery::$dumpCount++).' '; $debug = pspphpQuery::$debug; pspphpQuery::$debug = false; // print __FILE__.':'.__LINE__."\n"; var_dump('length', $this->length()); pspphpQuery::$debug = $debug; return $this; } public function dumpTree($html = true, $title = true) { $output = $title ? 'DUMP #'.(pspphpQuery::$dumpCount++)." \n" : ''; $debug = pspphpQuery::$debug; pspphpQuery::$debug = false; foreach($this->stack() as $node) $output .= $this->__dumpTree($node); pspphpQuery::$debug = $debug; print $html ? nl2br(str_replace(' ', ' ', $output)) : $output; return $this; } private function __dumpTree($node, $intend = 0) { $whois = $this->whois($node); $return = ''; if ($whois) $return .= str_repeat(' - ', $intend).$whois."\n"; if (isset($node->childNodes)) foreach($node->childNodes as $chNode) $return .= $this->__dumpTree($chNode, $intend+1); return $return; } /** * Dump htmlOuter and stop script execution. Usefull for debugging. * */ public function dumpDie() { print __FILE__.':'.__LINE__; var_dump($this->htmlOuter()); die(); } } // -- Multibyte Compatibility functions --------------------------------------- // http://svn.iphonewebdev.com/lace/lib/mb_compat.php /** * mb_internal_encoding() * * Included for mbstring pseudo-compatability. */ if (!function_exists('mb_internal_encoding')) { function mb_internal_encoding($enc) {return true; } } /** * mb_regex_encoding() * * Included for mbstring pseudo-compatability. */ if (!function_exists('mb_regex_encoding')) { function mb_regex_encoding($enc) {return true; } } /** * mb_strlen() * * Included for mbstring pseudo-compatability. */ if (!function_exists('mb_strlen')) { function mb_strlen($str) { return strlen($str); } } /** * mb_strpos() * * Included for mbstring pseudo-compatability. */ if (!function_exists('mb_strpos')) { function mb_strpos($haystack, $needle, $offset=0) { return strpos($haystack, $needle, $offset); } } /** * mb_stripos() * * Included for mbstring pseudo-compatability. */ if (!function_exists('mb_stripos')) { function mb_stripos($haystack, $needle, $offset=0) { return stripos($haystack, $needle, $offset); } } /** * mb_substr() * * Included for mbstring pseudo-compatability. */ if (!function_exists('mb_substr')) { function mb_substr($str, $start, $length=0) { return substr($str, $start, $length); } } /** * mb_substr_count() * * Included for mbstring pseudo-compatability. */ if (!function_exists('mb_substr_count')) { function mb_substr_count($haystack, $needle) { return substr_count($haystack, $needle); } } /** * Static namespace for pspphpQuery functions. * * @author Tobiasz Cudnik * @package pspphpQuery */ abstract class pspphpQuery { /** * XXX: Workaround for mbstring problems * * @var bool */ public static $mbstringSupport = true; public static $debug = false; public static $documents = array(); public static $defaultDocumentID = null; // public static $defaultDoctype = 'html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"'; /** * Applies only to HTML. * * @var unknown_type */ public static $defaultDoctype = ''; public static $defaultCharset = 'UTF-8'; /** * Static namespace for plugins. * * @var object */ public static $plugins = array(); /** * List of loaded plugins. * * @var unknown_type */ public static $pluginsLoaded = array(); public static $pluginsMethods = array(); public static $pluginsStaticMethods = array(); public static $extendMethods = array(); /** * @TODO implement */ public static $extendStaticMethods = array(); /** * Hosts allowed for AJAX connections. * Dot '.' means $_SERVER['HTTP_HOST'] (if any). * * @var array */ public static $ajaxAllowedHosts = array( '.' ); /** * AJAX settings. * * @var array * XXX should it be static or not ? */ public static $ajaxSettings = array( 'url' => '',//TODO 'global' => true, 'type' => "GET", 'timeout' => null, 'contentType' => "application/x-www-form-urlencoded", 'processData' => true, // 'async' => true, 'data' => null, 'username' => null, 'password' => null, 'accepts' => array( 'xml' => "application/xml, text/xml", 'html' => "text/html", 'script' => "text/javascript, application/javascript", 'json' => "application/json, text/javascript", 'text' => "text/plain", '_default' => "*/*" ) ); public static $lastModified = null; public static $active = 0; public static $dumpCount = 0; /** * Multi-purpose function. * Use pspPQ() as shortcut. * * In below examples, $pq is any result of pspPQ(); function. * * 1. Import markup into existing document (without any attaching): * - Import into selected document: * pspPQ('
    ') // DOESNT accept text nodes at beginning of input string ! * - Import into document with ID from $pq->getDocumentID(): * pspPQ('
    ', $pq->getDocumentID()) * - Import into same document as DOMNode belongs to: * pspPQ('
    ', DOMNode) * - Import into document from pspphpQuery object: * pspPQ('
    ', $pq) * * 2. Run query: * - Run query on last selected document: * pspPQ('div.myClass') * - Run query on document with ID from $pq->getDocumentID(): * pspPQ('div.myClass', $pq->getDocumentID()) * - Run query on same document as DOMNode belongs to and use node(s)as root for query: * pspPQ('div.myClass', DOMNode) * - Run query on document from pspphpQuery object * and use object's stack as root node(s) for query: * pspPQ('div.myClass', $pq) * * @param string|DOMNode|DOMNodeList|array $arg1 HTML markup, CSS Selector, DOMNode or array of DOMNodes * @param string|pspphpQueryObject|DOMNode $context DOM ID from $pq->getDocumentID(), pspphpQuery object (determines also query root) or DOMNode (determines also query root) * * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery|QueryTemplatesPhpQuery|false * pspphpQuery object or false in case of error. */ public static function pspPQ($arg1, $context = null) { if ($arg1 instanceof DOMNODE && ! isset($context)) { foreach(pspphpQuery::$documents as $documentWrapper) { $compare = $arg1 instanceof DOMDocument ? $arg1 : $arg1->ownerDocument; if ($documentWrapper->document->isSameNode($compare)) $context = $documentWrapper->id; } } if (! $context) { $domId = self::$defaultDocumentID; if (! $domId) throw new Exception("Can't use last created DOM, because there isn't any. Use pspphpQuery::newDocument() first."); // } else if (is_object($context) && ($context instanceof PHPQUERY || is_subclass_of($context, 'pspphpQueryObject'))) } else if (is_object($context) && $context instanceof pspphpQueryObject) $domId = $context->getDocumentID(); else if ($context instanceof DOMDOCUMENT) { $domId = self::getDocumentID($context); if (! $domId) { //throw new Exception('Orphaned DOMDocument'); $domId = self::newDocument($context)->getDocumentID(); } } else if ($context instanceof DOMNODE) { $domId = self::getDocumentID($context); if (! $domId) { throw new Exception('Orphaned DOMNode'); // $domId = self::newDocument($context->ownerDocument); } } else $domId = $context; if ($arg1 instanceof pspphpQueryObject) { // if (is_object($arg1) && (get_class($arg1) == 'pspphpQueryObject' || $arg1 instanceof PHPQUERY || is_subclass_of($arg1, 'pspphpQueryObject'))) { /** * Return $arg1 or import $arg1 stack if document differs: * pspPQ(pspPQ('
    ')) */ if ($arg1->getDocumentID() == $domId) return $arg1; $class = get_class($arg1); // support inheritance by passing old object to overloaded constructor $pspphpQuery = $class != 'pspphpQuery' ? new $class($arg1, $domId) : new pspphpQueryObject($domId); $pspphpQuery->elements = array(); foreach($arg1->elements as $node) $pspphpQuery->elements[] = $pspphpQuery->document->importNode($node, true); return $pspphpQuery; } else if ($arg1 instanceof DOMNODE || (is_array($arg1) && isset($arg1[0]) && $arg1[0] instanceof DOMNODE)) { /* * Wrap DOM nodes with pspphpQuery object, import into document when needed: * pspPQ(array($domNode1, $domNode2)) */ $pspphpQuery = new pspphpQueryObject($domId); if (!($arg1 instanceof DOMNODELIST) && ! is_array($arg1)) $arg1 = array($arg1); $pspphpQuery->elements = array(); foreach($arg1 as $node) { $sameDocument = $node->ownerDocument instanceof DOMDOCUMENT && ! $node->ownerDocument->isSameNode($pspphpQuery->document); $pspphpQuery->elements[] = $sameDocument ? $pspphpQuery->document->importNode($node, true) : $node; } return $pspphpQuery; } else if (self::isMarkup($arg1)) { /** * Import HTML: * pspPQ('
    ') */ $pspphpQuery = new pspphpQueryObject($domId); return $pspphpQuery->newInstance( $pspphpQuery->documentWrapper->import($arg1) ); } else { /** * Run CSS query: * pspPQ('div.myClass') */ $pspphpQuery = new pspphpQueryObject($domId); // if ($context && ($context instanceof PHPQUERY || is_subclass_of($context, 'pspphpQueryObject'))) if ($context && $context instanceof pspphpQueryObject) $pspphpQuery->elements = $context->elements; else if ($context && $context instanceof DOMNODELIST) { $pspphpQuery->elements = array(); foreach($context as $node) $pspphpQuery->elements[] = $node; } else if ($context && $context instanceof DOMNODE) $pspphpQuery->elements = array($context); return $pspphpQuery->find($arg1); } } /** * Sets default document to $id. Document has to be loaded prior * to using this method. * $id can be retrived via getDocumentID() or getDocumentIDRef(). * * @param unknown_type $id */ public static function selectDocument($id) { $id = self::getDocumentID($id); self::debug("Selecting document '$id' as default one"); self::$defaultDocumentID = self::getDocumentID($id); } /** * Returns document with id $id or last used as pspphpQueryObject. * $id can be retrived via getDocumentID() or getDocumentIDRef(). * Chainable. * * @see pspphpQuery::selectDocument() * @param unknown_type $id * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public static function getDocument($id = null) { if ($id) pspphpQuery::selectDocument($id); else $id = pspphpQuery::$defaultDocumentID; return new pspphpQueryObject($id); } /** * Creates new document from markup. * Chainable. * * @param unknown_type $markup * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public static function newDocument($markup = null, $contentType = null) { if (! $markup) $markup = ''; $documentID = pspphpQuery::createDocumentWrapper($markup, $contentType); return new pspphpQueryObject($documentID); } /** * Creates new document from markup. * Chainable. * * @param unknown_type $markup * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public static function newDocumentHTML($markup = null, $charset = null) { $contentType = $charset ? ";charset=$charset" : ''; return self::newDocument($markup, "text/html{$contentType}"); } /** * Creates new document from markup. * Chainable. * * @param unknown_type $markup * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public static function newDocumentXML($markup = null, $charset = null) { $contentType = $charset ? ";charset=$charset" : ''; return self::newDocument($markup, "text/xml{$contentType}"); } /** * Creates new document from markup. * Chainable. * * @param unknown_type $markup * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public static function newDocumentXHTML($markup = null, $charset = null) { $contentType = $charset ? ";charset=$charset" : ''; return self::newDocument($markup, "application/xhtml+xml{$contentType}"); } /** * Creates new document from markup. * Chainable. * * @param unknown_type $markup * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public static function newDocumentPHP($markup = null, $contentType = "text/html") { // TODO pass charset to phpToMarkup if possible (use pspDOMDocumentWrapper function) $markup = pspphpQuery::phpToMarkup($markup, self::$defaultCharset); return self::newDocument($markup, $contentType); } public static function phpToMarkup($php, $charset = 'utf-8') { $regexes = array( '@(<(?!\\?)(?:[^>]|\\?>)+\\w+\\s*=\\s*)(\')([^\']*)<'.'?php?(.*?)(?:\\?>)([^\']*)\'@s', '@(<(?!\\?)(?:[^>]|\\?>)+\\w+\\s*=\\s*)(")([^"]*)<'.'?php?(.*?)(?:\\?>)([^"]*)"@s', ); foreach($regexes as $regex) while (preg_match($regex, $php, $matches)) { $php = preg_replace_callback( $regex, // create_function('$m, $charset = "'.$charset.'"', // 'return $m[1].$m[2] // .htmlspecialchars("<"."?php".$m[4]."?".">", ENT_QUOTES|ENT_NOQUOTES, $charset) // .$m[5].$m[2];' // ), array('pspphpQuery', '_phpToMarkuppspCallback'), $php ); } $regex = '@(^|>[^<]*)+?(<\?php(.*?)(\?>))@s'; //preg_match_all($regex, $php, $matches); //var_dump($matches); $php = preg_replace($regex, '\\1', $php); return $php; } public static function _phpToMarkuppspCallback($php, $charset = 'utf-8') { return $m[1].$m[2] .htmlspecialchars("<"."?php".$m[4]."?".">", ENT_QUOTES|ENT_NOQUOTES, $charset) .$m[5].$m[2]; } public static function _markupToPHPpspCallback($m) { return "<"."?php ".htmlspecialchars_decode($m[1])." ?".">"; } /** * Converts document markup containing PHP code generated by pspphpQuery::php() * into valid (executable) PHP code syntax. * * @param string|pspphpQueryObject $content * @return string PHP code. */ public static function markupToPHP($content) { if ($content instanceof pspphpQueryObject) $content = $content->markupOuter(); /* ... to */ $content = preg_replace_callback( '@\s*\s*@s', // create_function('$m', // 'return "<'.'?php ".htmlspecialchars_decode($m[1])." ?'.'>";' // ), array('pspphpQuery', '_markupToPHPpspCallback'), $content ); /* extra space added to save highlighters */ $regexes = array( '@(<(?!\\?)(?:[^>]|\\?>)+\\w+\\s*=\\s*)(\')([^\']*)(?:<|%3C)\\?(?:php)?(.*?)(?:\\?(?:>|%3E))([^\']*)\'@s', '@(<(?!\\?)(?:[^>]|\\?>)+\\w+\\s*=\\s*)(")([^"]*)(?:<|%3C)\\?(?:php)?(.*?)(?:\\?(?:>|%3E))([^"]*)"@s', ); foreach($regexes as $regex) while (preg_match($regex, $content)) $content = preg_replace_callback( $regex, create_function('$m', 'return $m[1].$m[2].$m[3]."", " ", "\n", " ", "{", "$", "}", \'"\', "[", "]"), htmlspecialchars_decode($m[4]) ) ." ?>".$m[5].$m[2];' ), $content ); return $content; } /** * Creates new document from file $file. * Chainable. * * @param string $file URLs allowed. See File wrapper page at php.net for more supported sources. * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public static function newDocumentFile($file, $contentType = null) { $documentID = self::createDocumentWrapper( file_get_contents($file), $contentType ); return new pspphpQueryObject($documentID); } /** * Creates new document from markup. * Chainable. * * @param unknown_type $markup * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public static function newDocumentFileHTML($file, $charset = null) { $contentType = $charset ? ";charset=$charset" : ''; return self::newDocumentFile($file, "text/html{$contentType}"); } /** * Creates new document from markup. * Chainable. * * @param unknown_type $markup * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public static function newDocumentFileXML($file, $charset = null) { $contentType = $charset ? ";charset=$charset" : ''; return self::newDocumentFile($file, "text/xml{$contentType}"); } /** * Creates new document from markup. * Chainable. * * @param unknown_type $markup * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public static function newDocumentFileXHTML($file, $charset = null) { $contentType = $charset ? ";charset=$charset" : ''; return self::newDocumentFile($file, "application/xhtml+xml{$contentType}"); } /** * Creates new document from markup. * Chainable. * * @param unknown_type $markup * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public static function newDocumentFilePHP($file, $contentType = null) { return self::newDocumentPHP(file_get_contents($file), $contentType); } /** * Reuses existing DOMDocument object. * Chainable. * * @param $document DOMDocument * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @TODO support DOMDocument */ public static function loadDocument($document) { // TODO die('TODO loadDocument'); } /** * Enter description here... * * @param unknown_type $html * @param unknown_type $domId * @return unknown New DOM ID * @todo support PHP tags in input * @todo support passing DOMDocument object from self::loadDocument */ protected static function createDocumentWrapper($html, $contentType = null, $documentID = null) { if (function_exists('domxml_open_mem')) throw new Exception("Old PHP4 DOM XML extension detected. pspphpQuery won't work until this extension is enabled."); // $id = $documentID // ? $documentID // : md5(microtime()); $document = null; if ($html instanceof DOMDOCUMENT) { if (self::getDocumentID($html)) { // document already exists in pspphpQuery::$documents, make a copy $document = clone $html; } else { // new document, add it to pspphpQuery::$documents $wrapper = new pspDOMDocumentWrapper($html, $contentType, $documentID); } } else { $wrapper = new pspDOMDocumentWrapper($html, $contentType, $documentID); } // $wrapper->id = $id; // bind document pspphpQuery::$documents[$wrapper->id] = $wrapper; // remember last loaded document pspphpQuery::selectDocument($wrapper->id); return $wrapper->id; } /** * Extend class namespace. * * @param string|array $target * @param array $source * @TODO support string $source * @return unknown_type */ public static function extend($target, $source) { switch($target) { case 'pspphpQueryObject': $targetRef = &self::$extendMethods; $targetRef2 = &self::$pluginsMethods; break; case 'pspphpQuery': $targetRef = &self::$extendStaticMethods; $targetRef2 = &self::$pluginsStaticMethods; break; default: throw new Exception("Unsupported \$target type"); } if (is_string($source)) $source = array($source => $source); foreach($source as $method => $callback) { if (isset($targetRef[$method])) { // throw new Exception self::debug("Duplicate method '{$method}', can\'t extend '{$target}'"); continue; } if (isset($targetRef2[$method])) { // throw new Exception self::debug("Duplicate method '{$method}' from plugin '{$targetRef2[$method]}'," ." can\'t extend '{$target}'"); continue; } $targetRef[$method] = $callback; } return true; } /** * Extend pspphpQuery with $class from $file. * * @param string $class Extending class name. Real class name can be prepended pspphpQuery_. * @param string $file Filename to include. Defaults to "{$class}.php". */ public static function plugin($class, $file = null) { // TODO $class checked agains pspphpQuery_$class // if (strpos($class, 'pspphpQuery') === 0) // $class = substr($class, 8); if (in_array($class, self::$pluginsLoaded)) return true; if (! $file) $file = $class.'.php'; $objectClassExists = class_exists('pspphpQueryObjectPlugin_'.$class); $staticClassExists = class_exists('pspphpQueryPlugin_'.$class); if (! $objectClassExists && ! $staticClassExists) require_once($file); self::$pluginsLoaded[] = $class; // static methods if (class_exists('pspphpQueryPlugin_'.$class)) { $realClass = 'pspphpQueryPlugin_'.$class; $vars = get_class_vars($realClass); $loop = isset($vars['pspphpQueryMethods']) && ! is_null($vars['pspphpQueryMethods']) ? $vars['pspphpQueryMethods'] : get_class_methods($realClass); foreach($loop as $method) { if ($method == '__initialize') continue; if (! is_callable(array($realClass, $method))) continue; if (isset(self::$pluginsStaticMethods[$method])) { throw new Exception("Duplicate method '{$method}' from plugin '{$c}' conflicts with same method from plugin '".self::$pluginsStaticMethods[$method]."'"); return; } self::$pluginsStaticMethods[$method] = $class; } if (method_exists($realClass, '__initialize')) call_user_func_array(array($realClass, '__initialize'), array()); } // object methods if (class_exists('pspphpQueryObjectPlugin_'.$class)) { $realClass = 'pspphpQueryObjectPlugin_'.$class; $vars = get_class_vars($realClass); $loop = isset($vars['pspphpQueryMethods']) && ! is_null($vars['pspphpQueryMethods']) ? $vars['pspphpQueryMethods'] : get_class_methods($realClass); foreach($loop as $method) { if (! is_callable(array($realClass, $method))) continue; if (isset(self::$pluginsMethods[$method])) { throw new Exception("Duplicate method '{$method}' from plugin '{$c}' conflicts with same method from plugin '".self::$pluginsMethods[$method]."'"); continue; } self::$pluginsMethods[$method] = $class; } } return true; } /** * Unloades all or specified document from memory. * * @param mixed $documentID @see pspphpQuery::getDocumentID() for supported types. */ public static function unloadDocuments($id = null) { if (isset($id)) { if ($id = self::getDocumentID($id)) unset(pspphpQuery::$documents[$id]); } else { foreach(pspphpQuery::$documents as $k => $v) { unset(pspphpQuery::$documents[$k]); } } } /** * Parses pspphpQuery object or HTML result against PHP tags and makes them active. * * @param pspphpQuery|string $content * @deprecated * @return string */ public static function unsafePHPTags($content) { return self::markupToPHP($content); } public static function DOMNodeListToArray($DOMNodeList) { $array = array(); if (! $DOMNodeList) return $array; foreach($DOMNodeList as $node) $array[] = $node; return $array; } /** * Checks if $input is HTML string, which has to start with '<'. * * @deprecated * @param String $input * @return Bool * @todo still used ? */ public static function isMarkup($input) { return ! is_array($input) && substr(trim($input), 0, 1) == '<'; } public static function debug($text) { if (self::$debug) print var_dump($text); } /** * Make an AJAX request. * * @param array See $options http://docs.jquery.com/Ajax/jQuery.ajax#toptions * Additional options are: * 'document' - document for global events, @see pspphpQuery::getDocumentID() * 'referer' - implemented * 'requested_with' - TODO; not implemented (X-Requested-With) * @return Zend_Http_Client * @link http://docs.jquery.com/Ajax/jQuery.ajax * * @TODO $options['cache'] * @TODO $options['processData'] * @TODO $options['xhr'] * @TODO $options['data'] as string * @TODO XHR interface */ public static function ajax($options = array(), $xhr = null) { $options = array_merge( self::$ajaxSettings, $options ); $documentID = isset($options['document']) ? self::getDocumentID($options['document']) : null; if ($xhr) { // reuse existing XHR object, but clean it up $client = $xhr; // $client->setParameterPost(null); // $client->setParameterGet(null); $client->setAuth(false); $client->setHeaders("If-Modified-Since", null); $client->setHeaders("Referer", null); $client->resetParameters(); } else { // create new XHR object require_once('Zend/Http/Client.php'); $client = new Zend_Http_Client(); $client->setCookieJar(); } if (isset($options['timeout'])) $client->setConfig(array( 'timeout' => $options['timeout'], )); // 'maxredirects' => 0, foreach(self::$ajaxAllowedHosts as $k => $host) if ($host == '.' && isset($_SERVER['HTTP_HOST'])) self::$ajaxAllowedHosts[$k] = $_SERVER['HTTP_HOST']; $host = parse_url($options['url'], PHP_URL_HOST); if (! in_array($host, self::$ajaxAllowedHosts)) { throw new Exception("Request not permitted, host '$host' not present in " ."pspphpQuery::\$ajaxAllowedHosts"); } // JSONP $jsre = "/=\\?(&|$)/"; if (isset($options['dataType']) && $options['dataType'] == 'jsonp') { $jsonppspCallbackParam = $options['jsonp'] ? $options['jsonp'] : 'callback'; if (strtolower($options['type']) == 'get') { if (! preg_match($jsre, $options['url'])) { $sep = strpos($options['url'], '?') ? '&' : '?'; $options['url'] .= "$sep$jsonppspCallbackParam=?"; } } else if ($options['data']) { $jsonp = false; foreach($options['data'] as $n => $v) { if ($v == '?') $jsonp = true; } if (! $jsonp) { $options['data'][$jsonppspCallbackParam] = '?'; } } $options['dataType'] = 'json'; } if (isset($options['dataType']) && $options['dataType'] == 'json') { $jsonppspCallback = 'json_'.md5(microtime()); $jsonpData = $jsonpUrl = false; if ($options['data']) { foreach($options['data'] as $n => $v) { if ($v == '?') $jsonpData = $n; } } if (preg_match($jsre, $options['url'])) $jsonpUrl = true; if ($jsonpData !== false || $jsonpUrl) { // remember callback name for httpData() $options['_jsonp'] = $jsonppspCallback; if ($jsonpData !== false) $options['data'][$jsonpData] = $jsonppspCallback; if ($jsonpUrl) $options['url'] = preg_replace($jsre, "=$jsonppspCallback\\1", $options['url']); } } $client->setUri($options['url']); $client->setMethod(strtoupper($options['type'])); if (isset($options['referer']) && $options['referer']) $client->setHeaders('Referer', $options['referer']); $client->setHeaders(array( // 'content-type' => $options['contentType'], 'User-Agent' => 'Mozilla/5.0 (X11; U; Linux x86; en-US; rv:1.9.0.5) Gecko' .'/2008122010 Firefox/3.0.5', // TODO custom charset 'Accept-Charset' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', // 'Connection' => 'keep-alive', // 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language' => 'en-us,en;q=0.5', )); if ($options['username']) $client->setAuth($options['username'], $options['password']); if (isset($options['ifModified']) && $options['ifModified']) $client->setHeaders("If-Modified-Since", self::$lastModified ? self::$lastModified : "Thu, 01 Jan 1970 00:00:00 GMT" ); $client->setHeaders("Accept", isset($options['dataType']) && isset(self::$ajaxSettings['accepts'][ $options['dataType'] ]) ? self::$ajaxSettings['accepts'][ $options['dataType'] ].", */*" : self::$ajaxSettings['accepts']['_default'] ); // TODO $options['processData'] if ($options['data'] instanceof pspphpQueryObject) { $serialized = $options['data']->serializeArray($options['data']); $options['data'] = array(); foreach($serialized as $r) $options['data'][ $r['name'] ] = $r['value']; } if (strtolower($options['type']) == 'get') { $client->setParameterGet($options['data']); } else if (strtolower($options['type']) == 'post') { $client->setEncType($options['contentType']); $client->setParameterPost($options['data']); } if (self::$active == 0 && $options['global']) psppspphpQueryEvents::trigger($documentID, 'ajaxStart'); self::$active++; // beforeSend callback if (isset($options['beforeSend']) && $options['beforeSend']) pspphpQuery::callbackRun($options['beforeSend'], array($client)); // ajaxSend event if ($options['global']) psppspphpQueryEvents::trigger($documentID, 'ajaxSend', array($client, $options)); if (pspphpQuery::$debug) { self::debug("{$options['type']}: {$options['url']}\n"); self::debug("Options:
    ".var_export($options, true)."
    \n"); // if ($client->getCookieJar()) // self::debug("Cookies:
    ".var_export($client->getCookieJar()->getMatchingCookies($options['url']), true)."
    \n"); } // request $response = $client->request(); if (pspphpQuery::$debug) { self::debug('Status: '.$response->getStatus().' / '.$response->getMessage()); self::debug($client->getLastRequest()); self::debug($response->getHeaders()); } if ($response->isSuccessful()) { // XXX tempolary self::$lastModified = $response->getHeader('Last-Modified'); $data = self::httpData($response->getBody(), $options['dataType'], $options); if (isset($options['success']) && $options['success']) pspphpQuery::callbackRun($options['success'], array($data, $response->getStatus(), $options)); if ($options['global']) psppspphpQueryEvents::trigger($documentID, 'ajaxSuccess', array($client, $options)); } else { if (isset($options['error']) && $options['error']) pspphpQuery::callbackRun($options['error'], array($client, $response->getStatus(), $response->getMessage())); if ($options['global']) psppspphpQueryEvents::trigger($documentID, 'ajaxError', array($client, /*$response->getStatus(),*/$response->getMessage(), $options)); } if (isset($options['complete']) && $options['complete']) pspphpQuery::callbackRun($options['complete'], array($client, $response->getStatus())); if ($options['global']) psppspphpQueryEvents::trigger($documentID, 'ajaxComplete', array($client, $options)); if ($options['global'] && ! --self::$active) psppspphpQueryEvents::trigger($documentID, 'ajaxStop'); return $client; // if (is_null($domId)) // $domId = self::$defaultDocumentID ? self::$defaultDocumentID : false; // return new pspphpQueryAjaxResponse($response, $domId); } protected static function httpData($data, $type, $options) { if (isset($options['dataFilter']) && $options['dataFilter']) $data = self::callbackRun($options['dataFilter'], array($data, $type)); if (is_string($data)) { if ($type == "json") { if (isset($options['_jsonp']) && $options['_jsonp']) { $data = preg_replace('/^\s*\w+\((.*)\)\s*$/s', '$1', $data); } $data = self::parseJSON($data); } } return $data; } /** * Enter description here... * * @param array|pspphpQuery $data * */ public static function param($data) { return http_build_query($data, null, '&'); } public static function get($url, $data = null, $callback = null, $type = null) { if (!is_array($data)) { $callback = $data; $data = null; } // TODO some array_values on this shit return pspphpQuery::ajax(array( 'type' => 'GET', 'url' => $url, 'data' => $data, 'success' => $callback, 'dataType' => $type, )); } public static function post($url, $data = null, $callback = null, $type = null) { if (!is_array($data)) { $callback = $data; $data = null; } return pspphpQuery::ajax(array( 'type' => 'POST', 'url' => $url, 'data' => $data, 'success' => $callback, 'dataType' => $type, )); } public static function getJSON($url, $data = null, $callback = null) { if (!is_array($data)) { $callback = $data; $data = null; } // TODO some array_values on this shit return pspphpQuery::ajax(array( 'type' => 'GET', 'url' => $url, 'data' => $data, 'success' => $callback, 'dataType' => 'json', )); } public static function ajaxSetup($options) { self::$ajaxSettings = array_merge( self::$ajaxSettings, $options ); } public static function ajaxAllowHost($host1, $host2 = null, $host3 = null) { $loop = is_array($host1) ? $host1 : func_get_args(); foreach($loop as $host) { if ($host && ! in_array($host, pspphpQuery::$ajaxAllowedHosts)) { pspphpQuery::$ajaxAllowedHosts[] = $host; } } } public static function ajaxAllowURL($url1, $url2 = null, $url3 = null) { $loop = is_array($url1) ? $url1 : func_get_args(); foreach($loop as $url) pspphpQuery::ajaxAllowHost(parse_url($url, PHP_URL_HOST)); } /** * Returns JSON representation of $data. * * @static * @param mixed $data * @return string */ public static function toJSON($data) { if (function_exists('json_encode')) return json_encode($data); require_once('Zend/Json/Encoder.php'); return Zend_Json_Encoder::encode($data); } /** * Parses JSON into proper PHP type. * * @static * @param string $json * @return mixed */ public static function parseJSON($json) { if (function_exists('json_decode')) { $return = json_decode(trim($json), true); // json_decode and UTF8 issues if (isset($return)) return $return; } require_once('Zend/Json/Decoder.php'); return Zend_Json_Decoder::decode($json); } /** * Returns source's document ID. * * @param $source DOMNode|pspphpQueryObject * @return string */ public static function getDocumentID($source) { if ($source instanceof DOMDOCUMENT) { foreach(pspphpQuery::$documents as $id => $document) { if ($source->isSameNode($document->document)) return $id; } } else if ($source instanceof DOMNODE) { foreach(pspphpQuery::$documents as $id => $document) { if ($source->ownerDocument->isSameNode($document->document)) return $id; } } else if ($source instanceof pspphpQueryObject) return $source->getDocumentID(); else if (is_string($source) && isset(pspphpQuery::$documents[$source])) return $source; } /** * Get DOMDocument object related to $source. * Returns null if such document doesn't exist. * * @param $source DOMNode|pspphpQueryObject|string * @return string */ public static function getDOMDocument($source) { if ($source instanceof DOMDOCUMENT) return $source; $source = self::getDocumentID($source); return $source ? self::$documents[$id]['document'] : null; } // UTILITIES // http://docs.jquery.com/Utilities /** * * @return unknown_type * @link http://docs.jquery.com/Utilities/jQuery.makeArray */ public static function makeArray($obj) { $array = array(); if (is_object($object) && $object instanceof DOMNODELIST) { foreach($object as $value) $array[] = $value; } else if (is_object($object) && ! ($object instanceof Iterator)) { foreach(get_object_vars($object) as $name => $value) $array[0][$name] = $value; } else { foreach($object as $name => $value) $array[0][$name] = $value; } return $array; } public static function inArray($value, $array) { return in_array($value, $array); } /** * * @param $object * @param $callback * @return unknown_type * @link http://docs.jquery.com/Utilities/jQuery.each */ public static function each($object, $callback, $param1 = null, $param2 = null, $param3 = null) { $paramStructure = null; if (func_num_args() > 2) { $paramStructure = func_get_args(); $paramStructure = array_slice($paramStructure, 2); } if (is_object($object) && ! ($object instanceof Iterator)) { foreach(get_object_vars($object) as $name => $value) pspphpQuery::callbackRun($callback, array($name, $value), $paramStructure); } else { foreach($object as $name => $value) pspphpQuery::callbackRun($callback, array($name, $value), $paramStructure); } } /** * * @link http://docs.jquery.com/Utilities/jQuery.map */ public static function map($array, $callback, $param1 = null, $param2 = null, $param3 = null) { $result = array(); $paramStructure = null; if (func_num_args() > 2) { $paramStructure = func_get_args(); $paramStructure = array_slice($paramStructure, 2); } foreach($array as $v) { $vv = pspphpQuery::callbackRun($callback, array($v), $paramStructure); // $callbackArgs = $args; // foreach($args as $i => $arg) { // $callbackArgs[$i] = $arg instanceof pspCallbackParam // ? $v // : $arg; // } // $vv = call_user_func_array($callback, $callbackArgs); if (is_array($vv)) { foreach($vv as $vvv) $result[] = $vvv; } else if ($vv !== null) { $result[] = $vv; } } return $result; } /** * * @param $callback pspCallback * @param $params * @param $paramStructure * @return unknown_type */ public static function callbackRun($callback, $params = array(), $paramStructure = null) { if (! $callback) return; if ($callback instanceof pspCallbackParameterToReference) { // TODO support ParamStructure to select which $param push to reference if (isset($params[0])) $callback->callback = $params[0]; return true; } if ($callback instanceof pspCallback) { $paramStructure = $callback->params; $callback = $callback->callback; } if (! $paramStructure) return call_user_func_array($callback, $params); $p = 0; foreach($paramStructure as $i => $v) { $paramStructure[$i] = $v instanceof pspCallbackParam ? $params[$p++] : $v; } return call_user_func_array($callback, $paramStructure); } /** * Merge 2 pspphpQuery objects. * @param array $one * @param array $two * @protected * @todo node lists, pspphpQueryObject */ public static function merge($one, $two) { $elements = $one->elements; foreach($two->elements as $node) { $exists = false; foreach($elements as $node2) { if ($node2->isSameNode($node)) $exists = true; } if (! $exists) $elements[] = $node; } return $elements; // $one = $one->newInstance(); // $one->elements = $elements; // return $one; } /** * * @param $array * @param $callback * @param $invert * @return unknown_type * @link http://docs.jquery.com/Utilities/jQuery.grep */ public static function grep($array, $callback, $invert = false) { $result = array(); foreach($array as $k => $v) { $r = call_user_func_array($callback, array($v, $k)); if ($r === !(bool)$invert) $result[] = $v; } return $result; } public static function unique($array) { return array_unique($array); } /** * * @param $function * @return unknown_type * @TODO there are problems with non-static methods, second parameter pass it * but doesnt verify is method is really callable */ public static function isFunction($function) { return is_callable($function); } public static function trim($str) { return trim($str); } /* PLUGINS NAMESPACE */ /** * * @param $url * @param $callback * @param $param1 * @param $param2 * @param $param3 * @return pspphpQueryObject */ public static function browserGet($url, $callback, $param1 = null, $param2 = null, $param3 = null) { if (self::plugin('WebBrowser')) { $params = func_get_args(); return self::callbackRun(array(self::$plugins, 'browserGet'), $params); } else { self::debug('WebBrowser plugin not available...'); } } /** * * @param $url * @param $data * @param $callback * @param $param1 * @param $param2 * @param $param3 * @return pspphpQueryObject */ public static function browserPost($url, $data, $callback, $param1 = null, $param2 = null, $param3 = null) { if (self::plugin('WebBrowser')) { $params = func_get_args(); return self::callbackRun(array(self::$plugins, 'browserPost'), $params); } else { self::debug('WebBrowser plugin not available...'); } } /** * * @param $ajaxSettings * @param $callback * @param $param1 * @param $param2 * @param $param3 * @return pspphpQueryObject */ public static function browser($ajaxSettings, $callback, $param1 = null, $param2 = null, $param3 = null) { if (self::plugin('WebBrowser')) { $params = func_get_args(); return self::callbackRun(array(self::$plugins, 'browser'), $params); } else { self::debug('WebBrowser plugin not available...'); } } /** * * @param $code * @return string */ public static function php($code) { return self::code('php', $code); } /** * * @param $type * @param $code * @return string */ public static function code($type, $code) { return "<$type>"; } public static function __callStatic($method, $params) { return call_user_func_array( array(pspphpQuery::$plugins, $method), $params ); } protected static function dataSetupNode($node, $documentID) { // search are return if alredy exists foreach(pspphpQuery::$documents[$documentID]->dataNodes as $dataNode) { if ($node->isSameNode($dataNode)) return $dataNode; } // if doesn't, add it pspphpQuery::$documents[$documentID]->dataNodes[] = $node; return $node; } protected static function dataRemoveNode($node, $documentID) { // search are return if alredy exists foreach(pspphpQuery::$documents[$documentID]->dataNodes as $k => $dataNode) { if ($node->isSameNode($dataNode)) { unset(self::$documents[$documentID]->dataNodes[$k]); unset(self::$documents[$documentID]->data[ $dataNode->dataID ]); } } } public static function data($node, $name, $data, $documentID = null) { if (! $documentID) // TODO check if this works $documentID = self::getDocumentID($node); $document = pspphpQuery::$documents[$documentID]; $node = self::dataSetupNode($node, $documentID); if (! isset($node->dataID)) $node->dataID = ++pspphpQuery::$documents[$documentID]->uuid; $id = $node->dataID; if (! isset($document->data[$id])) $document->data[$id] = array(); if (! is_null($data)) $document->data[$id][$name] = $data; if ($name) { if (isset($document->data[$id][$name])) return $document->data[$id][$name]; } else return $id; } public static function removeData($node, $name, $documentID) { if (! $documentID) // TODO check if this works $documentID = self::getDocumentID($node); $document = pspphpQuery::$documents[$documentID]; $node = self::dataSetupNode($node, $documentID); $id = $node->dataID; if ($name) { if (isset($document->data[$id][$name])) unset($document->data[$id][$name]); $name = null; foreach($document->data[$id] as $name) break; if (! $name) self::removeData($node, $name, $documentID); } else { self::dataRemoveNode($node, $documentID); } } } /** * Plugins static namespace class. * * @author Tobiasz Cudnik * @package pspphpQuery * @todo move plugin methods here (as statics) */ class pspphpQueryPlugins { public function __call($method, $args) { if (isset(pspphpQuery::$extendStaticMethods[$method])) { $return = call_user_func_array( pspphpQuery::$extendStaticMethods[$method], $args ); } else if (isset(pspphpQuery::$pluginsStaticMethods[$method])) { $class = pspphpQuery::$pluginsStaticMethods[$method]; $realClass = "pspphpQueryPlugin_$class"; $return = call_user_func_array( array($realClass, $method), $args ); return isset($return) ? $return : $this; } else throw new Exception("Method '{$method}' doesnt exist"); } } /** * Shortcut to pspphpQuery::pspPQ($arg1, $context) * Chainable. * * @see pspphpQuery::pspPQ() * @return pspphpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery * @author Tobiasz Cudnik * @package pspphpQuery */ function pspPQ($arg1, $context = null) { $args = func_get_args(); return call_user_func_array( array('pspphpQuery', 'pspPQ'), $args ); }K r\ 0{Vހ>smartSEO/lib/scripts/plugin-depedencies/plugin_depedencies.php obthe_plugin = $the_plugin; } /** * Singleton pattern * * @return wwcAmzAffSpinner Singleton instance */ static public function getInstance() { if (!self::$_instance) { self::$_instance = new self; } return self::$_instance; } public function initDepedenciesPage() { $is_admin = is_admin() === true ? true : false; // If the user can manage options, let the fun begin! if ( $is_admin /*&& current_user_can( 'manage_options' )*/ ){ if ($is_admin){ // Adds actions to hook in the required css and javascript add_action( "admin_print_styles", array( $this->the_plugin, 'admin_load_styles') ); add_action( "admin_print_scripts", array( $this->the_plugin, 'admin_load_scripts') ); } // create dashboard page add_action( 'admin_menu', array( $this, 'createDepedenciesPage' ) ); // get fatal errors add_action ( 'admin_notices', array( $this->the_plugin, 'fatal_errors'), 10 ); // get fatal errors add_action ( 'admin_notices', array( $this->the_plugin, 'admin_warnings'), 10 ); } $this->the_plugin->load_modules( 'depedencies' ); } public function createDepedenciesPage() { add_menu_page( $this->the_plugin->pluginName . __( ' Depedencies', $this->the_plugin->localizationName ), $this->the_plugin->pluginName . __( ' Depedencies', $this->the_plugin->localizationName ), 'manage_options', $this->the_plugin->alias, array( $this, 'depedencies_manage_options_template' ), $this->the_plugin->cfg['paths']['plugin_dir_url'] . 'icon_16.png' ); } public function depedencies_manage_options_template() { // Derive the current path and load up psp_aaInterfaceTemplates $plugin_path = $this->the_plugin->cfg['paths']['freamwork_dir_path']; if(class_exists('psp_aaInterfaceTemplates') != true) { require_once($plugin_path . 'settings-template.class.php'); // Initalize the your psp_aaInterfaceTemplates $psp_aaInterfaceTemplates = new psp_aaInterfaceTemplates($this->the_plugin->cfg); // try to init the interface $psp_aaInterfaceTemplates->printBaseInterface( 'depedencies' ); } } public function depedencies_plugin_redirect_valid() { //delete_option('psp_depedencies_is_valid'); //$site_url = $this->the_plugin->get_current_page_url(array()); //header( "Location: $site_url" ); delete_option('psp_depedencies_is_valid'); wp_redirect( get_admin_url() . 'admin.php?page=psp' ); } public function depedencies_plugin_redirect() { delete_option('psp_depedencies_do_activation_redirect'); wp_redirect( get_admin_url() . 'admin.php?page=psp' ); } public function verifyDepedencies() { $ret = array('status' => 'valid', 'msg' => ''); ob_start(); ?>
    All of the bellow libraries must be enabled in order for our plugin to function right!
    */ class scssc { static public $VERSION = 'v0.0.12'; static protected $operatorNames = array( '+' => "add", '-' => "sub", '*' => "mul", '/' => "div", '%' => "mod", '==' => "eq", '!=' => "neq", '<' => "lt", '>' => "gt", '<=' => "lte", '>=' => "gte", ); static protected $namespaces = array( "special" => "%", "mixin" => "@", "function" => "^", ); static protected $unitTable = array( "in" => array( "in" => 1, "pt" => 72, "pc" => 6, "cm" => 2.54, "mm" => 25.4, "px" => 96, ) ); static public $true = array("keyword", "true"); static public $false = array("keyword", "false"); static public $null = array("null"); static public $defaultValue = array("keyword", ""); static public $selfSelector = array("self"); protected $importPaths = array(""); protected $importCache = array(); protected $userFunctions = array(); protected $registeredVars = array(); protected $numberPrecision = 5; protected $formatter = "scss_formatter_nested"; /** * Compile scss * * @param string $code * @param string $name * * @return string */ public function compile($code, $name = null) { $this->indentLevel = -1; $this->commentsSeen = array(); $this->extends = array(); $this->extendsMap = array(); $this->parsedFiles = array(); $this->env = null; $this->scope = null; $locale = setlocale(LC_NUMERIC, 0); setlocale(LC_NUMERIC, "C"); $this->parser = new scss_parser($name); $tree = $this->parser->parse($code); $this->formatter = new $this->formatter(); $this->pushEnv($tree); $this->injectVariables($this->registeredVars); $this->compileRoot($tree); $this->popEnv(); $out = $this->formatter->format($this->scope); setlocale(LC_NUMERIC, $locale); return $out; } protected function isSelfExtend($target, $origin) { foreach ($origin as $sel) { if (in_array($target, $sel)) { return true; } } return false; } protected function pushExtends($target, $origin) { if ($this->isSelfExtend($target, $origin)) { return; } $i = count($this->extends); $this->extends[] = array($target, $origin); foreach ($target as $part) { if (isset($this->extendsMap[$part])) { $this->extendsMap[$part][] = $i; } else { $this->extendsMap[$part] = array($i); } } } protected function makeOutputBlock($type, $selectors = null) { $out = new stdClass; $out->type = $type; $out->lines = array(); $out->children = array(); $out->parent = $this->scope; $out->selectors = $selectors; $out->depth = $this->env->depth; return $out; } protected function matchExtendsSingle($single, &$outOrigin) { $counts = array(); foreach ($single as $part) { if (!is_string($part)) return false; // hmm if (isset($this->extendsMap[$part])) { foreach ($this->extendsMap[$part] as $idx) { $counts[$idx] = isset($counts[$idx]) ? $counts[$idx] + 1 : 1; } } } $outOrigin = array(); $found = false; foreach ($counts as $idx => $count) { list($target, $origin) = $this->extends[$idx]; // check count if ($count != count($target)) continue; // check if target is subset of single if (array_diff(array_intersect($single, $target), $target)) continue; $rem = array_diff($single, $target); foreach ($origin as $j => $new) { // prevent infinite loop when target extends itself foreach ($new as $new_selector) { if (!array_diff($single, $new_selector)) { continue 2; } } $origin[$j][count($origin[$j]) - 1] = $this->combineSelectorSingle(end($new), $rem); } $outOrigin = array_merge($outOrigin, $origin); $found = true; } return $found; } protected function combineSelectorSingle($base, $other) { $tag = null; $out = array(); foreach (array($base, $other) as $single) { foreach ($single as $part) { if (preg_match('/^[^\[.#:]/', $part)) { $tag = $part; } else { $out[] = $part; } } } if ($tag) { array_unshift($out, $tag); } return $out; } protected function matchExtends($selector, &$out, $from = 0, $initial=true) { foreach ($selector as $i => $part) { if ($i < $from) continue; if ($this->matchExtendsSingle($part, $origin)) { $before = array_slice($selector, 0, $i); $after = array_slice($selector, $i + 1); foreach ($origin as $new) { $k = 0; // remove shared parts if ($initial) { foreach ($before as $k => $val) { if (!isset($new[$k]) || $val != $new[$k]) { break; } } } $result = array_merge( $before, $k > 0 ? array_slice($new, $k) : $new, $after); if ($result == $selector) continue; $out[] = $result; // recursively check for more matches $this->matchExtends($result, $out, $i, false); // selector sequence merging if (!empty($before) && count($new) > 1) { $result2 = array_merge( array_slice($new, 0, -1), $k > 0 ? array_slice($before, $k) : $before, array_slice($new, -1), $after); $out[] = $result2; } } } } } protected function flattenSelectors($block, $parentKey = null) { if ($block->selectors) { $selectors = array(); foreach ($block->selectors as $s) { $selectors[] = $s; if (!is_array($s)) continue; // check extends if (!empty($this->extendsMap)) { $this->matchExtends($s, $selectors); } } $block->selectors = array(); $placeholderSelector = false; foreach ($selectors as $selector) { if ($this->hasSelectorPlaceholder($selector)) { $placeholderSelector = true; continue; } $block->selectors[] = $this->compileSelector($selector); } if ($placeholderSelector && 0 == count($block->selectors) && null !== $parentKey) { unset($block->parent->children[$parentKey]); return; } } foreach ($block->children as $key => $child) { $this->flattenSelectors($child, $key); } } protected function compileRoot($rootBlock) { $this->scope = $this->makeOutputBlock('root'); $this->compileChildren($rootBlock->children, $this->scope); $this->flattenSelectors($this->scope); } protected function compileMedia($media) { $this->pushEnv($media); $mediaQuery = $this->compileMediaQuery($this->multiplyMedia($this->env)); if (!empty($mediaQuery)) { $this->scope = $this->makeOutputBlock("media", array($mediaQuery)); $parentScope = $this->mediaParent($this->scope); $parentScope->children[] = $this->scope; // top level properties in a media cause it to be wrapped $needsWrap = false; foreach ($media->children as $child) { $type = $child[0]; if ($type !== 'block' && $type !== 'media' && $type !== 'directive') { $needsWrap = true; break; } } if ($needsWrap) { $wrapped = (object)array( "selectors" => array(), "children" => $media->children ); $media->children = array(array("block", $wrapped)); } $this->compileChildren($media->children, $this->scope); $this->scope = $this->scope->parent; } $this->popEnv(); } protected function mediaParent($scope) { while (!empty($scope->parent)) { if (!empty($scope->type) && $scope->type != "media") { break; } $scope = $scope->parent; } return $scope; } // TODO refactor compileNestedBlock and compileMedia into same thing protected function compileNestedBlock($block, $selectors) { $this->pushEnv($block); $this->scope = $this->makeOutputBlock($block->type, $selectors); $this->scope->parent->children[] = $this->scope; $this->compileChildren($block->children, $this->scope); $this->scope = $this->scope->parent; $this->popEnv(); } /** * Recursively compiles a block. * * A block is analogous to a CSS block in most cases. A single SCSS document * is encapsulated in a block when parsed, but it does not have parent tags * so all of its children appear on the root level when compiled. * * Blocks are made up of selectors and children. * * The children of a block are just all the blocks that are defined within. * * Compiling the block involves pushing a fresh environment on the stack, * and iterating through the props, compiling each one. * * @see scss::compileChild() * * @param \StdClass $block */ protected function compileBlock($block) { $env = $this->pushEnv($block); $env->selectors = array_map(array($this, "evalSelector"), $block->selectors); $out = $this->makeOutputBlock(null, $this->multiplySelectors($env)); $this->scope->children[] = $out; $this->compileChildren($block->children, $out); $this->popEnv(); } // joins together .classes and #ids protected function flattenSelectorSingle($single) { $joined = array(); foreach ($single as $part) { if (empty($joined) || !is_string($part) || preg_match('/[\[.:#%]/', $part)) { $joined[] = $part; continue; } if (is_array(end($joined))) { $joined[] = $part; } else { $joined[count($joined) - 1] .= $part; } } return $joined; } // replaces all the interpolates protected function evalSelector($selector) { return array_map(array($this, "evalSelectorPart"), $selector); } protected function evalSelectorPart($piece) { foreach ($piece as &$p) { if (!is_array($p)) continue; switch ($p[0]) { case "interpolate": $p = $this->compileValue($p); break; case "string": $p = $this->compileValue($p); break; } } return $this->flattenSelectorSingle($piece); } // compiles to string // self(&) should have been replaced by now protected function compileSelector($selector) { if (!is_array($selector)) return $selector; // media and the like return implode(" ", array_map( array($this, "compileSelectorPart"), $selector)); } protected function compileSelectorPart($piece) { foreach ($piece as &$p) { if (!is_array($p)) continue; switch ($p[0]) { case "self": $p = "&"; break; default: $p = $this->compileValue($p); break; } } return implode($piece); } protected function hasSelectorPlaceholder($selector) { if (!is_array($selector)) return false; foreach ($selector as $parts) { foreach ($parts as $part) { if ('%' == $part[0]) { return true; } } } return false; } protected function compileChildren($stms, $out) { foreach ($stms as $stm) { $ret = $this->compileChild($stm, $out); if (isset($ret)) return $ret; } } protected function compileMediaQuery($queryList) { $out = "@media"; $first = true; foreach ($queryList as $query){ $type = null; $parts = array(); foreach ($query as $q) { switch ($q[0]) { case "mediaType": if ($type) { $type = $this->mergeMediaTypes($type, array_map(array($this, "compileValue"), array_slice($q, 1))); if (empty($type)) { // merge failed return null; } } else { $type = array_map(array($this, "compileValue"), array_slice($q, 1)); } break; case "mediaExp": if (isset($q[2])) { $parts[] = "(". $this->compileValue($q[1]) . $this->formatter->assignSeparator . $this->compileValue($q[2]) . ")"; } else { $parts[] = "(" . $this->compileValue($q[1]) . ")"; } break; } } if ($type) { array_unshift($parts, implode(' ', array_filter($type))); } if (!empty($parts)) { if ($first) { $first = false; $out .= " "; } else { $out .= $this->formatter->tagSeparator; } $out .= implode(" and ", $parts); } } return $out; } protected function mergeMediaTypes($type1, $type2) { if (empty($type1)) { return $type2; } if (empty($type2)) { return $type1; } $m1 = ''; $t1 = ''; if (count($type1) > 1) { $m1= strtolower($type1[0]); $t1= strtolower($type1[1]); } else { $t1 = strtolower($type1[0]); } $m2 = ''; $t2 = ''; if (count($type2) > 1) { $m2 = strtolower($type2[0]); $t2 = strtolower($type2[1]); } else { $t2 = strtolower($type2[0]); } if (($m1 == 'not') ^ ($m2 == 'not')) { if ($t1 == $t2) { return null; } return array( $m1 == 'not' ? $m2 : $m1, $m1 == 'not' ? $t2 : $t1 ); } elseif ($m1 == 'not' && $m2 == 'not') { # CSS has no way of representing "neither screen nor print" if ($t1 != $t2) { return null; } return array('not', $t1); } elseif ($t1 != $t2) { return null; } else { // t1 == t2, neither m1 nor m2 are "not" return array(empty($m1)? $m2 : $m1, $t1); } } // returns true if the value was something that could be imported protected function compileImport($rawPath, $out) { if ($rawPath[0] == "string") { $path = $this->compileStringContent($rawPath); if ($path = $this->findImport($path)) { $this->importFile($path, $out); return true; } return false; } if ($rawPath[0] == "list") { // handle a list of strings if (count($rawPath[2]) == 0) return false; foreach ($rawPath[2] as $path) { if ($path[0] != "string") return false; } foreach ($rawPath[2] as $path) { $this->compileImport($path, $out); } return true; } return false; } // return a value to halt execution protected function compileChild($child, $out) { $this->sourcePos = isset($child[-1]) ? $child[-1] : -1; $this->sourceParser = isset($child[-2]) ? $child[-2] : $this->parser; switch ($child[0]) { case "import": list(,$rawPath) = $child; $rawPath = $this->reduce($rawPath); if (!$this->compileImport($rawPath, $out)) { $out->lines[] = "@import " . $this->compileValue($rawPath) . ";"; } break; case "directive": list(, $directive) = $child; $s = "@" . $directive->name; if (!empty($directive->value)) { $s .= " " . $this->compileValue($directive->value); } $this->compileNestedBlock($directive, array($s)); break; case "media": $this->compileMedia($child[1]); break; case "block": $this->compileBlock($child[1]); break; case "charset": $out->lines[] = "@charset ".$this->compileValue($child[1]).";"; break; case "assign": list(,$name, $value) = $child; if ($name[0] == "var") { $isDefault = !empty($child[3]); if ($isDefault) { $existingValue = $this->get($name[1], true); $shouldSet = $existingValue === true || $existingValue == self::$null; } if (!$isDefault || $shouldSet) { $this->set($name[1], $this->reduce($value)); } break; } // if the value reduces to null from something else then // the property should be discarded if ($value[0] != "null") { $value = $this->reduce($value); if ($value[0] == "null") { break; } } $compiledValue = $this->compileValue($value); $out->lines[] = $this->formatter->property( $this->compileValue($name), $compiledValue); break; case "comment": $out->lines[] = $child[1]; break; case "mixin": case "function": list(,$block) = $child; $this->set(self::$namespaces[$block->type] . $block->name, $block); break; case "extend": list(, $selectors) = $child; foreach ($selectors as $sel) { // only use the first one $sel = current($this->evalSelector($sel)); $this->pushExtends($sel, $out->selectors); } break; case "if": list(, $if) = $child; if ($this->isTruthy($this->reduce($if->cond, true))) { return $this->compileChildren($if->children, $out); } else { foreach ($if->cases as $case) { if ($case->type == "else" || $case->type == "elseif" && $this->isTruthy($this->reduce($case->cond))) { return $this->compileChildren($case->children, $out); } } } break; case "return": return $this->reduce($child[1], true); case "each": list(,$each) = $child; $list = $this->coerceList($this->reduce($each->list)); foreach ($list[2] as $item) { $this->pushEnv(); $this->set($each->var, $item); // TODO: allow return from here $this->compileChildren($each->children, $out); $this->popEnv(); } break; case "while": list(,$while) = $child; while ($this->isTruthy($this->reduce($while->cond, true))) { $ret = $this->compileChildren($while->children, $out); if ($ret) return $ret; } break; case "for": list(,$for) = $child; $start = $this->reduce($for->start, true); $start = $start[1]; $end = $this->reduce($for->end, true); $end = $end[1]; $d = $start < $end ? 1 : -1; while (true) { if ((!$for->until && $start - $d == $end) || ($for->until && $start == $end)) { break; } $this->set($for->var, array("number", $start, "")); $start += $d; $ret = $this->compileChildren($for->children, $out); if ($ret) return $ret; } break; case "nestedprop": list(,$prop) = $child; $prefixed = array(); $prefix = $this->compileValue($prop->prefix) . "-"; foreach ($prop->children as $child) { if ($child[0] == "assign") { array_unshift($child[1][2], $prefix); } if ($child[0] == "nestedprop") { array_unshift($child[1]->prefix[2], $prefix); } $prefixed[] = $child; } $this->compileChildren($prefixed, $out); break; case "include": // including a mixin list(,$name, $argValues, $content) = $child; $mixin = $this->get(self::$namespaces["mixin"] . $name, false); if (!$mixin) { $this->throwError("Undefined mixin $name"); } $callingScope = $this->env; // push scope, apply args $this->pushEnv(); if ($this->env->depth > 0) { $this->env->depth--; } if (isset($content)) { $content->scope = $callingScope; $this->setRaw(self::$namespaces["special"] . "content", $content); } if (isset($mixin->args)) { $this->applyArguments($mixin->args, $argValues); } foreach ($mixin->children as $child) { $this->compileChild($child, $out); } $this->popEnv(); break; case "mixin_content": $content = $this->get(self::$namespaces["special"] . "content"); if (!isset($content)) { $this->throwError("Expected @content inside of mixin"); } $strongTypes = array('include', 'block', 'for', 'while'); foreach ($content->children as $child) { $this->storeEnv = (in_array($child[0], $strongTypes)) ? null : $content->scope; $this->compileChild($child, $out); } unset($this->storeEnv); break; case "debug": list(,$value, $pos) = $child; $line = $this->parser->getLineNo($pos); $value = $this->compileValue($this->reduce($value, true)); //fwrite(STDERR, "Line $line DEBUG: $value\n"); break; default: $this->throwError("unknown child type: $child[0]"); } } protected function expToString($exp) { list(, $op, $left, $right, $inParens, $whiteLeft, $whiteRight) = $exp; $content = array($this->reduce($left)); if ($whiteLeft) $content[] = " "; $content[] = $op; if ($whiteRight) $content[] = " "; $content[] = $this->reduce($right); return array("string", "", $content); } protected function isTruthy($value) { return $value != self::$false && $value != self::$null; } // should $value cause its operand to eval protected function shouldEval($value) { switch ($value[0]) { case "exp": if ($value[1] == "/") { return $this->shouldEval($value[2], $value[3]); } case "var": case "fncall": return true; } return false; } protected function reduce($value, $inExp = false) { list($type) = $value; switch ($type) { case "exp": list(, $op, $left, $right, $inParens) = $value; $opName = isset(self::$operatorNames[$op]) ? self::$operatorNames[$op] : $op; $inExp = $inExp || $this->shouldEval($left) || $this->shouldEval($right); $left = $this->reduce($left, true); $right = $this->reduce($right, true); // only do division in special cases if ($opName == "div" && !$inParens && !$inExp) { if ($left[0] != "color" && $right[0] != "color") { return $this->expToString($value); } } $left = $this->coerceForExpression($left); $right = $this->coerceForExpression($right); $ltype = $left[0]; $rtype = $right[0]; // this tries: // 1. op_[op name]_[left type]_[right type] // 2. op_[left type]_[right type] (passing the op as first arg // 3. op_[op name] $fn = "op_${opName}_${ltype}_${rtype}"; if (is_callable(array($this, $fn)) || (($fn = "op_${ltype}_${rtype}") && is_callable(array($this, $fn)) && $passOp = true) || (($fn = "op_${opName}") && is_callable(array($this, $fn)) && $genOp = true)) { $unitChange = false; if (!isset($genOp) && $left[0] == "number" && $right[0] == "number") { if ($opName == "mod" && $right[2] != "") { $this->throwError("Cannot modulo by a number with units: $right[1]$right[2]."); } $unitChange = true; $emptyUnit = $left[2] == "" || $right[2] == ""; $targetUnit = "" != $left[2] ? $left[2] : $right[2]; if ($opName != "mul") { $left[2] = "" != $left[2] ? $left[2] : $targetUnit; $right[2] = "" != $right[2] ? $right[2] : $targetUnit; } if ($opName != "mod") { $left = $this->normalizeNumber($left); $right = $this->normalizeNumber($right); } if ($opName == "div" && !$emptyUnit && $left[2] == $right[2]) { $targetUnit = ""; } if ($opName == "mul") { $left[2] = "" != $left[2] ? $left[2] : $right[2]; $right[2] = "" != $right[2] ? $right[2] : $left[2]; } elseif ($opName == "div" && $left[2] == $right[2]) { $left[2] = ""; $right[2] = ""; } } $shouldEval = $inParens || $inExp; if (isset($passOp)) { $out = $this->$fn($op, $left, $right, $shouldEval); } else { $out = $this->$fn($left, $right, $shouldEval); } if (isset($out)) { if ($unitChange && $out[0] == "number") { $out = $this->coerceUnit($out, $targetUnit); } return $out; } } return $this->expToString($value); case "unary": list(, $op, $exp, $inParens) = $value; $inExp = $inExp || $this->shouldEval($exp); $exp = $this->reduce($exp); if ($exp[0] == "number") { switch ($op) { case "+": return $exp; case "-": $exp[1] *= -1; return $exp; } } if ($op == "not") { if ($inExp || $inParens) { if ($exp == self::$false) { return self::$true; } else { return self::$false; } } else { $op = $op . " "; } } return array("string", "", array($op, $exp)); case "var": list(, $name) = $value; return $this->reduce($this->get($name)); case "list": foreach ($value[2] as &$item) { $item = $this->reduce($item); } return $value; case "string": foreach ($value[2] as &$item) { if (is_array($item)) { $item = $this->reduce($item); } } return $value; case "interpolate": $value[1] = $this->reduce($value[1]); return $value; case "fncall": list(,$name, $argValues) = $value; // user defined function? $func = $this->get(self::$namespaces["function"] . $name, false); if ($func) { $this->pushEnv(); // set the args if (isset($func->args)) { $this->applyArguments($func->args, $argValues); } // throw away lines and children $tmp = (object)array( "lines" => array(), "children" => array() ); $ret = $this->compileChildren($func->children, $tmp); $this->popEnv(); return !isset($ret) ? self::$defaultValue : $ret; } // built in function if ($this->callBuiltin($name, $argValues, $returnValue)) { return $returnValue; } // need to flatten the arguments into a list $listArgs = array(); foreach ((array)$argValues as $arg) { if (empty($arg[0])) { $listArgs[] = $this->reduce($arg[1]); } } return array("function", $name, array("list", ",", $listArgs)); default: return $value; } } public function normalizeValue($value) { $value = $this->coerceForExpression($this->reduce($value)); list($type) = $value; switch ($type) { case "list": $value = $this->extractInterpolation($value); if ($value[0] != "list") { return array("keyword", $this->compileValue($value)); } foreach ($value[2] as $key => $item) { $value[2][$key] = $this->normalizeValue($item); } return $value; case "number": return $this->normalizeNumber($value); default: return $value; } } // just does physical lengths for now protected function normalizeNumber($number) { list(, $value, $unit) = $number; if (isset(self::$unitTable["in"][$unit])) { $conv = self::$unitTable["in"][$unit]; return array("number", $value / $conv, "in"); } return $number; } // $number should be normalized protected function coerceUnit($number, $unit) { list(, $value, $baseUnit) = $number; if (isset(self::$unitTable[$baseUnit][$unit])) { $value = $value * self::$unitTable[$baseUnit][$unit]; } return array("number", $value, $unit); } protected function op_add_number_number($left, $right) { return array("number", $left[1] + $right[1], $left[2]); } protected function op_mul_number_number($left, $right) { return array("number", $left[1] * $right[1], $left[2]); } protected function op_sub_number_number($left, $right) { return array("number", $left[1] - $right[1], $left[2]); } protected function op_div_number_number($left, $right) { return array("number", $left[1] / $right[1], $left[2]); } protected function op_mod_number_number($left, $right) { return array("number", $left[1] % $right[1], $left[2]); } // adding strings protected function op_add($left, $right) { if ($strLeft = $this->coerceString($left)) { if ($right[0] == "string") { $right[1] = ""; } $strLeft[2][] = $right; return $strLeft; } if ($strRight = $this->coerceString($right)) { if ($left[0] == "string") { $left[1] = ""; } array_unshift($strRight[2], $left); return $strRight; } } protected function op_and($left, $right, $shouldEval) { if (!$shouldEval) return; if ($left != self::$false) return $right; return $left; } protected function op_or($left, $right, $shouldEval) { if (!$shouldEval) return; if ($left != self::$false) return $left; return $right; } protected function op_color_color($op, $left, $right) { $out = array('color'); foreach (range(1, 3) as $i) { $lval = isset($left[$i]) ? $left[$i] : 0; $rval = isset($right[$i]) ? $right[$i] : 0; switch ($op) { case '+': $out[] = $lval + $rval; break; case '-': $out[] = $lval - $rval; break; case '*': $out[] = $lval * $rval; break; case '%': $out[] = $lval % $rval; break; case '/': if ($rval == 0) { $this->throwError("color: Can't divide by zero"); } $out[] = $lval / $rval; break; case "==": return $this->op_eq($left, $right); case "!=": return $this->op_neq($left, $right); default: $this->throwError("color: unknown op $op"); } } if (isset($left[4])) $out[4] = $left[4]; elseif (isset($right[4])) $out[4] = $right[4]; return $this->fixColor($out); } protected function op_color_number($op, $left, $right) { $value = $right[1]; return $this->op_color_color($op, $left, array("color", $value, $value, $value)); } protected function op_number_color($op, $left, $right) { $value = $left[1]; return $this->op_color_color($op, array("color", $value, $value, $value), $right); } protected function op_eq($left, $right) { if (($lStr = $this->coerceString($left)) && ($rStr = $this->coerceString($right))) { $lStr[1] = ""; $rStr[1] = ""; return $this->toBool($this->compileValue($lStr) == $this->compileValue($rStr)); } return $this->toBool($left == $right); } protected function op_neq($left, $right) { return $this->toBool($left != $right); } protected function op_gte_number_number($left, $right) { return $this->toBool($left[1] >= $right[1]); } protected function op_gt_number_number($left, $right) { return $this->toBool($left[1] > $right[1]); } protected function op_lte_number_number($left, $right) { return $this->toBool($left[1] <= $right[1]); } protected function op_lt_number_number($left, $right) { return $this->toBool($left[1] < $right[1]); } public function toBool($thing) { return $thing ? self::$true : self::$false; } /** * Compiles a primitive value into a CSS property value. * * Values in scssphp are typed by being wrapped in arrays, their format is * typically: * * array(type, contents [, additional_contents]*) * * The input is expected to be reduced. This function will not work on * things like expressions and variables. * * @param array $value */ protected function compileValue($value) { $value = $this->reduce($value); list($type) = $value; switch ($type) { case "keyword": return $value[1]; case "color": // [1] - red component (either number for a %) // [2] - green component // [3] - blue component // [4] - optional alpha component list(, $r, $g, $b) = $value; $r = round($r); $g = round($g); $b = round($b); if (count($value) == 5 && $value[4] != 1) { // rgba return 'rgba('.$r.', '.$g.', '.$b.', '.$value[4].')'; } $h = sprintf("#%02x%02x%02x", $r, $g, $b); // Converting hex color to short notation (e.g. #003399 to #039) if ($h[1] === $h[2] && $h[3] === $h[4] && $h[5] === $h[6]) { $h = '#' . $h[1] . $h[3] . $h[5]; } return $h; case "number": return round($value[1], $this->numberPrecision) . $value[2]; case "string": return $value[1] . $this->compileStringContent($value) . $value[1]; case "function": $args = !empty($value[2]) ? $this->compileValue($value[2]) : ""; return "$value[1]($args)"; case "list": $value = $this->extractInterpolation($value); if ($value[0] != "list") return $this->compileValue($value); list(, $delim, $items) = $value; $filtered = array(); foreach ($items as $item) { if ($item[0] == "null") continue; $filtered[] = $this->compileValue($item); } return implode("$delim ", $filtered); case "interpolated": # node created by extractInterpolation list(, $interpolate, $left, $right) = $value; list(,, $whiteLeft, $whiteRight) = $interpolate; $left = count($left[2]) > 0 ? $this->compileValue($left).$whiteLeft : ""; $right = count($right[2]) > 0 ? $whiteRight.$this->compileValue($right) : ""; return $left.$this->compileValue($interpolate).$right; case "interpolate": # raw parse node list(, $exp) = $value; // strip quotes if it's a string $reduced = $this->reduce($exp); switch ($reduced[0]) { case "string": $reduced = array("keyword", $this->compileStringContent($reduced)); break; case "null": $reduced = array("keyword", ""); } return $this->compileValue($reduced); case "null": return "null"; default: $this->throwError("unknown value type: $type"); } } protected function compileStringContent($string) { $parts = array(); foreach ($string[2] as $part) { if (is_array($part)) { $parts[] = $this->compileValue($part); } else { $parts[] = $part; } } return implode($parts); } // doesn't need to be recursive, compileValue will handle that protected function extractInterpolation($list) { $items = $list[2]; foreach ($items as $i => $item) { if ($item[0] == "interpolate") { $before = array("list", $list[1], array_slice($items, 0, $i)); $after = array("list", $list[1], array_slice($items, $i + 1)); return array("interpolated", $item, $before, $after); } } return $list; } // find the final set of selectors protected function multiplySelectors($env) { $envs = array(); while (null !== $env) { if (!empty($env->selectors)) { $envs[] = $env; } $env = $env->parent; }; $selectors = array(); $parentSelectors = array(array()); while ($env = array_pop($envs)) { $selectors = array(); foreach ($env->selectors as $selector) { foreach ($parentSelectors as $parent) { $selectors[] = $this->joinSelectors($parent, $selector); } } $parentSelectors = $selectors; } return $selectors; } // looks for & to replace, or append parent before child protected function joinSelectors($parent, $child) { $setSelf = false; $out = array(); foreach ($child as $part) { $newPart = array(); foreach ($part as $p) { if ($p == self::$selfSelector) { $setSelf = true; foreach ($parent as $i => $parentPart) { if ($i > 0) { $out[] = $newPart; $newPart = array(); } foreach ($parentPart as $pp) { $newPart[] = $pp; } } } else { $newPart[] = $p; } } $out[] = $newPart; } return $setSelf ? $out : array_merge($parent, $child); } protected function multiplyMedia($env, $childQueries = null) { if (!isset($env) || !empty($env->block->type) && $env->block->type != "media") { return $childQueries; } // plain old block, skip if (empty($env->block->type)) { return $this->multiplyMedia($env->parent, $childQueries); } $parentQueries = $env->block->queryList; if ($childQueries == null) { $childQueries = $parentQueries; } else { $originalQueries = $childQueries; $childQueries = array(); foreach ($parentQueries as $parentQuery){ foreach ($originalQueries as $childQuery) { $childQueries []= array_merge($parentQuery, $childQuery); } } } return $this->multiplyMedia($env->parent, $childQueries); } // convert something to list protected function coerceList($item, $delim = ",") { if (isset($item) && $item[0] == "list") { return $item; } return array("list", $delim, !isset($item) ? array(): array($item)); } protected function applyArguments($argDef, $argValues) { $hasVariable = false; $args = array(); foreach ($argDef as $i => $arg) { list($name, $default, $isVariable) = $argDef[$i]; $args[$name] = array($i, $name, $default, $isVariable); $hasVariable |= $isVariable; } $keywordArgs = array(); $deferredKeywordArgs = array(); $remaining = array(); // assign the keyword args foreach ((array) $argValues as $arg) { if (!empty($arg[0])) { if (!isset($args[$arg[0][1]])) { if ($hasVariable) { $deferredKeywordArgs[$arg[0][1]] = $arg[1]; } else { $this->throwError("Mixin or function doesn't have an argument named $%s.", $arg[0][1]); } } elseif ($args[$arg[0][1]][0] < count($remaining)) { $this->throwError("The argument $%s was passed both by position and by name.", $arg[0][1]); } else { $keywordArgs[$arg[0][1]] = $arg[1]; } } elseif (count($keywordArgs)) { $this->throwError('Positional arguments must come before keyword arguments.'); } elseif ($arg[2] == true) { $val = $this->reduce($arg[1], true); if ($val[0] == "list") { foreach ($val[2] as $name => $item) { if (!is_numeric($name)) { $keywordArgs[$name] = $item; } else { $remaining[] = $item; } } } else { $remaining[] = $val; } } else { $remaining[] = $arg[1]; } } foreach ($args as $arg) { list($i, $name, $default, $isVariable) = $arg; if ($isVariable) { $val = array("list", ",", array()); for ($count = count($remaining); $i < $count; $i++) { $val[2][] = $remaining[$i]; } foreach ($deferredKeywordArgs as $itemName => $item) { $val[2][$itemName] = $item; } } elseif (isset($remaining[$i])) { $val = $remaining[$i]; } elseif (isset($keywordArgs[$name])) { $val = $keywordArgs[$name]; } elseif (!empty($default)) { $val = $default; } else { $this->throwError("Missing argument $name"); } $this->set($name, $this->reduce($val, true), true); } } protected function pushEnv($block=null) { $env = new stdClass; $env->parent = $this->env; $env->store = array(); $env->block = $block; $env->depth = isset($this->env->depth) ? $this->env->depth + 1 : 0; $this->env = $env; return $env; } protected function normalizeName($name) { return str_replace("-", "_", $name); } protected function getStoreEnv() { return isset($this->storeEnv) ? $this->storeEnv : $this->env; } protected function set($name, $value, $shadow=false) { $name = $this->normalizeName($name); if ($shadow) { $this->setRaw($name, $value); } else { $this->setExisting($name, $value); } } protected function setExisting($name, $value, $env = null) { if (!isset($env)) $env = $this->getStoreEnv(); if (isset($env->store[$name]) || !isset($env->parent)) { $env->store[$name] = $value; } else { $this->setExisting($name, $value, $env->parent); } } protected function setRaw($name, $value) { $env = $this->getStoreEnv(); $env->store[$name] = $value; } public function get($name, $defaultValue = null, $env = null) { $name = $this->normalizeName($name); if (!isset($env)) $env = $this->getStoreEnv(); if (!isset($defaultValue)) $defaultValue = self::$defaultValue; if (isset($env->store[$name])) { return $env->store[$name]; } elseif (isset($env->parent)) { return $this->get($name, $defaultValue, $env->parent); } return $defaultValue; // found nothing } protected function injectVariables(array $args) { if (empty($args)) { return; } $parser = new scss_parser(__METHOD__, false); foreach ($args as $name => $strValue) { if ($name[0] === '$') { $name = substr($name, 1); } $parser->env = null; $parser->count = 0; $parser->buffer = (string) $strValue; $parser->inParens = false; $parser->eatWhiteDefault = true; $parser->insertComments = true; if ( ! $parser->valueList($value)) { throw new Exception("failed to parse passed in variable $name: $strValue"); } $this->set($name, $value); } } /** * Set variables * * @param array $variables */ public function setVariables(array $variables) { $this->registeredVars = array_merge($this->registeredVars, $variables); } /** * Unset variable * * @param string $name */ public function unsetVariable($name) { unset($this->registeredVars[$name]); } protected function popEnv() { $env = $this->env; $this->env = $this->env->parent; return $env; } public function getParsedFiles() { return $this->parsedFiles; } public function addImportPath($path) { $this->importPaths[] = $path; } public function setImportPaths($path) { $this->importPaths = (array)$path; } public function setNumberPrecision($numberPrecision) { $this->numberPrecision = $numberPrecision; } public function setFormatter($formatterName) { $this->formatter = $formatterName; } public function registerFunction($name, $func) { $this->userFunctions[$this->normalizeName($name)] = $func; } public function unregisterFunction($name) { unset($this->userFunctions[$this->normalizeName($name)]); } protected function importFile($path, $out) { // see if tree is cached $realPath = realpath($path); if (isset($this->importCache[$realPath])) { $tree = $this->importCache[$realPath]; } else { $code = OMB()->wp_filesystem->get_contents($path); $parser = new scss_parser($path, false); $tree = $parser->parse($code); $this->parsedFiles[] = $path; $this->importCache[$realPath] = $tree; } $pi = pathinfo($path); array_unshift($this->importPaths, $pi['dirname']); $this->compileChildren($tree->children, $out); array_shift($this->importPaths); } // results the file path for an import url if it exists public function findImport($url) { $urls = array(); // for "normal" scss imports (ignore vanilla css and external requests) if (!preg_match('/\.css|^http:\/\/$/', $url)) { // try both normal and the _partial filename $urls = array($url, preg_replace('/[^\/]+$/', '_\0', $url)); } foreach ($this->importPaths as $dir) { if (is_string($dir)) { // check urls for normal import paths foreach ($urls as $full) { $full = $dir . (!empty($dir) && substr($dir, -1) != '/' ? '/' : '') . $full; if ($this->fileExists($file = $full.'.scss') || $this->fileExists($file = $full)) { return $file; } } } else { // check custom callback for import path $file = call_user_func($dir,$url,$this); if ($file !== null) { return $file; } } } return null; } protected function fileExists($name) { return is_file($name); } protected function callBuiltin($name, $args, &$returnValue) { // try a lib function $name = $this->normalizeName($name); $libName = "lib_".$name; $f = array($this, $libName); if (is_callable($f)) { $prototype = isset(self::$$libName) ? self::$$libName : null; $sorted = $this->sortArgs($prototype, $args); foreach ($sorted as &$val) { $val = $this->reduce($val, true); } $returnValue = call_user_func($f, $sorted, $this); } elseif (isset($this->userFunctions[$name])) { // see if we can find a user function $fn = $this->userFunctions[$name]; foreach ($args as &$val) { $val = $this->reduce($val[1], true); } $returnValue = call_user_func($fn, $args, $this); } if (isset($returnValue)) { // coerce a php value into a scss one if (is_numeric($returnValue)) { $returnValue = array('number', $returnValue, ""); } elseif (is_bool($returnValue)) { $returnValue = $returnValue ? self::$true : self::$false; } elseif (!is_array($returnValue)) { $returnValue = array('keyword', $returnValue); } return true; } return false; } // sorts any keyword arguments // TODO: merge with apply arguments protected function sortArgs($prototype, $args) { $keyArgs = array(); $posArgs = array(); foreach ($args as $arg) { list($key, $value) = $arg; $key = $key[1]; if (empty($key)) { $posArgs[] = $value; } else { $keyArgs[$key] = $value; } } if (!isset($prototype)) return $posArgs; $finalArgs = array(); foreach ($prototype as $i => $names) { if (isset($posArgs[$i])) { $finalArgs[] = $posArgs[$i]; continue; } $set = false; foreach ((array)$names as $name) { if (isset($keyArgs[$name])) { $finalArgs[] = $keyArgs[$name]; $set = true; break; } } if (!$set) { $finalArgs[] = null; } } return $finalArgs; } protected function coerceForExpression($value) { if ($color = $this->coerceColor($value)) { return $color; } return $value; } protected function coerceColor($value) { switch ($value[0]) { case "color": return $value; case "keyword": $name = $value[1]; if (isset(self::$cssColors[$name])) { $rgba = explode(',', self::$cssColors[$name]); return isset($rgba[3]) ? array('color', (int) $rgba[0], (int) $rgba[1], (int) $rgba[2], (int) $rgba[3]) : array('color', (int) $rgba[0], (int) $rgba[1], (int) $rgba[2]); } return null; } return null; } protected function coerceString($value) { switch ($value[0]) { case "string": return $value; case "keyword": return array("string", "", array($value[1])); } return null; } public function assertList($value) { if ($value[0] != "list") $this->throwError("expecting list"); return $value; } public function assertColor($value) { if ($color = $this->coerceColor($value)) return $color; $this->throwError("expecting color"); } public function assertNumber($value) { if ($value[0] != "number") $this->throwError("expecting number"); return $value[1]; } protected function coercePercent($value) { if ($value[0] == "number") { if ($value[2] == "%") { return $value[1] / 100; } return $value[1]; } return 0; } // make sure a color's components don't go out of bounds protected function fixColor($c) { foreach (range(1, 3) as $i) { if ($c[$i] < 0) $c[$i] = 0; if ($c[$i] > 255) $c[$i] = 255; } return $c; } public function toHSL($red, $green, $blue) { $min = min($red, $green, $blue); $max = max($red, $green, $blue); $l = $min + $max; if ($min == $max) { $s = $h = 0; } else { $d = $max - $min; if ($l < 255) $s = $d / $l; else $s = $d / (510 - $l); if ($red == $max) $h = 60 * ($green - $blue) / $d; elseif ($green == $max) $h = 60 * ($blue - $red) / $d + 120; elseif ($blue == $max) $h = 60 * ($red - $green) / $d + 240; } return array('hsl', fmod($h, 360), $s * 100, $l / 5.1); } public function hueToRGB($m1, $m2, $h) { if ($h < 0) $h += 1; elseif ($h > 1) $h -= 1; if ($h * 6 < 1) return $m1 + ($m2 - $m1) * $h * 6; if ($h * 2 < 1) return $m2; if ($h * 3 < 2) return $m1 + ($m2 - $m1) * (2/3 - $h) * 6; return $m1; } // H from 0 to 360, S and L from 0 to 100 public function toRGB($hue, $saturation, $lightness) { if ($hue < 0) { $hue += 360; } $h = $hue / 360; $s = min(100, max(0, $saturation)) / 100; $l = min(100, max(0, $lightness)) / 100; $m2 = $l <= 0.5 ? $l * ($s + 1) : $l + $s - $l * $s; $m1 = $l * 2 - $m2; $r = $this->hueToRGB($m1, $m2, $h + 1/3) * 255; $g = $this->hueToRGB($m1, $m2, $h) * 255; $b = $this->hueToRGB($m1, $m2, $h - 1/3) * 255; $out = array('color', $r, $g, $b); return $out; } // Built in functions protected static $lib_if = array("condition", "if-true", "if-false"); protected function lib_if($args) { list($cond,$t, $f) = $args; if (!$this->isTruthy($cond)) return $f; return $t; } protected static $lib_index = array("list", "value"); protected function lib_index($args) { list($list, $value) = $args; $list = $this->assertList($list); $values = array(); foreach ($list[2] as $item) { $values[] = $this->normalizeValue($item); } $key = array_search($this->normalizeValue($value), $values); return false === $key ? false : $key + 1; } protected static $lib_rgb = array("red", "green", "blue"); protected function lib_rgb($args) { list($r,$g,$b) = $args; return array("color", $r[1], $g[1], $b[1]); } protected static $lib_rgba = array( array("red", "color"), "green", "blue", "alpha"); protected function lib_rgba($args) { if ($color = $this->coerceColor($args[0])) { $num = !isset($args[1]) ? $args[3] : $args[1]; $alpha = $this->assertNumber($num); $color[4] = $alpha; return $color; } list($r,$g,$b, $a) = $args; return array("color", $r[1], $g[1], $b[1], $a[1]); } // helper function for adjust_color, change_color, and scale_color protected function alter_color($args, $fn) { $color = $this->assertColor($args[0]); foreach (array(1,2,3,7) as $i) { if (isset($args[$i])) { $val = $this->assertNumber($args[$i]); $ii = $i == 7 ? 4 : $i; // alpha $color[$ii] = $this->$fn(isset($color[$ii]) ? $color[$ii] : 0, $val, $i); } } if (isset($args[4]) || isset($args[5]) || isset($args[6])) { $hsl = $this->toHSL($color[1], $color[2], $color[3]); foreach (array(4,5,6) as $i) { if (isset($args[$i])) { $val = $this->assertNumber($args[$i]); $hsl[$i - 3] = $this->$fn($hsl[$i - 3], $val, $i); } } $rgb = $this->toRGB($hsl[1], $hsl[2], $hsl[3]); if (isset($color[4])) $rgb[4] = $color[4]; $color = $rgb; } return $color; } protected static $lib_adjust_color = array( "color", "red", "green", "blue", "hue", "saturation", "lightness", "alpha" ); protected function adjust_color_helper($base, $alter, $i) { return $base += $alter; } protected function lib_adjust_color($args) { return $this->alter_color($args, "adjust_color_helper"); } protected static $lib_change_color = array( "color", "red", "green", "blue", "hue", "saturation", "lightness", "alpha" ); protected function change_color_helper($base, $alter, $i) { return $alter; } protected function lib_change_color($args) { return $this->alter_color($args, "change_color_helper"); } protected static $lib_scale_color = array( "color", "red", "green", "blue", "hue", "saturation", "lightness", "alpha" ); protected function scale_color_helper($base, $scale, $i) { // 1,2,3 - rgb // 4, 5, 6 - hsl // 7 - a switch ($i) { case 1: case 2: case 3: $max = 255; break; case 4: $max = 360; break; case 7: $max = 1; break; default: $max = 100; } $scale = $scale / 100; if ($scale < 0) { return $base * $scale + $base; } else { return ($max - $base) * $scale + $base; } } protected function lib_scale_color($args) { return $this->alter_color($args, "scale_color_helper"); } protected static $lib_ie_hex_str = array("color"); protected function lib_ie_hex_str($args) { $color = $this->coerceColor($args[0]); $color[4] = isset($color[4]) ? round(255*$color[4]) : 255; return sprintf('#%02X%02X%02X%02X', $color[4], $color[1], $color[2], $color[3]); } protected static $lib_red = array("color"); protected function lib_red($args) { $color = $this->coerceColor($args[0]); return $color[1]; } protected static $lib_green = array("color"); protected function lib_green($args) { $color = $this->coerceColor($args[0]); return $color[2]; } protected static $lib_blue = array("color"); protected function lib_blue($args) { $color = $this->coerceColor($args[0]); return $color[3]; } protected static $lib_alpha = array("color"); protected function lib_alpha($args) { if ($color = $this->coerceColor($args[0])) { return isset($color[4]) ? $color[4] : 1; } // this might be the IE function, so return value unchanged return null; } protected static $lib_opacity = array("color"); protected function lib_opacity($args) { $value = $args[0]; if ($value[0] === 'number') return null; return $this->lib_alpha($args); } // mix two colors protected static $lib_mix = array("color-1", "color-2", "weight"); protected function lib_mix($args) { list($first, $second, $weight) = $args; $first = $this->assertColor($first); $second = $this->assertColor($second); if (!isset($weight)) { $weight = 0.5; } else { $weight = $this->coercePercent($weight); } $firstAlpha = isset($first[4]) ? $first[4] : 1; $secondAlpha = isset($second[4]) ? $second[4] : 1; $w = $weight * 2 - 1; $a = $firstAlpha - $secondAlpha; $w1 = (($w * $a == -1 ? $w : ($w + $a)/(1 + $w * $a)) + 1) / 2.0; $w2 = 1.0 - $w1; $new = array('color', $w1 * $first[1] + $w2 * $second[1], $w1 * $first[2] + $w2 * $second[2], $w1 * $first[3] + $w2 * $second[3], ); if ($firstAlpha != 1.0 || $secondAlpha != 1.0) { $new[] = $firstAlpha * $weight + $secondAlpha * ($weight - 1); } return $this->fixColor($new); } protected static $lib_hsl = array("hue", "saturation", "lightness"); protected function lib_hsl($args) { list($h, $s, $l) = $args; return $this->toRGB($h[1], $s[1], $l[1]); } protected static $lib_hsla = array("hue", "saturation", "lightness", "alpha"); protected function lib_hsla($args) { list($h, $s, $l, $a) = $args; $color = $this->toRGB($h[1], $s[1], $l[1]); $color[4] = $a[1]; return $color; } protected static $lib_hue = array("color"); protected function lib_hue($args) { $color = $this->assertColor($args[0]); $hsl = $this->toHSL($color[1], $color[2], $color[3]); return array("number", $hsl[1], "deg"); } protected static $lib_saturation = array("color"); protected function lib_saturation($args) { $color = $this->assertColor($args[0]); $hsl = $this->toHSL($color[1], $color[2], $color[3]); return array("number", $hsl[2], "%"); } protected static $lib_lightness = array("color"); protected function lib_lightness($args) { $color = $this->assertColor($args[0]); $hsl = $this->toHSL($color[1], $color[2], $color[3]); return array("number", $hsl[3], "%"); } protected function adjustHsl($color, $idx, $amount) { $hsl = $this->toHSL($color[1], $color[2], $color[3]); $hsl[$idx] += $amount; $out = $this->toRGB($hsl[1], $hsl[2], $hsl[3]); if (isset($color[4])) $out[4] = $color[4]; return $out; } protected static $lib_adjust_hue = array("color", "degrees"); protected function lib_adjust_hue($args) { $color = $this->assertColor($args[0]); $degrees = $this->assertNumber($args[1]); return $this->adjustHsl($color, 1, $degrees); } protected static $lib_lighten = array("color", "amount"); protected function lib_lighten($args) { $color = $this->assertColor($args[0]); $amount = 100*$this->coercePercent($args[1]); return $this->adjustHsl($color, 3, $amount); } protected static $lib_darken = array("color", "amount"); protected function lib_darken($args) { $color = $this->assertColor($args[0]); $amount = 100*$this->coercePercent($args[1]); return $this->adjustHsl($color, 3, -$amount); } protected static $lib_saturate = array("color", "amount"); protected function lib_saturate($args) { $value = $args[0]; if ($value[0] === 'number') return null; $color = $this->assertColor($value); $amount = 100*$this->coercePercent($args[1]); return $this->adjustHsl($color, 2, $amount); } protected static $lib_desaturate = array("color", "amount"); protected function lib_desaturate($args) { $color = $this->assertColor($args[0]); $amount = 100*$this->coercePercent($args[1]); return $this->adjustHsl($color, 2, -$amount); } protected static $lib_grayscale = array("color"); protected function lib_grayscale($args) { $value = $args[0]; if ($value[0] === 'number') return null; return $this->adjustHsl($this->assertColor($value), 2, -100); } protected static $lib_complement = array("color"); protected function lib_complement($args) { return $this->adjustHsl($this->assertColor($args[0]), 1, 180); } protected static $lib_invert = array("color"); protected function lib_invert($args) { $value = $args[0]; if ($value[0] === 'number') return null; $color = $this->assertColor($value); $color[1] = 255 - $color[1]; $color[2] = 255 - $color[2]; $color[3] = 255 - $color[3]; return $color; } // increases opacity by amount protected static $lib_opacify = array("color", "amount"); protected function lib_opacify($args) { $color = $this->assertColor($args[0]); $amount = $this->coercePercent($args[1]); $color[4] = (isset($color[4]) ? $color[4] : 1) + $amount; $color[4] = min(1, max(0, $color[4])); return $color; } protected static $lib_fade_in = array("color", "amount"); protected function lib_fade_in($args) { return $this->lib_opacify($args); } // decreases opacity by amount protected static $lib_transparentize = array("color", "amount"); protected function lib_transparentize($args) { $color = $this->assertColor($args[0]); $amount = $this->coercePercent($args[1]); $color[4] = (isset($color[4]) ? $color[4] : 1) - $amount; $color[4] = min(1, max(0, $color[4])); return $color; } protected static $lib_fade_out = array("color", "amount"); protected function lib_fade_out($args) { return $this->lib_transparentize($args); } protected static $lib_unquote = array("string"); protected function lib_unquote($args) { $str = $args[0]; if ($str[0] == "string") $str[1] = ""; return $str; } protected static $lib_quote = array("string"); protected function lib_quote($args) { $value = $args[0]; if ($value[0] == "string" && !empty($value[1])) return $value; return array("string", '"', array($value)); } protected static $lib_percentage = array("value"); protected function lib_percentage($args) { return array("number", $this->coercePercent($args[0]) * 100, "%"); } protected static $lib_round = array("value"); protected function lib_round($args) { $num = $args[0]; $num[1] = round($num[1]); return $num; } protected static $lib_floor = array("value"); protected function lib_floor($args) { $num = $args[0]; $num[1] = floor($num[1]); return $num; } protected static $lib_ceil = array("value"); protected function lib_ceil($args) { $num = $args[0]; $num[1] = ceil($num[1]); return $num; } protected static $lib_abs = array("value"); protected function lib_abs($args) { $num = $args[0]; $num[1] = abs($num[1]); return $num; } protected function lib_min($args) { $numbers = $this->getNormalizedNumbers($args); $min = null; foreach ($numbers as $key => $number) { if (null === $min || $number[1] <= $min[1]) { $min = array($key, $number[1]); } } return $args[$min[0]]; } protected function lib_max($args) { $numbers = $this->getNormalizedNumbers($args); $max = null; foreach ($numbers as $key => $number) { if (null === $max || $number[1] >= $max[1]) { $max = array($key, $number[1]); } } return $args[$max[0]]; } protected function getNormalizedNumbers($args) { $unit = null; $originalUnit = null; $numbers = array(); foreach ($args as $key => $item) { if ('number' != $item[0]) { $this->throwError("%s is not a number", $item[0]); } $number = $this->normalizeNumber($item); if (null === $unit) { $unit = $number[2]; $originalUnit = $item[2]; } elseif ($unit !== $number[2]) { $this->throwError('Incompatible units: "%s" and "%s".', $originalUnit, $item[2]); } $numbers[$key] = $number; } return $numbers; } protected static $lib_length = array("list"); protected function lib_length($args) { $list = $this->coerceList($args[0]); return count($list[2]); } protected static $lib_nth = array("list", "n"); protected function lib_nth($args) { $list = $this->coerceList($args[0]); $n = $this->assertNumber($args[1]) - 1; return isset($list[2][$n]) ? $list[2][$n] : self::$defaultValue; } protected function listSeparatorForJoin($list1, $sep) { if (!isset($sep)) return $list1[1]; switch ($this->compileValue($sep)) { case "comma": return ","; case "space": return ""; default: return $list1[1]; } } protected static $lib_join = array("list1", "list2", "separator"); protected function lib_join($args) { list($list1, $list2, $sep) = $args; $list1 = $this->coerceList($list1, " "); $list2 = $this->coerceList($list2, " "); $sep = $this->listSeparatorForJoin($list1, $sep); return array("list", $sep, array_merge($list1[2], $list2[2])); } protected static $lib_append = array("list", "val", "separator"); protected function lib_append($args) { list($list1, $value, $sep) = $args; $list1 = $this->coerceList($list1, " "); $sep = $this->listSeparatorForJoin($list1, $sep); return array("list", $sep, array_merge($list1[2], array($value))); } protected function lib_zip($args) { foreach ($args as $arg) { $this->assertList($arg); } $lists = array(); $firstList = array_shift($args); foreach ($firstList[2] as $key => $item) { $list = array("list", "", array($item)); foreach ($args as $arg) { if (isset($arg[2][$key])) { $list[2][] = $arg[2][$key]; } else { break 2; } } $lists[] = $list; } return array("list", ",", $lists); } protected static $lib_type_of = array("value"); protected function lib_type_of($args) { $value = $args[0]; switch ($value[0]) { case "keyword": if ($value == self::$true || $value == self::$false) { return "bool"; } if ($this->coerceColor($value)) { return "color"; } return "string"; default: return $value[0]; } } protected static $lib_unit = array("number"); protected function lib_unit($args) { $num = $args[0]; if ($num[0] == "number") { return array("string", '"', array($num[2])); } return ""; } protected static $lib_unitless = array("number"); protected function lib_unitless($args) { $value = $args[0]; return $value[0] == "number" && empty($value[2]); } protected static $lib_comparable = array("number-1", "number-2"); protected function lib_comparable($args) { list($number1, $number2) = $args; if (!isset($number1[0]) || $number1[0] != "number" || !isset($number2[0]) || $number2[0] != "number") { $this->throwError('Invalid argument(s) for "comparable"'); } $number1 = $this->normalizeNumber($number1); $number2 = $this->normalizeNumber($number2); return $number1[2] == $number2[2] || $number1[2] == "" || $number2[2] == ""; } /** * Workaround IE7's content counter bug. * * @param array $args */ protected function lib_counter($args) { $list = array_map(array($this, 'compileValue'), $args); return array('string', '', array('counter(' . implode(',', $list) . ')')); } public function throwError($msg = null) { if (func_num_args() > 1) { $msg = call_user_func_array("sprintf", func_get_args()); } if ($this->sourcePos >= 0 && isset($this->sourceParser)) { $this->sourceParser->throwParseError($msg, $this->sourcePos); } throw new Exception($msg); } /** * CSS Colors * * @see http://www.w3.org/TR/css3-color */ static protected $cssColors = array( 'aliceblue' => '240,248,255', 'antiquewhite' => '250,235,215', 'aqua' => '0,255,255', 'aquamarine' => '127,255,212', 'azure' => '240,255,255', 'beige' => '245,245,220', 'bisque' => '255,228,196', 'black' => '0,0,0', 'blanchedalmond' => '255,235,205', 'blue' => '0,0,255', 'blueviolet' => '138,43,226', 'brown' => '165,42,42', 'burlywood' => '222,184,135', 'cadetblue' => '95,158,160', 'chartreuse' => '127,255,0', 'chocolate' => '210,105,30', 'coral' => '255,127,80', 'cornflowerblue' => '100,149,237', 'cornsilk' => '255,248,220', 'crimson' => '220,20,60', 'cyan' => '0,255,255', 'darkblue' => '0,0,139', 'darkcyan' => '0,139,139', 'darkgoldenrod' => '184,134,11', 'darkgray' => '169,169,169', 'darkgreen' => '0,100,0', 'darkgrey' => '169,169,169', 'darkkhaki' => '189,183,107', 'darkmagenta' => '139,0,139', 'darkolivegreen' => '85,107,47', 'darkorange' => '255,140,0', 'darkorchid' => '153,50,204', 'darkred' => '139,0,0', 'darksalmon' => '233,150,122', 'darkseagreen' => '143,188,143', 'darkslateblue' => '72,61,139', 'darkslategray' => '47,79,79', 'darkslategrey' => '47,79,79', 'darkturquoise' => '0,206,209', 'darkviolet' => '148,0,211', 'deeppink' => '255,20,147', 'deepskyblue' => '0,191,255', 'dimgray' => '105,105,105', 'dimgrey' => '105,105,105', 'dodgerblue' => '30,144,255', 'firebrick' => '178,34,34', 'floralwhite' => '255,250,240', 'forestgreen' => '34,139,34', 'fuchsia' => '255,0,255', 'gainsboro' => '220,220,220', 'ghostwhite' => '248,248,255', 'gold' => '255,215,0', 'goldenrod' => '218,165,32', 'gray' => '128,128,128', 'green' => '0,128,0', 'greenyellow' => '173,255,47', 'grey' => '128,128,128', 'honeydew' => '240,255,240', 'hotpink' => '255,105,180', 'indianred' => '205,92,92', 'indigo' => '75,0,130', 'ivory' => '255,255,240', 'khaki' => '240,230,140', 'lavender' => '230,230,250', 'lavenderblush' => '255,240,245', 'lawngreen' => '124,252,0', 'lemonchiffon' => '255,250,205', 'lightblue' => '173,216,230', 'lightcoral' => '240,128,128', 'lightcyan' => '224,255,255', 'lightgoldenrodyellow' => '250,250,210', 'lightgray' => '211,211,211', 'lightgreen' => '144,238,144', 'lightgrey' => '211,211,211', 'lightpink' => '255,182,193', 'lightsalmon' => '255,160,122', 'lightseagreen' => '32,178,170', 'lightskyblue' => '135,206,250', 'lightslategray' => '119,136,153', 'lightslategrey' => '119,136,153', 'lightsteelblue' => '176,196,222', 'lightyellow' => '255,255,224', 'lime' => '0,255,0', 'limegreen' => '50,205,50', 'linen' => '250,240,230', 'magenta' => '255,0,255', 'maroon' => '128,0,0', 'mediumaquamarine' => '102,205,170', 'mediumblue' => '0,0,205', 'mediumorchid' => '186,85,211', 'mediumpurple' => '147,112,219', 'mediumseagreen' => '60,179,113', 'mediumslateblue' => '123,104,238', 'mediumspringgreen' => '0,250,154', 'mediumturquoise' => '72,209,204', 'mediumvioletred' => '199,21,133', 'midnightblue' => '25,25,112', 'mintcream' => '245,255,250', 'mistyrose' => '255,228,225', 'moccasin' => '255,228,181', 'navajowhite' => '255,222,173', 'navy' => '0,0,128', 'oldlace' => '253,245,230', 'olive' => '128,128,0', 'olivedrab' => '107,142,35', 'orange' => '255,165,0', 'orangered' => '255,69,0', 'orchid' => '218,112,214', 'palegoldenrod' => '238,232,170', 'palegreen' => '152,251,152', 'paleturquoise' => '175,238,238', 'palevioletred' => '219,112,147', 'papayawhip' => '255,239,213', 'peachpuff' => '255,218,185', 'peru' => '205,133,63', 'pink' => '255,192,203', 'plum' => '221,160,221', 'powderblue' => '176,224,230', 'purple' => '128,0,128', 'red' => '255,0,0', 'rosybrown' => '188,143,143', 'royalblue' => '65,105,225', 'saddlebrown' => '139,69,19', 'salmon' => '250,128,114', 'sandybrown' => '244,164,96', 'seagreen' => '46,139,87', 'seashell' => '255,245,238', 'sienna' => '160,82,45', 'silver' => '192,192,192', 'skyblue' => '135,206,235', 'slateblue' => '106,90,205', 'slategray' => '112,128,144', 'slategrey' => '112,128,144', 'snow' => '255,250,250', 'springgreen' => '0,255,127', 'steelblue' => '70,130,180', 'tan' => '210,180,140', 'teal' => '0,128,128', 'thistle' => '216,191,216', 'tomato' => '255,99,71', 'transparent' => '0,0,0,0', 'turquoise' => '64,224,208', 'violet' => '238,130,238', 'wheat' => '245,222,179', 'white' => '255,255,255', 'whitesmoke' => '245,245,245', 'yellow' => '255,255,0', 'yellowgreen' => '154,205,50' ); } /** * SCSS parser * * @author Leaf Corcoran */ class scss_parser { static protected $precedence = array( "or" => 0, "and" => 1, '==' => 2, '!=' => 2, '<=' => 2, '>=' => 2, '=' => 2, '<' => 3, '>' => 2, '+' => 3, '-' => 3, '*' => 4, '/' => 4, '%' => 4, ); static protected $operators = array("+", "-", "*", "/", "%", "==", "!=", "<=", ">=", "<", ">", "and", "or"); static protected $operatorStr; static protected $whitePattern; static protected $commentMulti; static protected $commentSingle = "//"; static protected $commentMultiLeft = "/*"; static protected $commentMultiRight = "*/"; /** * Constructor * * @param string $sourceName * @param boolean $rootParser */ public function __construct($sourceName = null, $rootParser = true) { $this->sourceName = $sourceName; $this->rootParser = $rootParser; if (empty(self::$operatorStr)) { self::$operatorStr = $this->makeOperatorStr(self::$operators); $commentSingle = $this->preg_quote(self::$commentSingle); $commentMultiLeft = $this->preg_quote(self::$commentMultiLeft); $commentMultiRight = $this->preg_quote(self::$commentMultiRight); self::$commentMulti = $commentMultiLeft.'.*?'.$commentMultiRight; self::$whitePattern = '/'.$commentSingle.'[^\n]*\s*|('.self::$commentMulti.')\s*|\s+/Ais'; } } static protected function makeOperatorStr($operators) { return '('.implode('|', array_map(array('scss_parser','preg_quote'), $operators)).')'; } /** * Parser buffer * * @param string $buffer; * * @return \StdClass */ public function parse($buffer) { $this->count = 0; $this->env = null; $this->inParens = false; $this->eatWhiteDefault = true; $this->insertComments = true; $this->buffer = $buffer; $this->pushBlock(null); // root block $this->whitespace(); while (false !== $this->parseChunk()) ; if ($this->count != strlen($this->buffer)) { $this->throwParseError(); } if (!empty($this->env->parent)) { $this->throwParseError("unclosed block"); } $this->env->isRoot = true; return $this->env; } /** * Parse a single chunk off the head of the buffer and append it to the * current parse environment. * * Returns false when the buffer is empty, or when there is an error. * * This function is called repeatedly until the entire document is * parsed. * * This parser is most similar to a recursive descent parser. Single * functions represent discrete grammatical rules for the language, and * they are able to capture the text that represents those rules. * * Consider the function scssc::keyword(). (All parse functions are * structured the same.) * * The function takes a single reference argument. When calling the * function it will attempt to match a keyword on the head of the buffer. * If it is successful, it will place the keyword in the referenced * argument, advance the position in the buffer, and return true. If it * fails then it won't advance the buffer and it will return false. * * All of these parse functions are powered by scssc::match(), which behaves * the same way, but takes a literal regular expression. Sometimes it is * more convenient to use match instead of creating a new function. * * Because of the format of the functions, to parse an entire string of * grammatical rules, you can chain them together using &&. * * But, if some of the rules in the chain succeed before one fails, then * the buffer position will be left at an invalid state. In order to * avoid this, scssc::seek() is used to remember and set buffer positions. * * Before parsing a chain, use $s = $this->seek() to remember the current * position into $s. Then if a chain fails, use $this->seek($s) to * go back where we started. * * @return boolean */ protected function parseChunk() { $s = $this->seek(); // the directives if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] == "@") { if ($this->literal("@media") && $this->mediaQueryList($mediaQueryList) && $this->literal("{")) { $media = $this->pushSpecialBlock("media"); $media->queryList = $mediaQueryList[2]; return true; } else { $this->seek($s); } if ($this->literal("@mixin") && $this->keyword($mixinName) && ($this->argumentDef($args) || true) && $this->literal("{")) { $mixin = $this->pushSpecialBlock("mixin"); $mixin->name = $mixinName; $mixin->args = $args; return true; } else { $this->seek($s); } if ($this->literal("@include") && $this->keyword($mixinName) && ($this->literal("(") && ($this->argValues($argValues) || true) && $this->literal(")") || true) && ($this->end() || $this->literal("{") && $hasBlock = true)) { $child = array("include", $mixinName, isset($argValues) ? $argValues : null, null); if (!empty($hasBlock)) { $include = $this->pushSpecialBlock("include"); $include->child = $child; } else { $this->append($child, $s); } return true; } else { $this->seek($s); } if ($this->literal("@import") && $this->valueList($importPath) && $this->end()) { $this->append(array("import", $importPath), $s); return true; } else { $this->seek($s); } if ($this->literal("@extend") && $this->selectors($selector) && $this->end()) { $this->append(array("extend", $selector), $s); return true; } else { $this->seek($s); } if ($this->literal("@function") && $this->keyword($fnName) && $this->argumentDef($args) && $this->literal("{")) { $func = $this->pushSpecialBlock("function"); $func->name = $fnName; $func->args = $args; return true; } else { $this->seek($s); } if ($this->literal("@return") && $this->valueList($retVal) && $this->end()) { $this->append(array("return", $retVal), $s); return true; } else { $this->seek($s); } if ($this->literal("@each") && $this->variable($varName) && $this->literal("in") && $this->valueList($list) && $this->literal("{")) { $each = $this->pushSpecialBlock("each"); $each->var = $varName[1]; $each->list = $list; return true; } else { $this->seek($s); } if ($this->literal("@while") && $this->expression($cond) && $this->literal("{")) { $while = $this->pushSpecialBlock("while"); $while->cond = $cond; return true; } else { $this->seek($s); } if ($this->literal("@for") && $this->variable($varName) && $this->literal("from") && $this->expression($start) && ($this->literal("through") || ($forUntil = true && $this->literal("to"))) && $this->expression($end) && $this->literal("{")) { $for = $this->pushSpecialBlock("for"); $for->var = $varName[1]; $for->start = $start; $for->end = $end; $for->until = isset($forUntil); return true; } else { $this->seek($s); } if ($this->literal("@if") && $this->valueList($cond) && $this->literal("{")) { $if = $this->pushSpecialBlock("if"); $if->cond = $cond; $if->cases = array(); return true; } else { $this->seek($s); } if (($this->literal("@debug") || $this->literal("@warn")) && $this->valueList($value) && $this->end()) { $this->append(array("debug", $value, $s), $s); return true; } else { $this->seek($s); } if ($this->literal("@content") && $this->end()) { $this->append(array("mixin_content"), $s); return true; } else { $this->seek($s); } $last = $this->last(); if (isset($last) && $last[0] == "if") { list(, $if) = $last; if ($this->literal("@else")) { if ($this->literal("{")) { $else = $this->pushSpecialBlock("else"); } elseif ($this->literal("if") && $this->valueList($cond) && $this->literal("{")) { $else = $this->pushSpecialBlock("elseif"); $else->cond = $cond; } if (isset($else)) { $else->dontAppend = true; $if->cases[] = $else; return true; } } $this->seek($s); } if ($this->literal("@charset") && $this->valueList($charset) && $this->end()) { $this->append(array("charset", $charset), $s); return true; } else { $this->seek($s); } // doesn't match built in directive, do generic one if ($this->literal("@", false) && $this->keyword($dirName) && ($this->openString("{", $dirValue) || true) && $this->literal("{")) { $directive = $this->pushSpecialBlock("directive"); $directive->name = $dirName; if (isset($dirValue)) $directive->value = $dirValue; return true; } $this->seek($s); return false; } // property shortcut // captures most properties before having to parse a selector if ($this->keyword($name, false) && $this->literal(": ") && $this->valueList($value) && $this->end()) { $name = array("string", "", array($name)); $this->append(array("assign", $name, $value), $s); return true; } else { $this->seek($s); } // variable assigns if ($this->variable($name) && $this->literal(":") && $this->valueList($value) && $this->end()) { // check for !default $defaultVar = $value[0] == "list" && $this->stripDefault($value); $this->append(array("assign", $name, $value, $defaultVar), $s); return true; } else { $this->seek($s); } // misc if ($this->literal("-->")) { return true; } // opening css block $oldComments = $this->insertComments; $this->insertComments = false; if ($this->selectors($selectors) && $this->literal("{")) { $this->pushBlock($selectors); $this->insertComments = $oldComments; return true; } else { $this->seek($s); } $this->insertComments = $oldComments; // property assign, or nested assign if ($this->propertyName($name) && $this->literal(":")) { $foundSomething = false; if ($this->valueList($value)) { $this->append(array("assign", $name, $value), $s); $foundSomething = true; } if ($this->literal("{")) { $propBlock = $this->pushSpecialBlock("nestedprop"); $propBlock->prefix = $name; $foundSomething = true; } elseif ($foundSomething) { $foundSomething = $this->end(); } if ($foundSomething) { return true; } $this->seek($s); } else { $this->seek($s); } // closing a block if ($this->literal("}")) { $block = $this->popBlock(); if (isset($block->type) && $block->type == "include") { $include = $block->child; unset($block->child); $include[3] = $block; $this->append($include, $s); } elseif (empty($block->dontAppend)) { $type = isset($block->type) ? $block->type : "block"; $this->append(array($type, $block), $s); } return true; } // extra stuff if ($this->literal(";") || $this->literal("" . PHP_EOL; do_action( 'premiumseo_head' ); echo "" . PHP_EOL.PHP_EOL; if ( !empty($__wp_query) ) { $GLOBALS['wp_query'] = $__wp_query; unset( $__wp_query ); } return true; } public function make_footer() { global $wp_query; if ( !has_action('premiumseo_footer') ) return true; $__wp_query = null; if ( !$wp_query->is_main_query() ) { $__wp_query = $wp_query; wp_reset_query(); } echo PHP_EOL . "" . PHP_EOL; do_action( 'premiumseo_footer' ); echo "" . PHP_EOL.PHP_EOL; if ( !empty($__wp_query) ) { $GLOBALS['wp_query'] = $__wp_query; unset( $__wp_query ); } return true; } public function do_virtual_robots() { if ( !$this->the_plugin->verify_module_status( 'sitemap' ) ) //module is inactive return false; $sitemapUrl = home_url('/sitemap-index.xml'); $sitemapUrl_images = home_url('/sitemap-images.xml'); $sitemapUrl_videos = home_url('/sitemap-videos.xml'); $option = $this->the_plugin->get_theoption('psp_sitemap'); if ( $option === false || !isset($option['notify_virtual_robots']) ) return false; if ( $option['notify_virtual_robots'] == 'yes' ) { echo PHP_EOL . "sitemap: " . $sitemapUrl; echo PHP_EOL . "sitemap: " . $sitemapUrl_images; echo PHP_EOL . "sitemap: " . $sitemapUrl_videos . PHP_EOL; } return false; } /** * Singleton pattern * * @return pspSEOImages Singleton instance */ static public function getInstance() { if (!self::$_instance) { self::$_instance = new self; } return self::$_instance; } } } // Initialize the pspSEOImages class //$pspFrontend = new pspFrontend(); $pspFrontend = pspFrontend::getInstance();@ޗ7 smartSEO/modules/index.html ob*Y 22@G;smartSEO/modules/modules_manager/aaModulesManager.class.php obthe_plugin = $psp; $this->module_folder = $this->the_plugin->cfg['paths']['plugin_dir_url'] . 'modules/modules_manager/'; $this->module = $this->the_plugin->cfg['modules']['modules_manager']; $this->settings = $this->the_plugin->getAllSettings( 'array', 'modules_manager' ); $this->cfg = $this->the_plugin->cfg; } public function printListInterface() { $html = array(); $html[] = '
    ' . __('Loading', 'psp') . '
    '; $html[] = ''; $html[] = '
    '; $cc = 0; $icon = array( 'Backlink_Builder' => '', 'capabilities' => '', 'Google_Analytics' => '', 'Link_Builder' => '', 'Link_Redirect' => '', 'Minify' => '', 'Social_Stats' => '', 'W3C_HTMLValidator' => '', 'facebook_planner' => '', 'file_edit' => '', 'frontend' => ' ', 'google_authorship' => '', 'google_pagespeed' => '', 'local_seo' => '', 'misc' => '', 'modules_manager' => '', 'monitor_404' => '', 'on_page_optimization' => '', 'remote_support' => '', 'rich_snippets' => '', 'seo_friendly_images' => '', 'serp' => '', 'server_status' => '', 'setup_backup' => '', 'sitemap' => '', 'tiny_compress' => '', 'title_meta_format' => '', 'dashboard' => '', 'cronjobs' => '', ); foreach ($this->cfg['modules'] as $key => $value) { $module = $key; // Icon if ( !in_array($module, $this->cfg['core-modules']) && !$this->the_plugin->capabilities_user_has_module($module) ) { continue 1; } $html[] = '
    '; $html[] = $icon[$key] != "" ? '
    ' . $icon[$key] . '
    ' : ''; $html[] = '
    ' . $value[$key]['menu']['title'] . '
    '; // activate / deactivate plugin button if ($value['status'] == true) { if (!in_array($key, $this->cfg['core-modules'])) { $html[] = 'Deactivate'; } else { $html[] = "" . __("Core Modules, can't be deactivated!", 'psp') . ""; } } else { $html[] = '' . __('Activate', 'psp') . ''; } $html[] = '' . ( __('read more', 'psp') ) . ''; $html[] = '
    ' . (isset($value[$key]['description']) ? $value[$key]['description'] : '') . '
    '; $html[] = '
    '; $cc++; } $html[] = '
    '; $html[] = '
    '; return implode("\n", $html); } } }v|K iX-smartSEO/modules/modules_manager/app.class.js ob/* Document : Modules Manager Author : Andrei Dinca, AA-Team http://codecanyon.net/user/AA-Team */ // Initialization and events code for the app pspModulesManager = (function ($) { "use strict"; // public var debug_level = 0; var maincontainer = null; var lightbox = null; // init function, autoload (function init() { // load the triggers $(document).ready(function(){ maincontainer = $(".psp-main"); lightbox = $("#psp-lightbox-overlay"); triggers(); }); })(); function triggers() { maincontainer.on('click', '.psp_read_more', function(e) { e.preventDefault(); $('.psp_module_description').hide(); $(this).parent().find('.psp_module_description').fadeIn(); }); maincontainer.on('click', '.psp_close_description', function(e) { $(this).parent().hide(); }); } // external usage return { } })(jQuery); N .smartSEO/modules/modules_manager/assets/32.png obPNG  IHDR szz pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-C#iTXtXML:com.adobe.xmp Adobe Photoshop CC (Windows) 2013-11-07T12:45:20+02:00 2013-11-07T14:43:28+02:00 2013-11-07T14:43:28+02:00 image/png xmp.iid:924a6c88-8cd0-2e41-a794-72d3c47c5d29 xmp.did:4e55d131-4156-ef47-9231-b3ac27fa2863 xmp.did:4e55d131-4156-ef47-9231-b3ac27fa2863 created xmp.iid:4e55d131-4156-ef47-9231-b3ac27fa2863 2013-11-07T12:45:20+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:734d31d5-f4da-3c42-a366-328b958e3011 2013-11-07T12:59:05+02:00 Adobe Photoshop CC (Windows) / saved xmp.iid:fe1ae06e-d5e9-4245-a025-0cbc271226f6 2013-11-07T14:43:28+02:00 Adobe Photoshop CC (Windows) / converted from application/vnd.adobe.photoshop to image/png derived converted from application/vnd.adobe.photoshop to image/png saved xmp.iid:924a6c88-8cd0-2e41-a794-72d3c47c5d29 2013-11-07T14:43:28+02:00 Adobe Photoshop CC (Windows) / xmp.iid:fe1ae06e-d5e9-4245-a025-0cbc271226f6 xmp.did:4e55d131-4156-ef47-9231-b3ac27fa2863 xmp.did:4e55d131-4156-ef47-9231-b3ac27fa2863 404 404 xmp.did:57BCD4A3F738E3119802BE982B1502BD 3 sRGB IEC61966-2.1 1 720000/10000 720000/10000 2 1 32 32 4aU cHRMz%u0`:o_F1IDATxKhQ;mE$EE\Zt/H m.*7>vVtFąE vB*5nNdI#9099eA)E H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-CpiTXtXML:com.adobe.xmp Adobe Photoshop CC (Windows) 2013-11-07T11:20:16+02:00 2013-11-07T14:37:51+02:00 2013-11-07T14:37:51+02:00 image/png xmp.iid:1709f568-9e85-dc41-be6d-942d749927c5 xmp.did:2f5e891f-9592-504b-9468-f61145101583 xmp.did:2f5e891f-9592-504b-9468-f61145101583 created xmp.iid:2f5e891f-9592-504b-9468-f61145101583 2013-11-07T11:20:16+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:6c17ff4b-8fe6-644e-86e4-32b95baaf4ec 2013-11-07T12:45:49+02:00 Adobe Photoshop CC (Windows) / saved xmp.iid:05f864b3-fce6-be4b-bff7-ceb4d6aecf96 2013-11-07T14:37:51+02:00 Adobe Photoshop CC (Windows) / converted from application/vnd.adobe.photoshop to image/png derived converted from application/vnd.adobe.photoshop to image/png saved xmp.iid:1709f568-9e85-dc41-be6d-942d749927c5 2013-11-07T14:37:51+02:00 Adobe Photoshop CC (Windows) / xmp.iid:05f864b3-fce6-be4b-bff7-ceb4d6aecf96 xmp.did:2f5e891f-9592-504b-9468-f61145101583 xmp.did:2f5e891f-9592-504b-9468-f61145101583 404 404 xmp.did:4e55d131-4156-ef47-9231-b3ac27fa2863 xmp.did:57BCD4A3F738E3119802BE982B1502BD 3 sRGB IEC61966-2.1 1 720000/10000 720000/10000 2 1 16 16 D cHRMz%u0`:o_FCIDATxӱKA1`-̺8TIiOj!ER,.d!kFLfNN#b7|ofyEEyS @A3i-m+MS_}9IENDB`(Y |A#h~{1r%C#;ALDKsiKOp d~k =0@qFdG3< m{ȱX37Zm,|TLk݊X=Kλ}zԍ.삀u! +2(VAj;u# I7VALB[6Nάru8}Z{'xD 9|̬< <O<I!=6޺۔Cs]avp=Z_ОP5SƇPb7|JQ jr13>Y7na HdD? qIENDB`:wCI z+smartSEO/modules/modules_manager/config.php ob array( 'version' => '1.0', 'menu' => array( 'order' => 30, 'title' => __('Modules Manager', 'psp') ,'icon' => '' ), 'description' => __("Using this module you can activate / deactivate plugin modules.", 'psp'), 'help' => array( 'type' => 'remote', 'url' => 'http://docs.aa-team.com/premium-seo-pack/documentation/modules-manager-2/' ), 'load_in' => array( 'backend' => array( 'admin-ajax.php' ), 'frontend' => false ), 'javascript' => array( 'admin', 'hashchange', 'tipsy' ), 'css' => array( 'admin' ) ) ) );KG +smartSEO/modules/modules_manager/index.html obpvH :U*smartSEO/modules/modules_manager/lists.php obcfg, $module); $aaModulesManger = aaModulesManger::getInstance(); // print the lists interface echo $aaModulesManger->printListInterface(); }vJ ݥH,smartSEO/modules/modules_manager/options.php ob array( /* define the form_messages box */ 'module_box' => array( 'title' => __('Modules Manager', 'psp'), 'icon' => '{plugin_folder_uri}assets/menu_icon.png', 'size' => 'grid_4', // grid_1|grid_2|grid_3|grid_4 'header' => true, // true|false 'toggler' => false, // true|false 'buttons' => false, // true|false 'style' => 'panel', // panel|panel-widget // create the box elements array 'elements' => array( array( 'type' => 'app', 'path' => '{plugin_folder_path}lists.php', ) ) ) ) ) ); 0R ƼƼ9L2smartSEO/modules/on_page_optimization/app.class.js ob/* Document : On Page Optimization Author : Andrei Dinca, AA-Team http://codecanyon.net/user/AA-Team */ // Initialization and events code for the app pspOnPageOptimization = (function ($) { "use strict"; var debug_level = 0; var maincontainer = null; var loading = null; var IDs = []; var loaded_page = 0; var selected_element = []; // metabox wrappers var metabox = { main_id : '', main : null, preload : null, box : null, boxmenu : null, boxcontent : null, post_id : 0, lang : {}, settings : {} }; // init function, autoload (function init() { // load the triggers $(document).ready(function(){ // mass optimization page maincontainer = $(".psp-main"); loading = maincontainer.find("#main-loading"); // metabox metabox_init(); triggers(); }); })(); function triggers() { //---- :: start Mass Optimization page triggers // init google suggest /*$('input.psp-text-field-kw').googleSuggest({ service: 'web' });*/ // :: Multi Keywords - enter multi_keywords.load({}); // SEO Report & Optimize maincontainer.on('click', 'a.psp-seo-report-btn', function(e){ e.preventDefault(); var that = $(this), row = that.parents("tr").eq(0), //field = row.find('input.psp-text-field-kw'), //focus_kw = field.val(), itemID = that.data('itemid'); var __mkw = multi_keywords.get_tokens({ 'el' : 'input.psp-text-field-kw#psp-focus-kw-'+itemID, 'restype' : 'list', }); var focus_kw = __mkw; row_loading(row, 'show'); getSeoReport( row, itemID, focus_kw ); }); maincontainer.on('click', 'input.psp-do_item_optimize', function(e){ e.preventDefault(); optimizePage( $(this) ); }); maincontainer.on('click', '#psp-all-optimize', function(e){ e.preventDefault(); massOptimize( $(this) ); }); // autodetect - single maincontainer.on('click', 'input.psp-auto-detect-kw-btn', function(e){ e.preventDefault(); var that = $(this), row = that.parents("tr").eq(0), itemID = row.data('itemid'); //field = row.find('input.psp-text-field-kw'), //title = row.find('input#psp-item-title-' + itemID); /* edit post inline */ row_actions.itemid = itemID; row_actions.itemPrev = row_actions.itemCurrent; row_actions.itemCurrent = itemID; row_actions.autoFocus( row, itemID ); /*row_loading(row, 'show'); if( $.trim(field.val()) == "" ){ if( $.trim(title.val()) == "" ){ row_loading(row, 'hide'); alert('Your post don\' have any title.'); return false; } field.val( title.val() ); row_loading(row, 'hide'); } else{ row_loading(row, 'hide'); }*/ }); // autodetect - all maincontainer.on('click', '#psp-all-auto-detect-kw', function(){ var that = $(this); var rowLast = null; $('#psp-list-table-posts input.psp-item-checkbox:checked').each(function(){ var that2 = $(this), row = that2.parents("tr").eq(0), itemID = row.data('itemid'); //field = row.find('input.psp-text-field-kw'), //title = row.find('input#psp-item-title-' + itemID); /* edit post inline */ row_actions.itemid = itemID; row_actions.itemPrev = row_actions.itemCurrent; row_actions.itemCurrent = itemID; row_actions.autoFocus( row, itemID ); rowLast = row; /*row_loading(row, 'show'); if( $.trim(field.val()) == "" ){ if( $.trim(title.val()) == "" ){ row_loading(row, 'hide'); alert('Your post don\' have any title.'); return false; } field.val( title.val() ); row_loading(row, 'hide'); } else{ row_loading(row, 'hide'); }*/ }); //special case: close last box var $box = rowLast.parent().find('#psp-inline-edit-post-'+row_actions.itemCurrent); row_actions.closeBox( $box, rowLast ); }); row_actions.init(); //---- :: end Mass Optimization page triggers //---- :: start Products Listing page triggers // build score progress bar load_progress_bar( $('body') ); //---- :: end Products Listing page triggers //---- :: start Product Edit page triggers // add to wp publish box add_to_wp_publish_box(); // publish / update post - submit form (function() { var __form_submit = false; function _do_submit(e, that) { //console.log( that, __form_submit ); if ( __form_submit ) { __form_submit = false; return true; } //NOT WORKING - solution was with "return false" at the function's end //e.preventDefault(); e.stopPropagation(); var __mkw = multi_keywords.get_tokens({ 'el' : '#psp-field-multifocuskw', 'restype' : 'list', }); var focus_kw = __mkw; $('#psp-field-multifocuskw').remove(); that.prepend( $('') .attr({ 'id' : '#psp-field-multifocuskw', 'name' : 'psp-field-multifocuskw' }) .css({ 'display' : 'none' }) .val( focus_kw ) ); $('#publish, #submit').removeAttr("disabled"); //#publish : on edit posts ; #submit: on edit categories,tags __form_submit = true; that.submit(); return false; } // triggers $('body').on('submit', 'form#edittag', function(e) { _do_submit( e, $(this) ); }); /*$('body').on('click', 'form#edittag #submit', function(e) { _do_submit( e, $(this).closest('form') ); });*/ $('body').on('submit', 'form#post', function(e) { _do_submit( e, $(this) ); }); })(); //---- :: end Product Edit page triggers } function add_to_wp_publish_box() { var publishInfo = $('.psp-info-column-wrapper'); //console.log( publishInfo ); return false; if ( $("#misc-publishing-actions").length ) { publishInfo.appendTo("#misc-publishing-actions").show(); } } /** * Meta Box */ function metabox_init() { metabox.main_id = '#psp_onpage_optimize_meta_box'; metabox.main = $(metabox.main_id); if ( metabox.main.length ) { metabox.preload = metabox.main.find("#psp-meta-box-preload:first"); metabox.box = metabox.main.find(".psp-meta-box-container:first"); } if ( metabox.box && metabox.box.length ) { metabox.boxmenu = metabox.box.find(".psp-tab-menu:first"); metabox.boxcontent = metabox.box.find(".psp-tab-container:first"); } //console.log( metabox ); if ( metabox.box && metabox.box.length ) { var lang = {}, settings = {}; // language messages lang = metabox.main.find('#psp-meta-boxlang-translation').html(); //lang = JSON.stringify(lang); lang = typeof lang != 'undefined' ? JSON && JSON.parse(lang) || $.parseJSON(lang) : lang; // settings settings = metabox.main.find('#psp-meta-box-settings').html(); //settings = JSON.stringify(settings); settings = typeof settings != 'undefined' ? JSON && JSON.parse(settings) || $.parseJSON(settings) : settings; metabox.lang = lang; metabox.settings = settings; metabox.post_id = metabox.box.data('post_id'); //console.log( metabox ); metabox_triggers(); metabox_load(); } } function metabox_triggers() { metabox.main.on('click', '.psp-tab-menu a', function(e){ e.preventDefault(); var that = $(this), open = metabox.boxmenu.find("a.open"), href = that.attr('href').replace('#', ''); metabox.box.hide(); metabox.boxcontent.find("#psp-tab-div-id-" + href ).show(); // close current opened tab var rel_open = open.attr('href').replace('#', ''); metabox.boxcontent.find("#psp-tab-div-id-" + rel_open ).hide(); metabox.preload.show(); metabox.preload.hide(); metabox.box.fadeIn('fast'); open.removeClass('open'); that.addClass('open'); }); $("body").on('click', '#psp-tab-div-id-dashboard #psp-edit-focus-keywords', function(e){ e.preventDefault(); metabox.main.find(".psp-tab-menu a[href='#page_meta']").click(); //$("#psp-field-focuskw").focus(); setTimeout(function() { $("#psp-field-multifocuskw").parent().find("input.token-input").focus(); }, 50); }); $("body").on('click', '#psp-tab-div-id-dashboard #psp-btn-metabox-autofocus2', function(e){ e.preventDefault(); metabox.main.find(".psp-tab-menu a[href='#page_meta']").click(); metaboxAutofocus(); }); $("body").on('click', '#psp-tab-div-id-page_meta #psp-btn-metabox-autofocus', function(e){ e.preventDefault(); metaboxAutofocus(); }); // twitter cards twitter_cards.init(); } function metabox_load() { var data = { action : 'psp_metabox_seosettings', sub_action : 'load_box', post_id : metabox.post_id, istax : metabox.settings.istax, taxonomy : metabox.settings.taxonomy, term_id : metabox.settings.term_id }; //loading( 'show' ); $.post(ajaxurl, data, function(response) { if ( misc.hasOwnProperty(response, 'status') ) { metabox.boxcontent.html( response.html ); } // fixit var meta_box = metabox.box.find(".psp-dashboard-box-content.psp-seo-status-container"), meta_box_width = metabox.box.width() - 100, row = meta_box.find(".psp-seo-rule-row"); row.width(meta_box_width - 40); row.find(".right-col").width( meta_box_width - 180 ); row.find(".message-box").width(meta_box_width - 45); row.find(".right-col .message-box").width( meta_box_width - 180 ); $(".psp-dashboard-box").each(function(){ var that = $(this), rel = that.attr('rel'); if( rel != "" ){ var rel_elm = $("#" + rel); if( rel_elm.size() > 0 ){ var elmHeight = that.height(); var relHeight = rel_elm.height(); if( elmHeight > relHeight ){ rel_elm.height( elmHeight ); }else if ( relHeight > elmHeight ) { that.height( relHeight ); } } } }); //loading( 'close' ); metabox.preload.hide(); metabox.box.fadeIn('fast'); snippetPreview(); setInterval(function(){ snippetPreview(); }, 2000); charsLeft(); // build score progress bar load_progress_bar( metabox.main ); // init google suggest //$('input#psp-field-focuskw').googleSuggest({ // service: 'web' //}); /* Multi Keywords - sub tabs */ pspFreamwork.multikw_tabs_load( metabox.main.find('.psp-multikw') ); // :: Multi Keywords - enter multi_keywords.load({ 'el' : '#psp-field-multifocuskw', 'show_load' : false }); //metabox.main.find('.psp-tab-menu a').eq(1).trigger('click'); //DEBUG }, 'json') .fail(function() {}) .done(function() {}) .always(function() {}); } function snippetPreview() { //var focus_kw = $("#psp-field-focuskw").val(); var title = $("#psp-field-title").val(), title_fb = $("#psp-field-facebook-titlu").val(), desc = $("#psp-field-metadesc").val(), link = $("#sample-permalink").text(), prev_box = $(".psp-prev-box"), post_title = title; var $title = $("input[name='post_title']"), $titleTax = $(".form-table").find("input[name='name']"); if ( $title.length > 0 ) post_title = $title.val(); else if ( $titleTax.length >0 ) post_title = $titleTax.val(); if( $.trim(post_title) == 'Auto Draft' ){ post_title = ''; } /*if ( $.trim( focus_kw ) == '' ) $("#psp-field-focuskw").val( post_title ); if ( $.trim( title ) == '' ) $("#psp-field-title").val( post_title ); if ( $.trim( title_fb ) == '' ) $("#psp-field-facebook-titlu").val( post_title );*/ //prev_box.find(".psp-prev-focuskw").text( $("#psp-field-focuskw").val() ); prev_box.find(".psp-prev-title").text( $("#psp-field-title").val() ); prev_box.find(".psp-prev-desc").text( desc ); prev_box.find(".psp-prev-url").text( link ); $("#psp-field-title").pspLimitChars( $("#psp-field-title-length") ); } function metaboxAutofocus() { var $box = metabox.box.find('.psp-tab-container'), $boxData = metabox.box.find('#psp-inline-row-data'); var __mkw = []; var postData = {}; postData.title = $boxData.find('.psp-post-title').text(); postData.gen_desc = $boxData.find('.psp-post-gen-desc').text(); postData.gen_kw = $boxData.find('.psp-post-gen-keywords').text(); postData.meta_title = $boxData.find('.psp-post-meta-title').text(); postData.meta_desc = $boxData.find('.psp-post-meta-description').text(); postData.meta_kw = $boxData.find('.psp-post-meta-keywords').text(); postData.focus_kw = $boxData.find('.psp-post-meta-focus-kw').text(); //if ( $.trim( $box.find('input[name="psp-field-focuskw"]').val() ) == '' ) { // $box.find('input[name="psp-field-focuskw"]').val( postData.title ); //} // :: Multi Keywords - enter __mkw = multi_keywords.get_tokens({ 'el' : '#psp-field-multifocuskw', 'restype' : 'array', }); if ( $.isEmptyObject(__mkw) ) { multi_keywords.add_token({ 'el' : '#psp-field-multifocuskw', 'token' : postData.title }); } if ( $.trim( $box.find('input[name="psp-field-title"]').val() ) == '' ) { $box.find('input[name="psp-field-title"]').val( postData.title ); } if ( $.trim( $box.find('textarea[name="psp-field-metadesc"]').val() ) == '' ) { $box.find('textarea[name="psp-field-metadesc"]').val( postData.gen_desc ); } if ( $.trim( $box.find('textarea[name="psp-field-metakewords"]').val() ) == '' ) { var __keywords = []; //if ( $.trim( $box.find('input[name="psp-field-focuskw"]').val() ) != '' ) { // __keywords.push( $box.find('input[name="psp-field-focuskw"]').val() ); //} // :: Multi Keywords - enter __mkw = multi_keywords.get_tokens({ 'el' : '#psp-field-multifocuskw', 'restype' : 'array', }); if ( ! $.isEmptyObject(__mkw) && $.isArray(__mkw) ) { for (var ii=0, len=__mkw.length; ii -1 ) { theResp.html('').hide(); metabox.preload.hide(); metabox.box.fadeIn('fast'); //show() return false; } if ( __type=='app' && theTriggerVal=='default' ) { theResp.html('').hide(); return false; } var $box_type = metabox.main.find('.psp-mb-setts'), $box_taxonomy = $box_type.find('.psp-mb-taxonomy'), box_taxonomy = $box_taxonomy.length ? $.trim( $box_taxonomy.text() ) : '', $box_termid = $box_type.find('.psp-mb-termid'), box_termid = $box_termid.length ? $.trim( $box_termid.text() ) : ''; $.post(ajaxurl, { 'action' : 'pspTwitterCards', 'sub_action' : 'getCardTypeOptions', 'card_type' : __type=='post' ? $('#psp_twc_post_cardtype').val() : 'app', 'page' : __type=='post' ? 'post' : 'post-app', 'post_id' : parseInt( metabox.post_id ), //$boxData.find('.psp-post-postId').text() 'box_taxonomy' : box_taxonomy, 'box_termid' : box_termid }, function(response) { metabox.preload.hide(); metabox.box.fadeIn('fast'); //show() var theResp = ( __type=='post' ? $('#psp-twittercards-post-response') : $('#psp-twittercards-app-response') ); if ( response.status == 'valid' ) { theResp.html( response.html ).show(); return true; } return false; }, 'json'); }, triggers: function() { var self = this; self.get_options( 'post' ); self.get_options( 'app' ); $('body').on('change', '#psp-tab-div-id-twitter_cards #psp_twc_post_cardtype', function (e) { e.preventDefault(); self.get_options( 'post' ); }); $('body').on('change', '#psp-tab-div-id-twitter_cards #psp_twc_app_isactive', function (e) { e.preventDefault(); self.get_options( 'app' ); }); } } /** * Mass Optimization - optimize, seo report... */ function tailCheckPages() { if( selected_element.length > 0 ){ var curr_element = selected_element[0]; optimizePage( curr_element.find('.psp-do_item_optimize'), function(){ selected_element.splice(0, 1); tailCheckPages(); }); } } function massOptimize() { // reset this array for be sure selected_element = []; // find all selected items maincontainer.find('.psp-item-checkbox:checked').each(function(){ var that = $(this), row = that.parents('tr').eq(0); selected_element.push( row ); }); tailCheckPages(); } function optimizePage( that, callback ) { var row = that.parents("tr").eq(0), id = row.data('itemid'); //kw = row.find('input.psp-text-field-kw').val(); var __mkw = multi_keywords.get_tokens({ 'el' : 'input.psp-text-field-kw#psp-focus-kw-'+id, 'restype' : 'list', }); var kw = __mkw; row_loading(row, 'show'); var itemid = id, $box = row.parent().find('#psp-inline-edit-post-'+itemid); if ( $box.length > 0 ) { //item current opened box => action is Quick Save & Optimize in callback! row_actions.saveBox( $box, row, [row_actions.optimizeBox, id, kw, row], callback ); return false; } else { //other box => action is Optimize row_actions.optimizeBox( id, kw, row, callback ); } } function getSeoReport( row, id, kw ) { var lightbox = $("#psp-lightbox-overlay"); // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php jQuery.post(ajaxurl, { 'action' : 'pspGetSeoReport', 'id' : id, 'kw' : kw, 'debug_level' : debug_level }, function(response) { if( response.status == 'valid' ){ do_progress_bar(row, response.score); lightbox.find(".psp-lightbox-headline i").eq(0).text( response.post_id ); lightbox.find("#psp-lightbox-seo-report-response").html( response.html ); /* Multi Keywords - sub tabs */ pspFreamwork.multikw_tabs_load( lightbox.find('.psp-multikw') ); lightbox.fadeIn('fast'); } row_loading(row, 'hide'); }, 'json'); lightbox.find("a.psp-close-btn").click(function(e){ e.preventDefault(); lightbox.fadeOut('fast'); }); } function do_progress_bar( row, score, score_show ) { var score = score || 0, score_show = typeof score_show !== 'undefined' ? score_show : score; var progress_bar = row.find(".psp-progress-bar"); //progress_bar.attr('class', 'psp-progress-bar'); //var width = 100; //width = progress_bar.width(); //width = parseFloat( parseFloat( parseFloat( score / 100 ).toFixed(2) ) * width ).toFixed(1); var size_class = 'size_'; if ( score >= 20 && score < 40 ){ size_class += '20_40'; } else if ( score >= 40 && score < 60 ){ size_class += '40_60'; } else if( score >= 60 && score < 80 ){ size_class += '60_80'; } else if( score >= 80 && score <= 100 ){ size_class += '80_100'; } else{ size_class += '0_20'; } progress_bar .addClass( size_class ) .width( score + '%' ); row.find('.psp-progress').find(".psp-progress-score").text( score_show + "%" ); } function load_progress_bar( wrapper ) { console.log( wrapper.find('.psp-progress') ); $.each(wrapper.find('.psp-progress'), function(ii) { var $this = $(this), _parent = $this.parent(), _score = $this.data('score'), _score_show = $this.data('score_show'); do_progress_bar(_parent, _score, _score_show); //refresh score! }); } function row_loading( row, status ) { if( status == 'show' ){ if( row.size() > 0 ){ if( row.find('.psp-row-loading-marker').size() == 0 ){ var row_loading_box = $('
    ') row_loading_box.find('div.psp-row-loading').css({ 'width': row.width(), 'height': row.height() }); row.find('td').eq(0).append(row_loading_box); } row.find('.psp-row-loading-marker').fadeIn('fast'); } }else{ row.find('.psp-row-loading-marker').fadeOut('fast'); } } /** * Mass Optimization - inline edit | quick edit */ var row_actions = { itemid : null, //current itemid //current & previous item box opened for inline edit! itemCurrent : null, itemPrev : null, opened : null, init: function() { var self = this; self.triggers(); }, triggers: function() { var self = this; var tableSelector = '.psp-table-ajax-list table.psp-table'; // show | hide row actions on hover over table tr! /*maincontainer.on({ mouseenter: function () { //current item box opened! if ( self.opened === true && self.itemCurrent == $(this).data('itemid') ) return false; $(this).find('td span.psp-inline-row-actions').removeClass('hide').addClass('show'); }, mouseleave: function () { //current item box opened! if ( self.opened === true && self.itemCurrent == $(this).data('itemid') ) return false; $(this).find('td span.psp-inline-row-actions').removeClass('show').addClass('hide'); } }, tableSelector+' tr');*/ maincontainer.on('click', tableSelector+' tr td span.psp-inline-row-actions .editinline', function (e) { e.preventDefault(); var row = $(this).parents('tr').eq(0), itemID = row.data('itemid'); row_loading(row, 'show'); self.itemid = itemID; self.itemPrev = self.itemCurrent; self.itemCurrent = itemID; if ( $('#psp-inline-edit-post-'+self.itemCurrent).length > 0 ) { //current item box is already opened // populate box! self.boxPopulate( row, self.itemid ); return false; } //remove previous item box & row actions view! $('#psp-inline-edit-post-'+self.itemPrev).remove(); //row.parent().find('td span#psp-inline-row-actions-'+self.itemPrev).removeClass('show').addClass('hide'); //build item edit box self.buildBox( row, self.itemid ); }); }, autoFocus: function( row, itemid ) { var self = this; row_loading(row, 'show'); if ( $('#psp-inline-edit-post-'+self.itemCurrent).length > 0 ) { //current item box is already opened // populate box! self.boxPopulate( row, itemid, true ); return false; } //remove previous item box & row actions view! $('#psp-inline-edit-post-'+self.itemPrev).remove(); //row.parent().find('td span#psp-inline-row-actions-'+self.itemPrev).removeClass('show').addClass('hide'); //build item edit box self.buildBox( row, itemid, true ); }, buildBox: function( row, itemid, autofocus ) { var self = this; self.opened = true; // create box html! self.boxHtml( row, itemid ); // populate box! self.boxPopulate( row, itemid, autofocus ); }, boxHtml: function( row, itemid ) { var self = this; var table = row.parent(), __boxhtml = $('#psp-inline-editpost-boxtpl').html(); __boxhtml = '
    ' + __boxhtml + '
    '; row.after( $( '' ) .append( $('' ).html( __boxhtml ) ) .hide() ); // retrieve box element! var $box = table.find('#psp-inline-edit-post-'+itemid); // box buttons handlers $box.find('input#psp-inline-btn-cancel').bind('click', function (e) { self.closeBox( $box, row ); }); $box.find('input#psp-inline-btn-save').bind('click', function (e) { self.saveBox( $box, row ); }); }, boxPopulate: function( row, itemid, autofocus ) { var self = this; var autofocus = autofocus || false; // retrieve box element! var table = row.parent(), $box = table.find('#psp-inline-edit-post-'+itemid), $boxData = row.find('#psp-inline-row-data-'+itemid); var __mkw = []; var postData = {}; postData.title = $boxData.find('.psp-post-title').text(); postData.gen_desc = $boxData.find('.psp-post-gen-desc').text(); postData.gen_kw = $boxData.find('.psp-post-gen-keywords').text(); postData.meta_title = $boxData.find('.psp-post-meta-title').text(); postData.meta_desc = $boxData.find('.psp-post-meta-description').text(); postData.meta_kw = $boxData.find('.psp-post-meta-keywords').text(); postData.focus_kw = $boxData.find('.psp-post-meta-focus-kw').text(); postData.canonical = $boxData.find('.psp-post-meta-canonical').text(); postData.rindex = $boxData.find('.psp-post-meta-robots-index').text(); postData.rfollow = $boxData.find('.psp-post-meta-robots-follow').text(); postData.spriority = $boxData.find('.psp-post-priority-sitemap').text(); postData.sinclude = $boxData.find('.psp-post-include-sitemap').text(); //row.find('input.psp-text-field-kw').val( postData.focus_kw ); multi_keywords.replace_tokens({ 'el' : 'input.psp-text-field-kw#psp-focus-kw-'+itemid, 'tokens' : multi_keywords.html2tokens({ 'elm' : $boxData.find('.psp-post-meta-fields-params') }) }); $box.find('input[name="psp-editpost-meta-title"]').val( postData.meta_title ); $box.find('textarea[name="psp-editpost-meta-description"]').val( postData.meta_desc ); $box.find('textarea[name="psp-editpost-meta-keywords"]').val( postData.meta_kw ); $box.find('input[name="psp-editpost-meta-canonical"]').val( postData.canonical ); $box.find('select[name="psp-editpost-meta-robots-index"]').val( postData.rindex ); $box.find('select[name="psp-editpost-meta-robots-follow"]').val( postData.rfollow ); $box.find('select[name="psp-editpost-priority-sitemap"]').val( postData.spriority ); $box.find('select[name="psp-editpost-include-sitemap"]').val( postData.sinclude ); // placeholders as default var postDefault = {}; postDefault.the_title = $boxData.find('.psp-post-default-the_title').length ? $boxData.find('.psp-post-default-the_title').text() : ''; postDefault.the_meta_description = $boxData.find('.psp-post-default-the_meta_description').length ? $boxData.find('.psp-post-default-the_meta_description').text() : ''; postDefault.the_meta_keywords = $boxData.find('.psp-post-default-the_meta_keywords').length ? $boxData.find('.psp-post-default-the_meta_keywords').text() : ''; //console.log( postDefault ); $box.find('input[name="psp-editpost-meta-title"]').attr( "placeholder", postDefault.the_title ); $box.find('input[name="psp-editpost-meta-title"]').attr( "title", postDefault.the_title ); $box.find('textarea[name="psp-editpost-meta-description"]').attr( "placeholder", postDefault.the_meta_description ); $box.find('textarea[name="psp-editpost-meta-description"]').attr( "title", postDefault.the_meta_description ); $box.find('textarea[name="psp-editpost-meta-keywords"]').attr( "placeholder", postDefault.the_meta_keywords ); $box.find('textarea[name="psp-editpost-meta-keywords"]').attr( "title", postDefault.the_meta_keywords ); // auto focus if ( autofocus ) { //if ( $.trim( row.find('input.psp-text-field-kw').val() ) == '' ) { // row.find('input.psp-text-field-kw').val( postData.title ); //} // :: Multi Keywords - enter __mkw = multi_keywords.get_tokens({ 'el' : 'input.psp-text-field-kw#psp-focus-kw-'+itemid, 'restype' : 'array', }); if ( $.isEmptyObject(__mkw) ) { multi_keywords.add_token({ 'el' : 'input.psp-text-field-kw#psp-focus-kw-'+itemid, 'token' : postData.title }); } if ( $.trim( $box.find('input[name="psp-editpost-meta-title"]').val() ) == '' ) { $box.find('input[name="psp-editpost-meta-title"]').val( postData.title ); } if ( $.trim( $box.find('textarea[name="psp-editpost-meta-description"]').val() ) == '' ) { $box.find('textarea[name="psp-editpost-meta-description"]').val( postData.gen_desc ); } if ( $.trim( $box.find('textarea[name="psp-editpost-meta-keywords"]').val() ) == '' ) { var __keywords = []; //if ( $.trim( row.find('input.psp-text-field-kw').val() ) != '' ) { // __keywords.push( row.find('input.psp-text-field-kw').val() ); //} // :: Multi Keywords - enter __mkw = multi_keywords.get_tokens({ 'el' : 'input.psp-text-field-kw#psp-focus-kw-'+itemid, 'restype' : 'array', }); if ( ! $.isEmptyObject(__mkw) && $.isArray(__mkw) ) { for (var ii=0, len=__mkw.length; ii input.token-input').size(); if ( ( lenBefore > lenAfter ) && ( cc < max ) ) { __doit(); } else { setTimeout(function() { pspFreamwork.to_ajax_loader_close(); }, 100); clearTimeout(__timer); __timer = null; } }, 250); }; __doit(); })(); } } function _build_tokenfield( pms ) { var pms = pms || {}, el = misc.hasOwnProperty(pms, 'el') ? pms.el : null, defaultkw = misc.hasOwnProperty(pms, 'default') ? pms.default : '', defaultkw2 = []; if ( '' != defaultkw ) { defaultkw2 = defaultkw.split("\n"); } //console.log( defaultkw2 ); el.tokenfield({ tokens : defaultkw, //[], autocomplete : { // jQuery UI Autocomplete options //delay: 100, //source: ['red','blue','green','yellow','violet','brown','purple','black','white'], source: function (request, response) { var service = { client: 'psy', ds: '' }; $.ajax({ url: (window.location.protocol == 'https:' ? 'https' : 'http') + '://www.google.com/complete/search', dataType: 'jsonp', data: { q: request.term, nolabels: 't', client: service.client, ds: service.ds }, success: function (data) { response($.map(data[1], function (item) { return { value: $("") .html(item[0]) .text() }; })); } }); } }, delimiter : ["\n"], limit : 10, // Maximum number of tokens allowed. 0 = unlimited minLength : 3, // Minimum length required for token value //showAutocompleteOnFocus: true }); //$.each(defaultkw2, function(i) { // el.tokenfield('createToken', defaultkw2[i]); //}); } return { 'load' : load, 'get_tokens' : get_tokens, 'add_token' : add_token, 'replace_tokens' : replace_tokens, 'html2tokens' : html2tokens }; })(); // :: MISC var misc = { hasOwnProperty: function(obj, prop) { var proto = obj.__proto__ || obj.constructor.prototype; return (prop in obj) && (!(prop in proto) || proto[prop] !== obj[prop]); }, isNormalInteger: function(str, positive) { //return /^\+?(0|[1-9]\d*)$/.test(str); return /^(0|[1-9]\d*)$/.test(str); } }; // external usage return { "optimizePage" : optimizePage, "multi_keywords" : multi_keywords } })(jQuery); (function ($) { $.fn.googleSuggest = function (opts) { opts = $.extend({ service: 'web', secure: false }, opts); var services = { youtube: { client: 'youtube', ds: 'yt' }, books: { client: 'books', ds: 'bo' }, products: { client: 'products-cc', ds: 'sh' }, news: { client: 'news-cc', ds: 'n' }, images: { client: 'img', ds: 'i' }, web: { client: 'psy', ds: '' }, recipes: { client: 'psy', ds: 'r' } }, service = services[opts.service]; opts.source = function (request, response) { $.ajax({ url: (window.location.protocol == 'https:' ? 'https' : 'http') + '://www.google.com/complete/search', dataType: 'jsonp', data: { q: request.term, nolabels: 't', client: service.client, ds: service.ds }, success: function (data) { response($.map(data[1], function (item) { return { value: $("") .html(item[0]) .text() }; })); } }); }; return this.each(function () { $(this) .autocomplete(opts); }); } })(jQuery); (function($) { $.fn.extend( { pspLimitChars: function(charsLeftElement, maxLimit) { $(this).on("keyup focus", function() { countChars($(this), charsLeftElement); }); function countChars(element, charsLeftElement) { if ( typeof element == 'undefined' || typeof element.val() == 'undefined' ) return false; maxLimit = maxLimit || parseInt( element.attr('maxlength') ); var currentChars = element.val().length; if ( currentChars > maxLimit ) { //element.value = element.val( substr(0, maxLimit) ); element.value = pspFreamwork.substr_utf8_bytes(element.val(), 0, maxLimit); currentChars = maxLimit; } charsLeftElement.html( maxLimit - currentChars ); } countChars($(this), charsLeftElement); } } ); })(jQuery);LI ::[:-smartSEO/modules/on_page_optimization/app.css ob.psp-tab-container .psp-chars-left { font-weight: bold; }&f  χ'FsmartSEO/modules/on_page_optimization/assets/16_onpageoptimization.png obPNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-iTXtXML:com.adobe.xmp Adobe Photoshop CC (Windows) 2013-11-08T16:43:11+02:00 2013-11-20T19:42:10+02:00 2013-11-20T19:42:10+02:00 image/png xmp.iid:f16a17d4-033e-8646-9051-550ae5987796 xmp.did:a1b7f11a-6a80-d94b-9178-6889a46247e9 xmp.did:a1b7f11a-6a80-d94b-9178-6889a46247e9 created xmp.iid:a1b7f11a-6a80-d94b-9178-6889a46247e9 2013-11-08T16:43:11+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:c7691dc6-da2e-2740-89f2-74445cfd7597 2013-11-08T16:44:37+02:00 Adobe Photoshop CC (Windows) / saved xmp.iid:7d5a0b00-d7ce-ae43-afe2-e703759abef6 2013-11-20T19:42:10+02:00 Adobe Photoshop CC (Windows) / converted from application/vnd.adobe.photoshop to image/png derived converted from application/vnd.adobe.photoshop to image/png saved xmp.iid:f16a17d4-033e-8646-9051-550ae5987796 2013-11-20T19:42:10+02:00 Adobe Photoshop CC (Windows) / xmp.iid:7d5a0b00-d7ce-ae43-afe2-e703759abef6 xmp.did:a1b7f11a-6a80-d94b-9178-6889a46247e9 xmp.did:a1b7f11a-6a80-d94b-9178-6889a46247e9 3 sRGB IEC61966-2.1 PSP PSP 001B33365342ABDF451F50498FEED06E 01572CA43F1E3A8160018073B8740742 024F796E6EB19108F58B6C5CBC92BFAB 02AD8C32EFDA8FFDA17773883C5AAC94 040E3F4A7214F10F41DC49C321E07AAA 04E34BBFCF2C02305EF7709EA12FF210 07915DA1719E56F9E1595BFEF0D147E5 08BB5329D93CC641BE97A023BD1CAEB1 0B577B6A134B449EDAAABC0EDC0F8E23 0DB86355BAE9C8D9FF29AD49F4EF95C4 0DE2B43C2EF2B1667F89945B3BCBD42D 0F1DEC0F2359079A7896919144725A0C 104107DEE7473480BC36240B15D0828F 11A01A357438223E32B67CB5F38E57EB 13278B9B45DF8A0EAA7911FFA3903E47 142315D3D5F08AD07BD100AE3E9D6023 1610053E513CC5334FF0A59905AC0A57 1714ECF6377C9917030809F64A308037 18723AD0ADE34A22A40CC03EA1791DD0 18B63A67EBFE551BF9FC732704EC9191 198856AF49447086D0FF6DDC41DFF434 1A944A9CFCCEEA6B6950A8E1418A2E26 1C25F867AA58C5CAD2EBE6E181A246BA 1E6837B362969D2955DD60FD93D4BD2F 1F318427C4B9D75A9A326FF8C0EB8208 2060245C617D273175534EAA5AA26A21 20DA58E2790F7350DDD31C0E47118966 223262261F060813CF672BBA0B0D9F82 297F279C86BBFDF97439F238EC8A341E 2BAC96F93029B8409AAA9A83C6C8E0B6 2CC3277F2AF0BC423F255627CCDC64D9 2D32A95D2A9C3A07DEE58C774746A044 2E5E625D41787229A42EA78743DFED92 2F55003759903C4B5173907EBA368FC4 301054D5B78CB4DFCC4226272C6478FE 30962B52603565D6F8BD7A1C4CBC195D 30F195B254AE4EA3732AAED75E48F021 30FD1BAD28EBA7CE28747B0B3684856B 30FD7014F0010758A00CB2926060AB52 36B6D78BD578DB7B07313245DE402D31 385E953D218220092A50958205707CDF 3CEF098BEEE207B2D28713FA41A91F99 3CF6886BB569D09259AD3DC8679AC153 40B5F8BA55F7973E079C78F69494E380 41EDA4468139D2A335F7C650EB891357 445BD608B87ECF51070CE97900EBAEBE 447A83FE9F059FAE0B1EB5BA19B45A39 44E94BA6702D653A497047B5D977A47E 45B28DF8F723C86DA8547E2747556FA0 49C1213A588E905033650CD260C1CB5E 4A64588F74F050EB1E63F287CC177CF3 4B8386D047322AB5320089127256333A 4DECD3C733779F33EC6BD8AB661ECC57 4FE9DB0E928E52EB8CE243BBFAC4A557 52CF9CE89C4568DE07E1FA43F92EB738 55B758C43A57A264DA9E3354837F022E 55BCF7BD2E918CDD1CC761C55F4717DC 59915499FA710491164A9193F709C898 599FD634435DF0632FDA16ED3F1D0557 59F2D561D6B867AFEFB9952A2D5FF38D 5A40D7EED8A45A497C37F7CC0A493C3C 5B8E4672075131A36CBD61CE4CA6587E 5B9FFB4D4C39CDF7628A1FC3BE81C042 617FA99AD0EBF0A549AAF8E6C2ED496C 619BD56CC4FEA59FFD2C2AD6CAAA69E3 61EC17A94173219E077F2AD408E26A2D 698D9CBB1EF760354B97CE1674900626 69A8520DB0FCA4467E1988D385894A1A 6B94A4DEE544FBF70D6B1AAD2C33ADE9 6D3C08BCAE082F0D60A5663DFFD22B5D 6D53D91C2C46D082091925E2F0EEF337 6EEBFFAB2567F37C418A22190A9B87B4 6F0535DF0BC6A696263219F409C3E95D 70B686BEF762C0A455A6D4B98E75EAC4 70E1AE2C2ABB055C2C3F7C470A1916E5 710114189DC07FAE76958215E8AFBD54 72851A3B0ED9FDE61D53DE9DF3F7F23B 731B8B4A66A2A5D2AF5165F598EF516F 76C513B5F60DA9EEEFCD69BF9AD32158 787BECB52DF26EE52506EBDAB98E4FDC 793ECAB3CC4289656F3A4ACC668ABD94 7C7A41F2E68CA02E66C6ABD3E574CE3F 804D975DEC1F7DE6771895894E59B5F5 82E45C4F2E3BB5026FEB55788E8B46D2 839275F1C0E530DC4BD905428784BC05 83C25B812DF8753C4A25799E51016FAC 83F84CEE57D174FB62657681F4A88BBE 848F1C0D914C6BA6013F6BF9884A5BA7 850013A8AD362B7565D1640BC8AFBF6B 85ABA8E2B996BE2D29AB96E388536D02 88ED505948DA46CB5F5B67F4B2B4341C 8D1A0ADD2E8D10B1FE65CC7C43EEC95A 8F2CD04DEFBE17609451FBD9DB0190C2 8F48DC0F12C6E4CE5E0F05473CE8F6F1 911E18E4607F128D22B5F2D90823C1F6 946AD6422484AAF697DCBB25BB6642A3 94EDF02BDC86137EDCEEF63C025919C8 94F1EFA64665074B962ED6FDD165B67A 9582079AA99CB0FF87B7A6C20E018B98 967F5BE44879735528005CCD207B115D 9688F98001B07EDAF92CFA6DD0F17907 96FE6E41D885B85D68E61140B3BCE31D 973F8B91961F8C19F42B5993ED1174B0 98B57FE62DD6C034AB8B63F37F190EC5 99CE1174BC07BDA0C4ECE2896D1634F6 9A1D38D552531A940F9810EDE9F924EE 9C239BDC71753AFB5A0D130978F23EA2 9D80DA8B7F04316654BF1E09260F7F70 9DF36BCAB9CEEF7DBA5BC19F10301810 A070480DD31B1F61AE54F93AF6B47601 A1401CCA5E96AD523B0C97616A5E8F1D A1D16162D80934986806426F7AE2765F A2728D35B6D0600A8CBA7209A1B65F8B A35C0AE62B6798B5AE9272739C52A4C6 A7333906666E22339AC8A96861E6B2A5 A7EC83513A56CDB21081A5B609BFB340 A817B93E5B081279397B59795F66434B A877663A2D8B3F97673B09D039393F2F AF23F48C8F4445EAD8CFD80592A82DCA B192FA8F1E5BB1C1A649438DAFA2C9A5 B1AAF32F53485EC5DD0AEBDBC01EB8BE B2D5BC495B9ECBF100E0E487045E6734 B674820F94AEDE7A95FCAEB5256374AB B97F5F048A4CBB453498E1FB2C6AC623 BC2B829F2BD2918A42FF6AA6D4C68CAA BC781B6C21F8DB059D1015046BF394F2 BC8BCF8B8524F580157F3784611EE964 BED2401C96EC4268B153EC448CEA9737 BF9CBA2CD1645C2D095C77F5235D3D55 C17F1D9616707747273B31C3FABF2C34 C27A6EE216DEDDF452B9D9321E056730 C443F46F0DE7F3333FEC3C5DB0E577DA C57932800D0CB1802D6A36C5A10A4EC8 C6A3CB15A0560F4CB33FE124D37303D5 C8A4588815AABA6DEDC876FBCA06B4D8 C8FB4B3C1BEFC4F311425B8E38F0CA12 C9CCFFEDEA085FC33F364A8573547679 CA0B7F517CE95647614C9DE40D9E00EF CA5807CCEF648E544971ACBF4DCB7C48 CB563E1C6CD1842C15B7A3FBABBF1CDE CCB6AD69ADECF3D893C6F8E27F296103 CECFC0BB54D6A1E6E23270BD35E19DEF CF38E47788C68A47F6B689A750211D60 CF7C46B18733C648EFC5E51D96B561D2 CFFD320A6E572E547FEEB92BEC8D8923 D029A3E52F535EA9EA5BE6D3053B7E21 D18EF492BA4D46AE013F54F8C005E346 D1BC1AA06226860620B4E8A0A59FED28 D207B4F211B771CB2F0742ABFD3059D2 D43B841A250F59FC7D7EABCCD3BEC3AD D57FF935FC6296F4B497F097CDCD4F5C D5B8A8CBD2AD026975BE20673203E406 D67C0825A8B7FD496D2B75309A224B65 D6E6053232371882D9CE98FD29881FF7 DB444FB95A66368C114BA16DE371FBEF DC9C39A0B61877096E8836FAEB314776 DD32E4622236437612F791A5AF6EB434 DD5261F940A24637A882A34028C4EF0F DE3D5C2FA21C3B2DC3D99ACD426DB751 DF698680E0ACAC53A262DE2F9A38C895 E07EE7342C600FFBAFE203EBC6C2A5AA E0F7D6C3F965391FE11C7D3C071CF243 E12069AF8AB1A973588A5E09069997D6 E27D491CFE73849F282FDBB0245325E5 E550EA09C202F953CD51A5FF20BEF7F2 E795B782469DEF7079ED781318CB4B9E E7D7F49ADF8A9D50C80181F8156B7F6D E9B34685FE9E28D3BDEE9A1F9BC51CE2 EB8AA71B976DECE1343AD837816A0E54 EC1BD639AEA2E8D9B2E7CA99C32F8AFE ED3547DA3B2ECEAFDE751D5373E88343 EE705C74D86BA4F86801A2E4D2E8B83D EF9F52E39C5E375D5250630B1C2C4AC9 EFBCA7F452AD034564040DA2B7758F69 EFD2B8B01150207F8F3B69D7259D80DF F0CDBE86158BA39A954327D634ECFA82 F0EC9515ED2D8F02ECAEE1EF9688D612 F18DB6F62A6A80F54EBF9782BED1CD6C F28A3845BF68E228D355B96970B91CD8 F4C355944E66DA18402A86B197C21425 F5636988C6D644712543CD4899D46213 F682C68BDCC29D5F6B889ED1A22617CF F7B060451B69AC085D12D51E8D133BED FA8CD7EAB5D939145BE099E13E1FE499 FD2ED6F5234742D5BCA7C71D23EF3962 FE3F37267F5BB3E372078DF9101450DE FEB7785DC8D2B6A6EC54146D79F17AE6 adobe:docid:imageready:71b72c00-06cd-11dd-96d5-b9d1971c2299 adobe:docid:indd:d9e95eeb-b763-11df-82eb-83f8ca83d6f5 adobe:docid:photoshop:01f145c4-1bf9-11db-af76-84f2f5b3e193 adobe:docid:photoshop:0629df6d-a412-11da-9dde-c8a00c7693e5 adobe:docid:photoshop:067f015c-6500-11dd-8c0e-da03867eaa6f adobe:docid:photoshop:0cc9b3f9-0481-11de-9954-c65a624f0359 adobe:docid:photoshop:0d69849f-1468-11dd-b4d5-a76ee511c599 adobe:docid:photoshop:0fc79f20-d232-11db-b1bb-aeba6ac5ef65 adobe:docid:photoshop:1095d5e7-5bc7-11d8-b5c4-ad94fedcbdf3 adobe:docid:photoshop:112ff759-2eb4-11d8-a7a3-d143df8e175d adobe:docid:photoshop:162f56b4-a07b-11db-9b6d-e4600e41f893 adobe:docid:photoshop:1634635d-b6aa-11d9-9d93-8f8f4ce80942 adobe:docid:photoshop:179a5fc6-d465-11da-b675-db28fe4a73f8 adobe:docid:photoshop:17f5aa33-b3be-11dc-9058-b94aaeb221d7 adobe:docid:photoshop:1bca738d-4d28-11df-ae11-88a6b11ac6d3 adobe:docid:photoshop:1eff0a7c-bb0e-11db-af40-c3e7cd681b24 adobe:docid:photoshop:21672e49-0a8b-11dd-baf7-d52def3e1b33 adobe:docid:photoshop:2176cf16-4d4f-11df-ae11-88a6b11ac6d3 adobe:docid:photoshop:29340be7-17f4-11dd-8148-fbe7f0bac890 adobe:docid:photoshop:296d44c8-fcb3-11de-8115-9f7e92accdc8 adobe:docid:photoshop:2e53065c-a7db-11db-a30c-aa3f32f49aef adobe:docid:photoshop:338a0b29-b45f-11dc-a093-e617abbc94ed adobe:docid:photoshop:3986dd71-8144-11da-af47-f98ca342a16a adobe:docid:photoshop:3b4ad281-f1a5-11db-8922-d70353ace9b0 adobe:docid:photoshop:3c7f34b5-ee6a-11df-a62c-9e4dd8a323b9 adobe:docid:photoshop:3d30f4c2-769a-11d9-87f1-a1f4bd4b2860 adobe:docid:photoshop:3eb9d5d0-7612-11dc-9872-87d859ee3843 adobe:docid:photoshop:4296683b-cf26-11db-b1b5-fcf0cb251532 adobe:docid:photoshop:42b55d04-ca65-11da-ac60-99df23f712b8 adobe:docid:photoshop:441aac6e-94a2-11da-a976-ddfa5322c051 adobe:docid:photoshop:493c92f3-3dde-11e0-a6b1-cafbe7a16662 adobe:docid:photoshop:49703922-ec28-11db-9998-ab71df72ca88 adobe:docid:photoshop:4a96218b-66b9-11de-a83a-bde54db9690a adobe:docid:photoshop:4f6997ab-913d-11dc-a3e7-c094cbb267fd adobe:docid:photoshop:530bb545-385e-11df-b714-dc4d020f611a adobe:docid:photoshop:5799b84a-f22d-11dd-95e6-d94ef15f0b29 adobe:docid:photoshop:5b4c00b2-5b4c-11de-aff6-e755350aa3ae adobe:docid:photoshop:5c20b5c3-8d17-11da-b4cc-aac22df0990d adobe:docid:photoshop:5cde0566-e15d-11df-ba2b-fe8a28cf5a45 adobe:docid:photoshop:5d55d682-fcb5-11df-8232-c2c89e4ac8d9 adobe:docid:photoshop:5f5b7de0-4a43-11df-bc05-e64777e8bef8 adobe:docid:photoshop:60d53d84-f875-11db-831e-c5f511e4f2eb adobe:docid:photoshop:631a4c2e-9104-11df-9ace-8e345b1a4685 adobe:docid:photoshop:67825bcd-c497-11d9-9b79-b43e3425d820 adobe:docid:photoshop:680b500c-af7d-11db-9531-ccfb979a170c adobe:docid:photoshop:68e80938-a2b3-11d8-9091-acb31a8f6422 adobe:docid:photoshop:68e80939-a2b3-11d8-9091-acb31a8f6422 adobe:docid:photoshop:68e8093a-a2b3-11d8-9091-acb31a8f6422 adobe:docid:photoshop:6aeaa901-a256-11dd-88a5-f4fa96375813 adobe:docid:photoshop:6b187a4d-21ac-11df-8763-f7b32115d1d8 adobe:docid:photoshop:6cc72dd4-c122-11da-9ea0-b410217bc604 adobe:docid:photoshop:72ee0624-feb0-11df-95f8-fbdf23b3ba38 adobe:docid:photoshop:76c7207c-5eda-11da-8dd2-e400fd2b8985 adobe:docid:photoshop:792c94d2-0b72-11dd-8a8e-b94e9ce47b14 adobe:docid:photoshop:81d080ca-4d3d-11e0-b91e-8e95c9e5f27c adobe:docid:photoshop:856033d5-fa47-11dc-9057-ac5d3de3713a adobe:docid:photoshop:868029fd-2276-11dd-9239-c1a598344559 adobe:docid:photoshop:8d293722-0529-11da-8d9f-87e9dc8d9ac6 adobe:docid:photoshop:8f80b457-3a61-11df-88fe-f9b9e462b5c5 adobe:docid:photoshop:8ff9d64c-4418-11da-b7e6-d902366ee3d9 adobe:docid:photoshop:91fd7821-74f2-11dd-b9bd-91275cd94b84 adobe:docid:photoshop:923f0e52-3389-11dd-950c-a80d9ad4456c adobe:docid:photoshop:9292eb5e-6ce8-11df-8d9d-d0d5522d8976 adobe:docid:photoshop:96bd365a-ca87-11dd-a0a2-89ff83774eec adobe:docid:photoshop:97c3b72d-4db2-11d9-9000-c6cf0216aa2e adobe:docid:photoshop:9855e9b7-1a77-11e0-a056-a14635721b97 adobe:docid:photoshop:98f1a89c-325d-11dc-8fc3-b9698acf6fce adobe:docid:photoshop:9d09ed44-1a77-11e0-a056-a14635721b97 adobe:docid:photoshop:a02e243d-7d2f-11db-95da-9323d7f297b0 adobe:docid:photoshop:a8f63b8c-cf8e-11d9-8f38-ea3e2d6c58a2 adobe:docid:photoshop:ab3bf953-b3ce-11df-889a-804e00b2331c adobe:docid:photoshop:b139775b-76ef-11db-b872-fa9e22b73d6e adobe:docid:photoshop:badec3b0-8d9f-11dc-aa6d-fd72ed461365 adobe:docid:photoshop:bb885d59-f165-11dd-b2e7-b55f0ff3594b adobe:docid:photoshop:bcf84d43-1a75-11e0-a056-a14635721b97 adobe:docid:photoshop:c1422350-a306-11d7-ad63-9fa59f868483 adobe:docid:photoshop:c1b701b5-db72-11db-ab1f-df74d7423f7a adobe:docid:photoshop:c4df783a-4b7b-11dc-a30a-e5c2aae6ba21 adobe:docid:photoshop:c5063482-0f94-11db-a9d4-b21f0f974623 adobe:docid:photoshop:c6f96f3b-5231-11dd-b295-c1ce63d1952b adobe:docid:photoshop:cd0c78a0-4851-11dd-8896-8e405be1d8c8 adobe:docid:photoshop:cf96f18d-a6f2-11dd-b2ac-cac96f638488 adobe:docid:photoshop:d1fccbc0-0a37-11dd-8f37-872ce44d6b12 adobe:docid:photoshop:d5d0f74f-cbf2-11df-9218-c52ca14e83e9 adobe:docid:photoshop:d9b2e6a0-8ce7-11dd-be12-93c5fb96f243 adobe:docid:photoshop:da0afeca-b663-11df-989e-cf5b70c23ced adobe:docid:photoshop:db4c3739-d291-11de-9902-88725022e8f9 adobe:docid:photoshop:dd0d929c-07d6-11d9-bb77-bfa7c8df5462 adobe:docid:photoshop:e4c364fc-2298-11dc-a3f1-affe78f3f1dd adobe:docid:photoshop:ee6e49c8-7ce6-11d7-a363-f9d10a5efd56 adobe:docid:photoshop:ee86b539-ba5d-11db-8dd9-fdce7565c567 adobe:docid:photoshop:ef1a6e5e-cbe9-11da-80fe-a32a41494dfa adobe:docid:photoshop:f0782080-cdd9-11d9-880d-b6b93505ef6c adobe:docid:photoshop:f935bde8-01f5-11e1-b0e3-99530bda4a31 adobe:docid:photoshop:fdf24b1a-2b71-11db-836a-8172f4ed98db adobe:docid:photoshop:fe58821d-5776-11df-8604-e5ea32f60741 uuid:001538AE6ADFDB11A160D41A8AFEFCAB uuid:00F94DE476FADE11AFBDDD91A537C5BD uuid:012B2C21C9B9DF119CA8F01C9B0C0333 uuid:01814A2EB739E111821CC1F06665CF29 uuid:0261F32478B9DD1186D09AA78310AF3B uuid:02E56BB23746DE118E05E00A924D8CC5 uuid:030793878DD511DB866B8FDD4FC5F6E8 uuid:038BF6416BBEDD11A016A6CCB7190A9E uuid:0446C88A4A56DC118EB38611B26FC35B uuid:04770F6D9686DE119BF8D83DC6F1A789 uuid:047C71B83946DE118E05E00A924D8CC5 uuid:04995FE55015DF11B678C06184391132 uuid:049B6674521BDF118174D58534E02F48 uuid:067F0114C5F4DF1181FBFA1FAF58F2DA uuid:06AE789055C1DC118FCCAFD862EC21B4 uuid:06CADE1FCD57DE119AA1DA9EA00F26D4 uuid:07218203AADEE011BA4CB639D1A8BD5A uuid:0769202E525E11DC813CFF9D60E9E4E7 uuid:086840927201DD1192F9E6B08F89D298 uuid:08CD4728BB26DF11BDEEDCA72E0E76E6 uuid:0A139D1E8A5CDC119A05BD94A54C7480 uuid:0B00D3552B46DE118E05E00A924D8CC5 uuid:0BBC2E109551E011A9DBA1AE97CD3A90 uuid:0CB3F764639CDE1183DFC60C032A1A9A uuid:0CE6EE4B3046DE118E05E00A924D8CC5 uuid:0E387A182E46DE118E05E00A924D8CC5 uuid:0E6C4060E6ACDC11A31BE2F1875A55F1 uuid:0EC1D3E93146DE118E05E00A924D8CC5 uuid:0F6E42F71D46DE118E05E00A924D8CC5 uuid:0F82B8E1008DDE118063A18DC277C381 uuid:1054D978C0E1DF11AA8AB303BFA5E6F2 uuid:106F5789EEDEE011B872DF47B34C9F1C uuid:10D9DC303346DE118E05E00A924D8CC5 uuid:11056C5AF55AE0118DE98213B6FC8AC1 uuid:134CED88052EDD11B423D4798897593C uuid:138E6BEB550311DE9C9980EB732A103B uuid:14BEAC59A02ADF11AECBC7578FA1C8B8 uuid:14C354FB2146DE118E05E00A924D8CC5 uuid:15553F6A9213DB1180BDFBD3D4018BA1 uuid:15578F2F1E86DD11AF96B6D037A279B9 uuid:15C1037383AFDF119792D12E80BC077C uuid:16387A182E46DE118E05E00A924D8CC5 uuid:169BE01290ACDC118FF9BE61B5313549 uuid:16BCA70A928BDB119FE2D1D1AD6D4DCE uuid:16F84B7E3246DE118E05E00A924D8CC5 uuid:1733C6F5FF8DDF118C48B1BDE6AABF0E uuid:19501508E2EF11DD8BECCB6B4552BEA7 uuid:19880D482AA8DE1181EEF3E5985FC08C uuid:1C68182A4875DE11A992FD2DC6E9830D uuid:1C746F852FB6DD11856A9A95FF697F0E uuid:1C79290ECC45DE118B23AD30BCA96A14 uuid:1CC0A469339DDD1192D3E25231FB5305 uuid:1CF25C713546DE118E05E00A924D8CC5 uuid:1D4243C97491DC11B124BBBDFFB33225 uuid:1D441F4C79C6E111989FA47FE829BB4C uuid:1D468B5A156711DE9D09B95D7469FFFE uuid:1D6D06A3DC8BDD11911EA1F37D8753ED uuid:1D90BE4363FCDA11AA83B543DC89108D uuid:1DC5EA073246DE118E05E00A924D8CC5 uuid:1E11C42A48FADE11AC12D4AAFE286F5F uuid:1E2D9BC292B811DCAC0BD7CFBA286A6B uuid:1E71DF13FDB5DE11B9299E5C971CB542 uuid:1EE7DEC2481ADF11905AD1E5E7183152 uuid:1EF56AB8E4FEDB11B991B9E549BBAB83 uuid:1F5AF3B67229DF119FFAB26E240C71BB uuid:1F95AC394748E011BC12ECADEA413AA4 uuid:2008E13DE47DDD119CA6C60CABE7E84D uuid:20323DAF3833DD11B84DB153FFCB2B25 uuid:20755CD9A1BEDC11AD9FC86910038926 uuid:207F5AB1E3E6DE11AFB6E5ECBD156976 uuid:208C44507E13DF11882FD35504085383 uuid:20AD1BCA27D611DCB3DCF58CB1282188 uuid:20DD6643FAC6DB11A46EA4B49D2FDE5A uuid:226AE9E80D1CDF11ACEBF49C1510D7E2 uuid:227BDC9B2FAADC119028943FDADC2D16 uuid:2290C3CD8FACDC118FF9BE61B5313549 uuid:22B35C622246DE118E05E00A924D8CC5 uuid:22C16BAA5AF3DE11B11DCE9D526E88E8 uuid:240F7696E09BDF118943EC7D2E89C0BA uuid:259C2D4D68C0DC11B4B1BE8F57C5AEE6 uuid:268662FD552E11DBBFFDB36DCBD91ADF uuid:27D3988D43DEDD118DB9EA210F03F4FF uuid:27F89F1127E2DD118645D3FA1066C7BA uuid:28403F4BC4D2DE11A11ED550D38F445B uuid:284D341C3746DE118E05E00A924D8CC5 uuid:28B85E6492B811DCAC0BD7CFBA286A6B uuid:290B84B52146DE118E05E00A924D8CC5 uuid:29F3D697198FDD1184F5AD5C323BD3E2 uuid:2A0921B9216DDD11A727A67773091824 uuid:2AD564756594DE11B4DDDF1320E4F07D uuid:2BFAFD88407EDC118371AA574708AABD uuid:2C205C7E8234DD11A069BF111D61B76C uuid:2C2589466F13DD119981999D14D29795 uuid:2C4F78A7552E11DBBFFDB36DCBD91ADF uuid:2D1F05B02946DE118E05E00A924D8CC5 uuid:2DBDD1BFCE1DDF119ABEC149331D314D uuid:2DBF74503C01DE119EDBA14779040E1A uuid:2DE8D2195D4DDC11ADBADEFD96B7F140 uuid:2F207EF07CC311DC870CD15D8998FC19 uuid:2FC0808BAE1DDD1185C1B3B2A073CCB6 uuid:304189413A6DDD119AFBF80C0D12BBC3 uuid:304D341C3746DE118E05E00A924D8CC5 uuid:328C2A23A1F3DE1188FCDC0D4534976A uuid:329EBF14943111DB9A19BF196009E84F uuid:32AD901C1540DF11BA22EB8390E427FA uuid:32C9A1BE013BDF11B28AB1E9B9BBF88A uuid:348C14E2B68DE011B2D0DF71982ECD78 uuid:35C28732F068E011BAE4A0F3F205CB0C uuid:36483A0B31BA11DEB3BCC14406C17F6A uuid:36483A1131BA11DEB3BCC14406C17F6A uuid:369E727FB04FDE119777A241E1132B43 uuid:36CC338DBF03DE11AA85DC89D1FCF295 uuid:37DD06A87653E1118422D9075FE29A11 uuid:382227419650DE11828EB79B7FF87B46 uuid:38DF7959A6A5DB11A7C783DEA9FDEF8A uuid:38EFEBD32C46DE118E05E00A924D8CC5 uuid:395B108AEC5FDE118F3EC99520DEB99E uuid:399642B01C46DE118E05E00A924D8CC5 uuid:39A85F352346DE118E05E00A924D8CC5 uuid:39F2EE174FCADF118E56E5FBFA7574BF uuid:3A4677815E29DF11A0B087DF897F5C56 uuid:3A4F51BF7911DE11A781FBA8671F5E89 uuid:3A8AF8CF577911E0A1AEADCEF7A8C695 uuid:3ADF94544123E011ADD7B065B3C26A4D uuid:3BF230DABEACDD11889FAC5282935681 uuid:3C0D38C2AFDEE011B945C4A423A57949 uuid:3CB8F15F31B6DD11856A9A95FF697F0E uuid:3D5103E655A5DF118996AFF35D6A9C7A uuid:3D90B6044FC611DB95D9A98C0E2341EA uuid:3E451D295162DB11827CBBD5A8C451C9 uuid:3ED246C8D77DDE11BF1BC86AD7862F57 uuid:3FAAB31DC7F3DE11BFB3BB61AE1A198B uuid:4017B42DAECBDE1186239E156231D83C uuid:4062B740431FE0119F84DB1DBEC49892 uuid:41A85F352346DE118E05E00A924D8CC5 uuid:4201C5411090DE11B123E1D45CDBF792 uuid:42595685158BDC11A437894E1E45ED2D uuid:42A5C6F1B041DF1190BE881BF8159F39 uuid:438D9E113046DE118E05E00A924D8CC5 uuid:457D02955055DF118B59D959D9FCD50B uuid:45B952D1A760DD11B3A3AB60E7CB2E32 uuid:4610D2BB5C3ADF11A1E0EE016E9F3D12 uuid:469594D60783DC11B8A6C730DDF0A3E8 uuid:46B070169EABE011BB42E88B754C4AEE uuid:46E135E06305E011A766E5F2293E7D86 uuid:46E5046B7D79DD11B6DAD14729559D83 uuid:47D9591E31BA11DEB3BCC14406C17F6A uuid:47F508C2CB3EDE1189BBC659B9EC8880 uuid:488E7D216417DF11AB3096DB59BE8278 uuid:49E8A66A3BB5DE11809BA989B0D77432 uuid:4B7C1B8FA601DD11A05B82F82E7564A7 uuid:4BD64E3D591ADF119A44816E426D14CC uuid:4D09B0846C29DF11843DE8ED84598CA3 uuid:4D47530DBFB1DE11838CB79BB029C533 uuid:4D9C981BFF36E011B824F4BA8EC19276 uuid:4DAB2F01082BDC11A590ADEFB8A01727 uuid:4DB2B99C3246DE118E05E00A924D8CC5 uuid:4F9AD90BECFEDB11B991B9E549BBAB83 uuid:5001F74D2A46DE118E05E00A924D8CC5 uuid:502ADD3C8B13DD118EA79BEFBD19D7B1 uuid:502D4D912B46DE118E05E00A924D8CC5 uuid:5085FE1C5CF1DC1184999B2D473B40C5 uuid:50A5F355BC4BDF11A8A3F6410E93A61A uuid:51102D2348E6DC11BA37A1F459320984 uuid:51A11EEB85A7DD11A19786A77EB54A52 uuid:52A5D3054338DF1190DAEFCE2D940955 uuid:5344B517DA0CDE11AB76806D8F41191A uuid:53E437D50797DE11B2DABAB77D7740BE uuid:54E3BAB15595DE1191E8AA31C2B4DE24 uuid:556D58241B1CDB1189D5B5EC4E3A9E38 uuid:5577922C3846DE118E05E00A924D8CC5 uuid:557E3B3CE135DF119278D380A54DDC5A uuid:565C30D43A08DF11A61DB227EDDF59F8 uuid:56D4817031A9DD11B70DB0CF0BC9EDCD uuid:57659E439232DF11A17C9479A9CEE277 uuid:578299FCC3D0DE119465B96E3C2E2EAA uuid:57B5C40EA9FADF11BA9BD748AA367EA4 uuid:5837A8EFFDD2DE11B148FAEF5DA70A0A uuid:5975A572B4AFDE1191F9D38249749CE2 uuid:5A79E0672746DE118E05E00A924D8CC5 uuid:5B0CD778CF24DF1182C1B3E1B6A83EEB uuid:5B25B2A4FC5FDE118C55E1FD1DE5BAC3 uuid:5B5A903A8F63E0119B87E6FF75E31714 uuid:5B636B2FE0B0DE11A587BCC51C1D4B69 uuid:5B6CC28AD15EDD11B9AE8B3F0765C8D0 uuid:5BAB8930E193DD11ACDF9A606EE463A3 uuid:5C7449A48B91DC11831FEBD781B6ECB9 uuid:5D0C528FBA46E01183C8E802910C25E8 uuid:5D384D1449EADE11A9D8BF3293C13593 uuid:5DA6CE83324911DEA1B296A980BFAFA4 uuid:5DA895C1944CDE119C89B968D8A62C72 uuid:5F50494D7C49DE11826FBB70EB840DDA uuid:602E96167548DF11B95593FEFB4F0A8F uuid:60AD1AEAF96CDF1185BBB7D7C9ACD7A0 uuid:60BCB4D66DD6DD11A47DE4DAE0EFF793 uuid:6192C48C2463DC11A938D0D477F76208 uuid:620AF59A6568DD11A7E4CCA02A14236A uuid:62125b08-dfcc-5f4c-8dc1-0da856e0f01d uuid:62B1E9C30F69DD11BC168B5829BB5263 uuid:6355C15346DFDC11A214AD89929E38D3 uuid:6367FD463646DE118E05E00A924D8CC5 uuid:63C475A288ED11DEB3FFF614CCD16C87 uuid:648255D889CFDF11A1D8E4A4F489C6F9 uuid:65A58184AD03DF11BA1CFE2E2459F90E uuid:66211d2a-e75a-6349-9313-114dc4ac619f uuid:665D5C43515DDD11ABFDD4D30129E755 uuid:667885ABEAD0E1119C6E88955B330D71 uuid:66E770C8D883DD118567FD7DB7D1FB68 uuid:674D5E42B2DEE011B945C4A423A57949 uuid:67BCF230F7A1DB11AECBF85849BD86F5 uuid:68B73160563E11E0A57A92CDC08EBFDC uuid:68DDFCCD377FDD11958095E49FBC919E uuid:6922E29B5985DF11B4779C1A60E25466 uuid:693BEA6CB8A6DF11A082860CFDE3F28E uuid:6A51460EFCEFDE11A35CD3D8F4849AB1 uuid:6A6D4B9DD3BBDE1183F9F5180F278EF5 uuid:6AD4462FB204DD11A4539B8A658B95AB uuid:6B26E6F714A3E011B8F2B39CADF8C7BD uuid:6B4D5E42B2DEE011B945C4A423A57949 uuid:6BD6CAFDC3E7DC118D17CCC8742E2E78 uuid:6C1CEE99FF0CDE118B60808686D1CDA6 uuid:6C707EB54C4EDF119BF69F5E7CC385D4 uuid:6C875D7786AD11DBA35CA8F2CCD0B6EC uuid:6D2D16B0565211E0A57A92CDC08EBFDC uuid:6E47E0D0A3C911DD990ED023CA6AD342 uuid:6EDB09A4EF99DC119FDAE1E6C9E90D52 uuid:6F0C51E18A5FDF11B6C6A84C08FFDA77 uuid:6F5C782E2C9CDC11908C9ADAF87FE933 uuid:701F0AA1DC0FDD11B6B0DA6D17610842 uuid:71B724FCE7D1DC11AB7C8BDDCD744643 uuid:7222A0DBD298DC1182C6BEF4D19F3EF2 uuid:724842380D8DDE11811AE89A4C637779 uuid:72AD3ED38871DE11907DD58D2A428021 uuid:735432F83446DE118E05E00A924D8CC5 uuid:742FDDCAF0BF11DB96ACAB58D2874C3B uuid:746583581EC811DEB82CD8B338B01D3B uuid:748FBBC54761DE1199DC9982344E391A uuid:75889B152262DE11A72AF16963CD89BB uuid:758F019E77E011DCA16D9AD07F3E4EB0 uuid:75BA6EE02846DE118E05E00A924D8CC5 uuid:75DCEEF5501BDF118174D58534E02F48 uuid:75E80B316579DF11A939CB8B2C636ED9 uuid:75ad37b6-8a37-4fcd-a4fe-26f1aa1f11ab uuid:7726580E30E0E011A0DFF1A921A77D14 uuid:785BF1A33D44E01196A9FDAA302A4A52 uuid:786CC4073C01E011B40E84D550759E70 uuid:787B3D0F0C07DF11BF3BE2D4EE658A9A uuid:78948929B329DD11B93AF0E4356E33C1 uuid:78BDAE073DD4DD119574E49260AE7023 uuid:78E06230DE31DD119D9293E81F0F46B2 uuid:79D399B24B31DF11B87EB9B2F774C66B uuid:7A1A8CDA6753DE11AEE6B02826E52418 uuid:7A249F7BFEACDF11BC6E8D04CFB3FC6C uuid:7A53A07034E0E011B6EAB49C9ED7F21C uuid:7A7765743160DF11B7058CDA462E88D0 uuid:7AC55A0AFA7DDD11BDB4D1FB4F0D7360 uuid:7C0400B9C2E7DC118D17CCC8742E2E78 uuid:7C66DA44A194DF11953AEBEFD43548AA uuid:7D82A4D9F538DF1189AFCD2729466985 uuid:7DCCEB3E9D0DDF118A1BD62C0D068F40 uuid:7E53A07034E0E011B6EAB49C9ED7F21C uuid:7EB569DB4D83DF119319B163B01C38B5 uuid:7EBAC78415A3E011B8F2B39CADF8C7BD uuid:7F5CD1D0302EDF11A06B87AB6D5393CF uuid:801DD6C6E1DCDD11850FE2C9B83E74BC uuid:80DECBBD2846DE118E05E00A924D8CC5 uuid:823002034C69DD119C1F8E912965B471 uuid:82B09529C90ADF11823FC380DCAC210B uuid:8418B9F71B19DE11ACD1FD0D79D1C48C uuid:8426B111521BDF118174D58534E02F48 uuid:84BCB3D4733CDD11AB1EBF4A6A17D95E uuid:84BF1E98A360DE1194C18245487266E3 uuid:8631318ED591DE118BB0E5D058A15FA6 uuid:863D29600E91E011B7E2BA43D2041D1F uuid:86931125389ADF119BE6A44B39062E37 uuid:86CECBFFD057DD1195779C82C766E2BF uuid:871A6276F573E011AE93F71A5E985A91 uuid:87DD43522302DC11ACBFC215FBEC85FF uuid:88218060511BDF118174D58534E02F48 uuid:88682ECF5FDFDE11B366D9EF74DE4B3E uuid:888EFC12BBA4DC11A788F61F464F954C uuid:896C0FCBDA32DF11A473B21C49D1757E uuid:8998E2FC5D81DE11AB10E18A368CBC72 uuid:89BB70853646DE118E05E00A924D8CC5 uuid:8A8991253246DE118E05E00A924D8CC5 uuid:8AB3B33B3292DC11928CDAE88FF0982B uuid:8ADA5CACA94411DBB26D8C0280FD469D uuid:8AF0B2828F81DC11A53F84F58E6BA9AD uuid:8BD313481D31DC11907BBCD0C2EDFFE8 uuid:8C632C6BE825DA11BB67F40C32FA7FCF uuid:8C8B4F317E1ADF11BABCD74472CEE0AE uuid:8CB31ECD3546DE118E05E00A924D8CC5 uuid:8CF6F94AEE4FE2119D64B0A448181B33 uuid:8D62E5C5F946DF11A1ACBC2CD660C212 uuid:8E3257BC3446DE118E05E00A924D8CC5 uuid:8E4A02013946DE118E05E00A924D8CC5 uuid:8E77239FAC2AE11182A8F2C69689AB64 uuid:8EF58BA46E66DC1193F48773309C9D8D uuid:8FE1F95A9541DE1187A3B63AEC670B7F uuid:905423059AE9DA119E84CAF24BDD6066 uuid:90A480022946DE118E05E00A924D8CC5 uuid:90ADF7D5398A11DF86119436A17CB227 uuid:90C4C16F24ABDD11BC05B48537EE3891 uuid:90DBC697B2AFDE1182E898E4D7E7240B uuid:91BB70853646DE118E05E00A924D8CC5 uuid:91C6B9DD7D1ADF11BABCD74472CEE0AE uuid:91EE4D01FDA9DD118555BD7879927BCB uuid:920948E8D2A3DF11949EEA82414C67FD uuid:92108B13A540DE11A29DF00ED4C1B727 uuid:9328FB1C2246DE118E05E00A924D8CC5 uuid:93312F3A9EABE011BB42E88B754C4AEE uuid:9369042C2F46DE11BD9EE5A6639A625F uuid:93B74885F527DF11881EA6879E79C74F uuid:93E8AD8CBD32DC11BFE2E5D6CE581572 uuid:93EAD89D899BDF11AE2DCAA2C8CB51A4 uuid:93F0839448B2DE1191C3C665BC9BDA99 uuid:94B31ECD3546DE118E05E00A924D8CC5 uuid:952A33247B74DE11BBA19E5AEE919C47 uuid:95C5C57C521BDF118174D58534E02F48 uuid:9603F6864F22DF1191BA98E3D07EA6E2 uuid:964D6FC3F9F3DC11B7B787F67A8DC675 uuid:976501A145A6DF118EF0F8A0A306590B uuid:979E80F12C46DE118E05E00A924D8CC5 uuid:97E23D2C4B12DF11ADBDB3D48DA81215 uuid:982703D5AFDEE011B945C4A423A57949 uuid:98286303A71FDD11ACEC89ACF33BCD0B uuid:98624FB17A0611DB90E7A8A6B33DDE8F uuid:98A480022946DE118E05E00A924D8CC5 uuid:997168516F27DE118DD28306BA0AD781 uuid:999D0ED6592CE011875FEC74EAED3B90 uuid:99A724EF2246DE118E05E00A924D8CC5 uuid:99BC43C5789DDF118943EC7D2E89C0BA uuid:9A4E3BC73346DE118E05E00A924D8CC5 uuid:9A7015542E46DE118E05E00A924D8CC5 uuid:9A852FC218CADC119D59B5BD9DB71E82 uuid:9B8169013A6CDB11BEEFDD803C4CB37F uuid:9C427F29C23BDE118624AC3C981C00EB uuid:9C4C17673BB5DE11809BA989B0D77432 uuid:9C6B168B2263DC11A938D0D477F76208 uuid:9DC3029D1D46DE118E05E00A924D8CC5 uuid:9DCFFAE96350DF1198DBAA6ABC516A5B uuid:9DD593BF31BB11DEB3BCC14406C17F6A uuid:9E17A4246AEEE011A3E7C1FE0481E6CD uuid:9E27DCC8DD70DD11AFB2FB57BC79BEFD uuid:9E36763AB81CDF11A4DFDAC2607E8880 uuid:9E393079ED09DC119950AA34618C8687 uuid:9E41B67C0FDFE011B872DF47B34C9F1C uuid:9E749DEB31BA11DEB3BCC14406C17F6A uuid:9ED58FA75D9BDC11A06AF98D3B9E72A9 uuid:9F71A1DF3646DE118E05E00A924D8CC5 uuid:9FF76A7D9582DE11BB37BEE3126CDD63 uuid:A03CCF649B0EDF11A0D29729EA0AB6B0 uuid:A0D36E10BEDFE011AE6BCFD5A31C68AD uuid:A114E296DF15E011B51784A64D80A595 uuid:A18701B4B2DEE011B945C4A423A57949 uuid:A235FFA43633DD11B84DB153FFCB2B25 uuid:A270FE72B2DEE011B945C4A423A57949 uuid:A3233D7639A0DD118C4EB1D76F20D61F uuid:A3A81857CEB6DF11A9D8F81D08128070 uuid:A3CFFAE96350DF1198DBAA6ABC516A5B uuid:A3D6B47F18B2DD11919198E04079117F uuid:A4A0074F8101DC11B2DCD85209BF7530 uuid:A4A6D5B3CF6EDE11B59CDBEDD4FA0491 uuid:A52B2BE2D504DE118532A753628E9587 uuid:A52FE0D63946DE118E05E00A924D8CC5 uuid:A6243BD58D77DD11AD11D198EF8B0946 uuid:A6359C7E140ADC11A2DAA4D78F509131 uuid:A66D327A3BBF11DC8215ADC1775D44BC uuid:A6B8A16E3BB5DE11809BA989B0D77432 uuid:A6B8E3575957DD119F3F8760AB0AA4FE uuid:A76F7547765FDF119F61C543DD152838 uuid:A9005AAE8A7FDF119CD6A0C6AE1D8074 uuid:A98FCD856D55DF11BA0E9527DA9EC859 uuid:AA8E7E94A00EDF11B1CCD399BC96A2AC uuid:AB0C0C914333DF11A8E6A38A5488C1F3 uuid:AB548945339ADF119BE6A44B39062E37 uuid:ABC988A0D0C3DF1181D8F87795C0EBDC uuid:AC7E2C1F2747DE11AB48C7C86FE713E7 uuid:AD821971DBB1E01196138AFFE013C41F uuid:ADB8A6342EE0E0119500C872373672E0 uuid:AE02AF60883FDD11AC2BE9025EE1BBF9 uuid:AE363A6BEA4EDF1192DBF5680431570F uuid:AE5BE486BF77DC118A089E5735CF5EB9 uuid:AFE5E935C3DEE011BE5CDB1A796662A8 uuid:AFFEB253AFFEDE11A592862C0BC3D959 uuid:B00D84D55063DF1183BD84419D5831DE uuid:B01BB22766F8DA119EB1D1E45291D5FA uuid:B118FD9C3446DE118E05E00A924D8CC5 uuid:B48CC374F6E2DC1193D6E593F704EF94 uuid:B4EC9A2F511BDF118174D58534E02F48 uuid:B5F9259082C111E0A2268145FEAA7380 uuid:B7F8325E92B711DCAC0BD7CFBA286A6B uuid:B7FA54C069D3DC119030EB72FE5773AE uuid:B850031313CDDD119358D3EBF934974E uuid:B854A2A773DFE011A3EAB924634D1234 uuid:B886F63C4E62DE118924E4732F4AFB5E uuid:B8DBE641D274DC11B15CC929E0BBB1F0 uuid:B93D03A93346DE118E05E00A924D8CC5 uuid:B971000E3AE0E0118D54AF7EA314E301 uuid:BAA5CD7B8DAFDB11BB67B9E1DC4CE7A2 uuid:BAAF5DE4E21C11DDACC5B29D9085C55A uuid:BB1EF37481E8DC118DF8881DDBB15AA6 uuid:BC1357D69796DC118AF8AC23B60971C1 uuid:BD5AFE0931BA11DEB3BCC14406C17F6A uuid:BDE7D3ADA44ADD11B942826B91B46D31 uuid:C0599F3447CCDC11824DE83F3063EB00 uuid:C0AF6874BFFEDE11BA268E9760F6C405 uuid:C494ABFF2944E211B900832EC089AFA0 uuid:C86C30CAF7B5DF119A7FC51EFA65364E uuid:C8E2FDA62246DE118E05E00A924D8CC5 uuid:C8FFC71C31A9DD11B70DB0CF0BC9EDCD uuid:C95F8E93E1ECDD11AD81A1AB84D405B4 uuid:C9E6670A7191DD11A3FAF2032831011E uuid:CA4E034E7E1ADF11BABCD74472CEE0AE uuid:CC18FBD9041CDF11ACEBF49C1510D7E2 uuid:CD8BCACE98BCDE11AE26F9D1FD1B7E18 uuid:CE5A4F4F5DB8DF11A53AA0E9AB1C70AF uuid:CE850F17235911DDB8A999939B027CA1 uuid:CECC404C96BCDE11AE26F9D1FD1B7E18 uuid:CEEBB5CC348DDC1191489627CE433B2D uuid:CF5479BA31BA11DEB3BCC14406C17F6A uuid:CF5F4C02B4B3DF11BEE9D23A73828232 uuid:CF8E06442746DE118E05E00A924D8CC5 uuid:D151FA895E91DE11BDF1967A9D5E1EC3 uuid:D1DE550983DEDD11B182D5DA082F73C9 uuid:D27447C06783DF11A419DA8530481AE5 uuid:D2EBAF8C9303DC118103AC75D3E1885B uuid:D371356656E1DB11A1EDB8C01A221B6C uuid:D4D29E8CE37DDD119CA6C60CABE7E84D uuid:D5A43BCE2446DE118E05E00A924D8CC5 uuid:D62220B4D76BDE1185E2922F624AD9E5 uuid:D623E2FCCB44DF11A659990446779642 uuid:D6EF40FB5568DF11AE2DDE167B97FDBE uuid:D72377749B34DC11AFE894FD60CC29BB uuid:D76A99DD2D46DE118E05E00A924D8CC5 uuid:D883139A2F46DE118E05E00A924D8CC5 uuid:D8D88832C306DF11AF8AA587C3C1C2B2 uuid:D9C0F8FB9C90DE11AE0AC26550418DE9 uuid:DA29F8D63833DD11B84DB153FFCB2B25 uuid:DACB42AC0D57DF119E6183A921B60F6D uuid:DC4C48BEE80EDD119117B0EC9223F3FB uuid:DC4F5882B0E9E011B3269AB1C0356EB4 uuid:DC8074239110DF11856FF25F8996A646 uuid:DCAF95EF5418DC11991D9081DD0FA550 uuid:DCF2F321362811DCA14E914CEB339C56 uuid:DD3643D13746DE118E05E00A924D8CC5 uuid:DE2B51B51DDFE011B872DF47B34C9F1C uuid:DEA145090A4BDF11BF52B811BBA0F62A uuid:DF3E6C248070DE1182A4E4822D1896D0 uuid:DFFAC8748B60DF11A5D6C5494D1F118F uuid:E0FEFDA0DE26DF11925DB7C100A3E828 uuid:E17A1128166CDF11A85DDBD0BB17D8AD uuid:E1EFA889B9B2DE119ADAFFBED641D007 uuid:E37FE4776651DE11B0FF904ABD7E9C78 uuid:E4B7DEE9001FDF11B6BDAB31141CBAD0 uuid:E51D53285CF7DE11BAA3858EFB8697A5 uuid:E5D64E1F241311DDBF50C49E22072263 uuid:E5F4A87305CBDC11860BDAD4ECA0DB8B uuid:E687B8E3F9ECDF11B076F4C39C2F9754 uuid:E710B34B5B4EDD11AB3CE178BC4308B3 uuid:E726AB67A1D7DE11A1AE8A388BF11FDB uuid:E752405CD502DC1183F88C80D133AE02 uuid:E79A4A832DE0E0119500C872373672E0 uuid:E8711942FCD9DE11BEB2B63538B485CF uuid:E8E53D5DDD52DE11A63583E5225DA4A2 uuid:E97F51296D0ADE1187DEC54A1F42F690 uuid:EB01B3383110DF118ADBB50293FFA6F8 uuid:EB69B1888606DE11B380C9DFFF5EDB6B uuid:EC015C3A8574E11180B99F23AE58726A uuid:ECB78735274DDE11B01EEA9B67CC9BAE uuid:ECE2612CF702DC119927C0AD4422C47F uuid:ED8D85735E42DD11A1DCD26843D97074 uuid:EE8CBA0F2D46DE118E05E00A924D8CC5 uuid:EEF7F16FEF89DE11B1C4D65EF43688A3 uuid:EF9A4A832DE0E0119500C872373672E0 uuid:EFE92B5982DFE0119780E3E617CFD216 uuid:EFED9F6D3BB5DE11809BA989B0D77432 uuid:F0D3FF33AE63DD11A1C8DBED5B6F2ED7 uuid:F10C79062C46DE118E05E00A924D8CC5 uuid:F2652DC558E1DB11A1EDB8C01A221B6C uuid:F331D6A9AE00DC11ACAF98334D040065 uuid:F3F7568A445BDE1184E2C3A479231CEB uuid:F4BCB835CD84DA11AEE3C92BF541D7B5 uuid:F5E54A230C69E011BAE4A0F3F205CB0C uuid:F626B67D8860DF11A9018B722DA7EE55 uuid:F68CBA0F2D46DE118E05E00A924D8CC5 uuid:F76F71AE586DDF119ABBECCE6851D422 uuid:F81E9BC9978ADE1196A0EFF950960E15 uuid:F87C837D9769DF11ABBAC37B0CF877C5 uuid:F8838F0B3646DE118E05E00A924D8CC5 uuid:F8C8948B2946DE118E05E00A924D8CC5 uuid:F97486C1E24FDF1183C7996710D099DC uuid:F9C28AB70279DE119AF4C11AE6D6D880 uuid:FC6284395CDFDE11B366D9EF74DE4B3E uuid:FCE867DF3272E211A33A8755952F88B0 uuid:FD3CAB94E740DF11B86BCA79B8B8B185 uuid:FE4E366D55EBDE11B73DBE257B556A3A uuid:FED7768A2A46DE118E05E00A924D8CC5 uuid:FF79D4767969DF11B0C7F2016358B619 uuid:FF9AF64D0C39DF11BF8393223FA3F19B uuid:FFE4355518A1DE11B97A955C1491AF1F uuid:faf5bdd5-ba3d-11da-ad31-d33d75182f1b xmp.did:006B7D713E266811910997920F9A7541 xmp.did:00801174072068118083885AD9345809 xmp.did:00801174072068118083BAFDA65F8430 xmp.did:0080117407206811871FA882204C4943 xmp.did:008011740720681187E6D3F1FEEE7E61 xmp.did:008011740720681188C69E72FB9C9FD5 xmp.did:00801174072068118A6DC339C638C22A xmp.did:00801174072068119109D0F9CCA25A5B xmp.did:008011740720681192B08162DEA350D1 xmp.did:009CBBF21FA4E011B882E5809DDE5B73 xmp.did:00EE06B326A4E111AF47D84B5110F70D xmp.did:0153B9CE159BE011A42DEC14C3EFCAEC xmp.did:0180117407206811808388714877E726 xmp.did:01801174072068118083A3AD73AC711F xmp.did:01801174072068118083C4FE05237EAC xmp.did:01801174072068118083F8C3CE47E75D xmp.did:01801174072068118083FA9F955E2000 xmp.did:0180117407206811828A9C07725CD1BC xmp.did:0180117407206811871F8EA3F2A2AE1D xmp.did:0180117407206811871F9B09294944B5 xmp.did:0180117407206811871FA7DDB6344DDF xmp.did:0180117407206811871FB222890A0E4A xmp.did:0180117407206811871FB6D45CC9A53C xmp.did:0180117407206811871FC852CC88A456 xmp.did:0180117407206811871FDB7C73EC7AF4 xmp.did:0180117407206811871FDDF97733816A xmp.did:0180117407206811871FE8DD2340C0B0 xmp.did:0180117407206811871FE9333920AD6A xmp.did:0180117407206811871FF1961D211D67 xmp.did:0180117407206811871FFBB65EC420B1 xmp.did:0180117407206811871FFFE0F6FD6607 xmp.did:018011740720681187E2AD1A500D39E0 xmp.did:018011740720681188C684EAF6EB3EED xmp.did:018011740720681188C68CC6C803710E xmp.did:018011740720681188C6A2A17C791225 xmp.did:018011740720681188C6C612837B0247 xmp.did:018011740720681188C6C8FB64E3077F xmp.did:018011740720681188C6CD649893B632 xmp.did:018011740720681188C6DEB6A7380E02 xmp.did:018011740720681188C6E4708E0E2747 xmp.did:018011740720681188C6FD88E3797378 xmp.did:01801174072068118A6D856087352BA7 xmp.did:01801174072068118A6D894AE997EB0E xmp.did:01801174072068118A6DB6C7EBF6AD02 xmp.did:01801174072068118A6DCC78F8DCE567 xmp.did:01801174072068118A6DE6B814766CDB xmp.did:01801174072068118A6DF13459D8D59D xmp.did:01801174072068118C1495187346E998 xmp.did:01801174072068118CE8FAB7EAEEF1DA xmp.did:01801174072068118DBBB0B046013550 xmp.did:01801174072068118DBBD7411B5EC877 xmp.did:01801174072068118DBBF67CC7525F38 xmp.did:01801174072068118F6281652F82AFE6 xmp.did:01801174072068118F6283F08ABAE4B0 xmp.did:01801174072068118F6284B29ADFCC43 xmp.did:01801174072068118F628DC2429FD647 xmp.did:01801174072068118F62C5774A079733 xmp.did:01801174072068118F62DBC328695FC3 xmp.did:01801174072068118F62E2D7B95B1B14 xmp.did:01801174072068118F62EB2ADE46D273 xmp.did:01801174072068118F79B7473C32B448 xmp.did:01801174072068118FBC9421557B7B20 xmp.did:018011740720681191098FD20CBDF1C4 xmp.did:018011740720681191099C046A8759D2 xmp.did:018011740720681191099F8626CB41AB xmp.did:01801174072068119109AC6131693E65 xmp.did:01801174072068119109B5666CC87C3E xmp.did:01801174072068119109BD18F96FE5FE xmp.did:01801174072068119109C37490BE3834 xmp.did:01801174072068119109DA99C2E792B3 xmp.did:01801174072068119109DAEE9E19A282 xmp.did:01801174072068119109DDF6FAAF36D2 xmp.did:01801174072068119109E22328FDF13B xmp.did:01801174072068119109E8810C5BC784 xmp.did:01801174072068119109F305646EB57D xmp.did:01801174072068119109F981883825E0 xmp.did:01801174072068119109FA297A7A5904 xmp.did:018011740720681192B08AE26BD827F7 xmp.did:018011740720681192B09184D5478EBC xmp.did:018011740720681192B097F0C9D8B91A xmp.did:018011740720681192B097FB589AB6DF xmp.did:018011740720681192B09C403CFF3A3B xmp.did:018011740720681192B0A5BCFE59DE75 xmp.did:018011740720681192B0B727F2063586 xmp.did:018011740720681192B0BAA904DE0F8D xmp.did:018011740720681192B0D93A7E1A012D xmp.did:018011740720681192B0E8A60AAA7296 xmp.did:018011740720681192B0EA0610751F7C xmp.did:018011740720681192B0F39C7BC094AF xmp.did:018011740720681192B0F77B00BE432A xmp.did:018011740720681192C7D0F81AAEB882 xmp.did:01801174072068119457B5780B4D650C xmp.did:0180117407206811956CDA996C733812 xmp.did:018011740720681195FE85312F4E4086 xmp.did:018011740720681197A5B386C33BAD50 xmp.did:018011740720681197A5CD7DCFD54202 xmp.did:018011740720681197A5DAF2583A0A4B xmp.did:018011740720681197A5F9674A0885AD xmp.did:0180117407206811994CB67047760989 xmp.did:0180117407206811994CE07EFE756DA7 xmp.did:0180117407206811994CEBF7BEB94108 xmp.did:01801174072068119A889F688513D349 xmp.did:0180117407206811A088E49E19740FB2 xmp.did:0180117407206811A610925F68191C15 xmp.did:0180117407206811A7BADF4AD3269966 xmp.did:0180117407206811A7BAE496507CC015 xmp.did:0180117407206811A81C97AE71B8FB6D xmp.did:0180117407206811AB0888EC9D8B85A6 xmp.did:0180117407206811AB08B40A0C00B04E xmp.did:0180117407206811AB08E8E8EE3F0289 xmp.did:0180117407206811AE569E92DE925BD5 xmp.did:0180117407206811AEC7ACE16F2ADB0F xmp.did:0180117407206811B1A481173F3B2091 xmp.did:0180117407206811B34BBA3E1B4D7703 xmp.did:0180117407206811B50CFC9853933782 xmp.did:0180117407206811B6BE96AFFBCEFD7E xmp.did:0180117407206811B901FE6ED6130D27 xmp.did:0180117407206811BA06DE2D23900A1F xmp.did:0180117407206811BEEAF2CDF8DA2015 xmp.did:01BDB8EC4B4011E1B98CEF24291654DE xmp.did:01C668CB2C3A11E0B24BF72F16719A14 xmp.did:01C66F18E5C6E011BEF0A37AC8AFF6B8 xmp.did:01EDA34036EEDE11A8DE8E9B24B12DAF xmp.did:02649246152168118A6DC8429994DB80 xmp.did:0274AA50BBD9DF11BFD1959D5E34049B xmp.did:027CDBED1E37E2118E37E38874568DAA xmp.did:028011740720681180838223AEF978C2 xmp.did:02801174072068118083DFDF36644483 xmp.did:0280117407206811822AD2268457245B xmp.did:028011740720681188C6C9584A0CE4D6 xmp.did:028011740720681188C6EA7AFA84B3CB xmp.did:02801174072068118A6D9937AF694056 xmp.did:02801174072068118A6DE8CC51352B1F xmp.did:02801174072068118A87FFDBA1F29826 xmp.did:02801174072068118BAACF3C48947CCA xmp.did:02801174072068118E8B95801AA5B653 xmp.did:02801174072068118F629EAE88CED33B xmp.did:02801174072068118F62A2F6C51121F7 xmp.did:02801174072068119109906E1CD89C48 xmp.did:02801174072068119109AC6131693E65 xmp.did:02801174072068119109B0F0B9959332 xmp.did:02801174072068119109C13AE0D52ACD xmp.did:02801174072068119109C65A70401340 xmp.did:028011740720681192B0C3F69947135E xmp.did:028011740720681192B0DEBFF74CEF5E xmp.did:02801174072068119457F50BDC4298B1 xmp.did:0280117407206811994CDFAA02EEDD50 xmp.did:02801174072068119DBFAEEF0353CE0A xmp.did:0280117407206811A818A5FA62C0A48A xmp.did:0280117407206811AC988E10CC0CC7E7 xmp.did:0280117407206811B44DF79DFC232CD8 xmp.did:0280117407206811B840C1437888502E xmp.did:02EBADD8BEC5E1119B98D94286F4CEAE xmp.did:03801174072068118083D2748AE39423 xmp.did:0380117407206811871F81E8BB0F82E6 xmp.did:0380117407206811871FFAC63C818640 xmp.did:038011740720681188C6823329C82B91 xmp.did:03801174072068118A6D9937AF694056 xmp.did:03801174072068118A6DE0B43D455FB9 xmp.did:03801174072068118C14A49D02AC9755 xmp.did:03801174072068118C14ED8399FD50F5 xmp.did:03801174072068118F62DFCEF30AAC90 xmp.did:03801174072068118F62FA26B1D2377A xmp.did:03801174072068118FEDF87473FF36A0 xmp.did:03801174072068119109E219C1666972 xmp.did:03801174072068119109F03089D4B9B9 xmp.did:03801174072068119109F416381BA9E4 xmp.did:038011740720681192B08C886B6D489C xmp.did:03801174072068119346F274C058D55C xmp.did:038011740720681194288658274AEA5E xmp.did:038011740720681197238F25F2FFB081 xmp.did:038011740720681197A59FB566CBE17E xmp.did:0380117407206811A237BBC8AE7066D6 xmp.did:0380117407206811A7D4DF8188E07E2E xmp.did:0380117407206811AEE4ECC20A5D0880 xmp.did:0380117407206811B894F2D3850E7186 xmp.did:0380117407206811B8B5B25456C28219 xmp.did:0380117407206811BD209C3F4437B116 xmp.did:04801174072068118083EFB21C9E6096 xmp.did:0480117407206811822AB634F36508C2 xmp.did:0480117407206811871FF0EE6AD5790B xmp.did:048011740720681188C6BBFAF87E6B92 xmp.did:04801174072068118A6DEC27AEB5D46C xmp.did:04801174072068118C14B8B7A921B342 xmp.did:04801174072068118F62DB3F26862A68 xmp.did:048011740720681191098D76C49036E9 xmp.did:0480117407206811910999E172ACEF41 xmp.did:048011740720681195FED5E9D317291E xmp.did:0480117407206811B6188380968D4DC3 xmp.did:04BB01059CF711E08A9C913C073A663E xmp.did:04C7B018AD8BE0118005E62EBF747214 xmp.did:04E55EBD6020681188C6D9EA900BA018 xmp.did:04EE06B326A4E111AF47D84B5110F70D xmp.did:050E6D0F2B2068118083A159441B1002 xmp.did:0580117407206811808387D48DB3A4B0 xmp.did:058011740720681180838D77FED7457F xmp.did:05801174072068118083FCD7EE0824B6 xmp.did:058011740720681180B4DB6FCDC6F1A9 xmp.did:0580117407206811822AEF11CA54EF0A xmp.did:0580117407206811871F834B9271D32D xmp.did:0580117407206811871F9617A759D4E6 xmp.did:0580117407206811891D9A76213AD321 xmp.did:05801174072068118C14A56C815EEBE2 xmp.did:05801174072068118C14B4DD23E1D3A1 xmp.did:05801174072068118F28AC14F3A6738D xmp.did:05801174072068118F628C5BC7FF1E1F xmp.did:05801174072068118F62984C1217D466 xmp.did:058011740720681192B0B03D2B78CFDD xmp.did:058011740720681192B0FBBF273EF816 xmp.did:0580117407206811A440DAC4D3AECDA0 xmp.did:0580117407206811BCD78B457D78A81D xmp.did:05D444BCFE64DF11A64FA7B28D390DE9 xmp.did:0605C7F9D822681195FEA4354762D610 xmp.did:06801174072068118083B98A8E501C2D xmp.did:0680117407206811822AB1921B4CF57B xmp.did:0680117407206811871FC852CC88A456 xmp.did:06801174072068119109B5757D1049F7 xmp.did:068011740720681192B0F8CAB850210B xmp.did:0680117407206811931DB3FBE9BC56F2 xmp.did:0680117407206811935398A7741CF40E xmp.did:0680117407206811A613B4EE39B4D58C xmp.did:0680117407206811B1A48ACCC66BA1E0 xmp.did:069AC01433C211E0AA8582F7083052C8 xmp.did:069E61B2CCB211DFAC2D95EB3860F061 xmp.did:0764F0FC39206811920BD6CB55DF7E21 xmp.did:078011740720681188C696DC609994EC xmp.did:078011740720681188C6CAC5BEF2CC51 xmp.did:07801174072068118DBBE31A192FEEDC xmp.did:07801174072068118F6288F23A50D5DD xmp.did:07801174072068119109DDBC5677155C xmp.did:07801174072068119457905C16F6CCBC xmp.did:078011740720681197F3DAD110AB1D7D xmp.did:0780117407206811994CC7F0B5403F08 xmp.did:0780117407206811A72CF339EEA0CCAD xmp.did:0780117407206811BEB789E23D201984 xmp.did:07A9EBB69ED3E211944AEC6650246579 xmp.did:07D85B194F21681188C696DC609994EC xmp.did:08084073AF60E011AFA79E3A4F01158E xmp.did:08801174072068118083DB8F1A026FAD xmp.did:0880117407206811871FB03D861007B1 xmp.did:0880117407206811871FFE11C8ACA7AE xmp.did:08801174072068118A6DE3227BBC4D54 xmp.did:08801174072068118F628C5BC7FF1E1F xmp.did:088011740720681192B0B191B1BF16B7 xmp.did:088011740720681192B0BCCE1816D9E6 xmp.did:08801174072068119457C4C657E622B8 xmp.did:0880117407206811A195E33BF38323D9 xmp.did:088D6ED2437011E088D29E4C0233231A xmp.did:088F6FA571206811808383758E6AB92B xmp.did:092C276A5DF411E0A80E8127450A213E xmp.did:0980117407206811871FD8AA5A0491ED xmp.did:09801174072068118C148FD8AA42D93B xmp.did:09801174072068118C149339A6CC4AB2 xmp.did:09801174072068118F28AC14F3A6738D xmp.did:0980117407206811994CE07EFE756DA7 xmp.did:0980117407206811AEE4ECC20A5D0880 xmp.did:0980117407206811B1A4F894E8A7A910 xmp.did:09B542E7BA21681188C696DC609994EC xmp.did:09F76F48C3C7DE11925FE106D59B22C8 xmp.did:0A368DA92F39E0119258DF6378E0E372 xmp.did:0A45DB531F206811871FBF7EE03058F8 xmp.did:0A483A276D2068119457B4E8E216C3A8 xmp.did:0A80117407206811871FBF7EE03058F8 xmp.did:0A80117407206811871FF47DC91DE11F xmp.did:0A8011740720681188C696DC609994EC xmp.did:0A8011740720681188C6C5D9DC520BD2 xmp.did:0A801174072068118A6DC5C740EBC4EC xmp.did:0A801174072068118F62E601B48A9F82 xmp.did:0A80117407206811A613B4EE39B4D58C xmp.did:0A89FF8AE8A8E011A816A106ECD60EAD xmp.did:0AC317AD1A206811871FBF7EE03058F8 xmp.did:0ADB599167FFE1118B1EEAD46BB4F8D0 xmp.did:0B45DB531F206811871FBF7EE03058F8 xmp.did:0BF11FD1DE22DF118E04DE7FDFD8DEB5 xmp.did:0C0EFB7E5C99DF119F378A3C59214966 xmp.did:0C3F353F2167E2118D30DED9691A214B xmp.did:0C45DB531F206811871FBF7EE03058F8 xmp.did:0C483A276D2068119457B4E8E216C3A8 xmp.did:0CCF6644C8A6E011979696CECC20A286 xmp.did:0D18F7379D3EDF119B20E8B33AC24173 xmp.did:0D34739667206811871FBF7EE03058F8 xmp.did:0D3C41E10BBCDF11B749FA66D2EDAE0E xmp.did:0D9A9BFCEE7FE01182DFD33A26DD6908 xmp.did:0DC2B982FBA5E011A4FEE67DFDD7FB36 xmp.did:0E2330CF1D206811808394B683B79160 xmp.did:0E2383CC272068119109827B1118762F xmp.did:0E2AC53BD72168119109CA2496A1ABE5 xmp.did:0F30D59357C8E011BEF0A37AC8AFF6B8 xmp.did:0FC317AD1A206811871FBF7EE03058F8 xmp.did:100823B1CB0FDF119A0D9CB73A16B779 xmp.did:1085A4F83DD011E0A5E4E63061587FB7 xmp.did:10C249B651206811AE568088196B6FA8 xmp.did:10CF6644C8A6E011979696CECC20A286 xmp.did:1134739667206811871FBF7EE03058F8 xmp.did:119A01FA9E2068119022D6BA6E344F5A xmp.did:11CCEBCD14A9E0118060BA4CC79A319B xmp.did:11FB407FDBE5DF119CEFD33EC3DF08E5 xmp.did:1282A8B04D7611E19390BDCF62603736 xmp.did:128BC47B2F20681180839613FFBBFAAC xmp.did:12B6375A0E206811822AAEB57B3841C0 xmp.did:12D5329AFEC7E111863086AF44B50601 xmp.did:12ECDFCC6918E0118317A5126B184C9C xmp.did:130F0792073711E2A496EA31311299BA xmp.did:13B748432EA2E0118D04E5AB37155918 xmp.did:13ECBBB17E1CDF118D4EF1C33EDDA687 xmp.did:1437CB2E34E9DE118EC4B76DFBF31F4B xmp.did:1439D15279D511E19671E44CBD77ACF2 xmp.did:144C62F9830311E0B62FB7127DA0FEAF xmp.did:146C32C21F2068118A6DB4DDC650E5F6 xmp.did:149AEF289F20681192B0A9A85A8A7D16 xmp.did:149C8558F373E0119389FF7D0DABFC0C xmp.did:149C96F760EBDE119BC8F1569F9CED01 xmp.did:154F526AB7FCDF118B1C8E78BC400721 xmp.did:1588ABA64B7EDF118BB3FD3FFFE50FBC xmp.did:15C2C46649B2E011BC4B89489F74C31C xmp.did:15C9895284D3DF11B5A1BCED77057419 xmp.did:1630586DC9E3E0118D4BE9BCF87F398E xmp.did:168BC47B2F20681180839613FFBBFAAC xmp.did:16B5EA561C21681191099A139FF76C18 xmp.did:16CA07E609B011E28169E3EC62F75B6B xmp.did:16CE2978BF2BDF11B1C9D5AA7FB5335E xmp.did:17385DBEFB20681188C696DC609994EC xmp.did:174FAB68C1B3E0119D60EAD8B0E55DEB xmp.did:176A42696DCCDF11B4C780F3440113A1 xmp.did:17D4795219206811994C9AA37B1758FD xmp.did:18407EA49F74DF11B9ADF501B1FEEC5B xmp.did:18503ACC11206811A7BADD5938E42519 xmp.did:1887D09300216811A056AC0239505D2E xmp.did:1898268C5597E0119487CB48DC3DD8DC xmp.did:18A6A5FAB913E01180DACEB1E4B080FC xmp.did:18AE44CEC0B7E1119D49E3B95737C8E4 xmp.did:18E040BF726B11E096478444BF297328 xmp.did:18F1103E54C3DF11AAE49CD88AA644AB xmp.did:18FE1CEEFD20681188C696DC609994EC xmp.did:192D77D2771011DFA0818C96C5DDB083 xmp.did:194993840129E1118B6683AB8BA184CC xmp.did:194FAB68C1B3E0119D60EAD8B0E55DEB xmp.did:1990B25A12216811871FAE052E76F513 xmp.did:19AC502341206811808386281F38E783 xmp.did:1A0AA41B6576DF11A0EA8D814D891314 xmp.did:1A4FAB68C1B3E0119D60EAD8B0E55DEB xmp.did:1A6A210EBD21681188C696DC609994EC xmp.did:1A87D09300216811A056AC0239505D2E xmp.did:1A94536A323A11E0A7B8D76BEBDDFBE4 xmp.did:1AAC8D2DA296E011AFA59308968A047F xmp.did:1AB777227629E0119AD1B945C1964BAE xmp.did:1B1EFFEC6313DF11A719F1AF52661082 xmp.did:1B2999A3ADA1E011874FF440FF7753C4 xmp.did:1B4FAB68C1B3E0119D60EAD8B0E55DEB xmp.did:1B61A465988DDF11B96ADBDD437880CB xmp.did:1B8BC47B2F20681180839613FFBBFAAC xmp.did:1BD6A30692A8E0118BA8F2782CB3F003 xmp.did:1C01C42FF620681188C696DC609994EC xmp.did:1C03146227226811AF6F8C15B6994DA7 xmp.did:1CBB581A2D2268118DBBFC31635E93B6 xmp.did:1CCF6619A3A8DF11B402D829E1AF718C xmp.did:1CFE1CEEFD20681188C696DC609994EC xmp.did:1D012E9EC9C3DF1190EED90E3B79DA34 xmp.did:1D06EF8E726B11E08CB3DF7C657CD3E9 xmp.did:1D2B29771E28E211B066F17E0191D7A7 xmp.did:1D51DAA7222268119109F828D8DAF436 xmp.did:1D541901DF4BE011B3A2B8E9249F1B48 xmp.did:1D6E4373AC5FDF11A68ED251FF23EC34 xmp.did:1D794D3196A0E011BA5FA492FDC2C4B6 xmp.did:1DDB5A635CD9E111ADE6B0E234903112 xmp.did:1DED8CFF57BBDF118185E1BC98F91251 xmp.did:1E01C42FF620681188C696DC609994EC xmp.did:1E059DA44734E011AD25903082F159FB xmp.did:1E7E6F2C19E8E1119DFDF0AAA80BF1AE xmp.did:1EC0AD1472DFE011BAC7F7CD194FE1BE xmp.did:1EFE1CEEFD20681188C696DC609994EC xmp.did:1F7560349B4011E192EFD39D50A0C01E xmp.did:1F7560389B4011E192EFD39D50A0C01E xmp.did:1FE3A640427AE011A4D3C40ADA3B0913 xmp.did:1dc90e95-4b92-f94a-ac77-2889352f001a xmp.did:20954B6E3791E0119DE0C72DBAF511EC xmp.did:20B881312B20681192B0EDAAC00D9FEC xmp.did:20BB8F69102168118DBBBB77ECE750CC xmp.did:210C18881B21681188C696DC609994EC xmp.did:213D01546D8911DFBDD584DDC8C95BF8 xmp.did:21491BAE758111E0B7A8BCCDCED631CB xmp.did:215D6A12242AE1119583FD4A981E0514 xmp.did:219911BF2F6BE0118B53B756951DDF56 xmp.did:21BCF77D6204E2118B88C0833978F058 xmp.did:21E4C91A9F9EE011ACA098E241098547 xmp.did:220C18881B21681188C696DC609994EC xmp.did:2325628D6A59E011A4FAF43FA448DE9C xmp.did:23301B1D792068118083982FE4C6204F xmp.did:233270CDBA206811BAC7A817D1EDAD8E xmp.did:233CDBFC62BFDE118D6FB67E48281758 xmp.did:2425628D6A59E011A4FAF43FA448DE9C xmp.did:249077570A206811910986D9CD6AC386 xmp.did:24DE300A77FADF11957CB6C8F2BB99C0 xmp.did:250F37FDBE65DF1196A2E5386EB7EFBF xmp.did:252A728E65BBDF11B714F0C6E94ABD01 xmp.did:253270CDBA206811BAC7A817D1EDAD8E xmp.did:25481FF6A7206811B560FCE792BD8256 xmp.did:267A70FFD257E011A551F15593603B5A xmp.did:2749DAC169E0DF11BAE2A9F4FA1C730E xmp.did:27C109D5ACDEDF11BAACCFE187E6E735 xmp.did:282F44E5EFE9DF11A2C6F6A60B573B0E xmp.did:2868824E9A24E111AC0CEB2D40DBE528 xmp.did:2877DFF125206811871F92C91D0752B0 xmp.did:28B3672D7767DF11B32EB6BE29A22260 xmp.did:28EEA9B79AD5DF119648F8511B7417D3 xmp.did:2928DC004423E01199ECC9B0A3B730D7 xmp.did:29339019AE55E0119C03A862C7BF6F88 xmp.did:295BA0A36A76E0119CA1815ECAD13ED2 xmp.did:298B4D5D11206811920BD6CB55DF7E21 xmp.did:2A2118970D2068119109FC901257E622 xmp.did:2A3D854F0A2168119109FB109986C91C xmp.did:2A7A21AD11216811994C80DBF724891C xmp.did:2A8DADA9201EE011842A99364FEBD0F6 xmp.did:2ACF258E325DE011A1A5CBD15F1C5D8A xmp.did:2ADE300A77FADF11957CB6C8F2BB99C0 xmp.did:2B0FAC131420681188C69B8C88BD3CC1 xmp.did:2B2824FB28206811822AFB3366404E54 xmp.did:2B47F7FACE8311E1A4CCB1433E3CE3F6 xmp.did:2B49DAC169E0DF11BAE2A9F4FA1C730E xmp.did:2B8CEC4A9C5BDE118525ADA73261E261 xmp.did:2C46390A7D4911E0A66DC919951D3F2B xmp.did:2C514E4873D111E0B183883F507A6AA6 xmp.did:2D0FAC131420681188C69B8C88BD3CC1 xmp.did:2D49ECD639CEDE11AC1FBF9D231E361F xmp.did:2DA2E4C6F3BCE011B0BBD5E3244285CA xmp.did:2DF8BDAF08206811A056AC0239505D2E xmp.did:2E229BE45760E0118647B4BD29669B78 xmp.did:2E53E9854520681180839B699B907CBB xmp.did:2ECF258E325DE011A1A5CBD15F1C5D8A xmp.did:2F0FAC131420681188C69B8C88BD3CC1 xmp.did:2F290AB9132068119109C80A4C3147BC xmp.did:2F9782BF00C8E011BEF0A37AC8AFF6B8 xmp.did:310FAC131420681188C69B8C88BD3CC1 xmp.did:31552C38272068118A6DC2EB5CD0A707 xmp.did:31C6EDB7352068119109A05ED6E5C9B4 xmp.did:321F17924B3268118DBBBFECFBC2A23E xmp.did:32DAAC512520681192B0BE8DD628D238 xmp.did:32F018B31320681192B0C09A9F8F6D74 xmp.did:330FAC131420681188C69B8C88BD3CC1 xmp.did:331A1DE61120681191098946CB8DAAB6 xmp.did:332CDACA9F206811994C8A8243CF6DD5 xmp.did:340EF1E17A20681188CCC0301896C619 xmp.did:34171119382068118F62CFDF647A2B49 xmp.did:3424F194212068119457A748E286EBA1 xmp.did:3430CAFA0B2068119109A05ED6E5C9B4 xmp.did:3469A8DF112068118DBBCC81981F930D xmp.did:3516E9E994E1E2119625E9EBA0C6BB67 xmp.did:353C7E32B620681192B0FA0C0917E462 xmp.did:355FC8B3671FDF11BBA3AE65F667B488 xmp.did:35E359430B2068118083F09DAD716619 xmp.did:3604BEC6044DE211AF57E606ADDDD0FB xmp.did:36142865952068119109E554154D32B1 xmp.did:36232F4D813ADF11A89FA523901B3490 xmp.did:363A8F868D206811BA24F97E9D027B47 xmp.did:36750d82-6ef4-cf46-86db-3a8aba33e5ad xmp.did:36AF18290C206811BC56E1514E765539 xmp.did:36C863DBD4DAE1118CC1E0C7CE6212AF xmp.did:37108FD0D25811E08013A15AD7E5F089 xmp.did:3777AD23C143DF11AF0CE727C9EFF862 xmp.did:378FF16EB8A8E011A816A106ECD60EAD xmp.did:3804A6C3B853DF119FF2EB1981619B1F xmp.did:381562C4082068118083FEE20518A8E1 xmp.did:38157EBE224FE011B047D7F07BD7BBC0 xmp.did:381BE30EE535DE118F219ECC9DE4732B xmp.did:382F6AAEE32168119109CA2496A1ABE5 xmp.did:3888163F0820681188C6D9EA900BA018 xmp.did:3892E408BD53E0118E47D5B457BBAED7 xmp.did:38A0129A8F21681192B08499B73FEA31 xmp.did:399DEF2EF1E9DE1183AEB319878DB4AA xmp.did:39BB885782216811BFE5BF57D4DB04A4 xmp.did:39BF5BD6C8E111E19D53A1BD4566F6C5 xmp.did:3A3CE7F335206811B311EBA70FD71192 xmp.did:3A62EBC4235111E0B173A65C0EC2E2AC xmp.did:3A6850363F8DE011A68BE05DED48B03D xmp.did:3A6CAF272B19E01184DD8FBD11034008 xmp.did:3A76783CD0A8DF11B2A19D50FF21B8D9 xmp.did:3AFBCD36732068119457B4E8E216C3A8 xmp.did:3B612268DAB6E01187C39E0D90EB37B5 xmp.did:3BBE07725E2FE0118BCEF3BA41E893A3 xmp.did:3BC6CE12C370DF11850CB72DB9D2CB92 xmp.did:3BDD977B1F2068118F62F4555C5E84BE xmp.did:3C17D9B5007011E0BAA5A546D65C57CC xmp.did:3C3603469AD511E08F0ABD72ABEC7BC6 xmp.did:3CBB494529D1DF11A5339ABF8266E818 xmp.did:3D02E62ADF8CDF1181DCCB8E8B77F31F xmp.did:3E3CE7F335206811B311EBA70FD71192 xmp.did:3E4901925221681188C696DC609994EC xmp.did:3E51E265833FE011AA6A8DA7AB0A81D0 xmp.did:3E8A102C200C11688442D886113E168A xmp.did:3EBA6728D72168118317ABB614DA433E xmp.did:3EE476995A28E0118FEFFAAC272DD9E7 xmp.did:3EEE2DB5B07FE0119FBDB1C3DCB285CD xmp.did:3F2840BBDAF4DF119B9FED66B6875A77 xmp.did:3F4901925221681188C696DC609994EC xmp.did:3F727C802A20681188C6D9C4D0AF0270 xmp.did:3F88163F0820681188C6D9EA900BA018 xmp.did:3FA591860E20681188C6AAF8EEECA0D4 xmp.did:3FB9609F5BA7E011979696CECC20A286 xmp.did:3FBE3CFB20206811A472E9C34FBDCB1B xmp.did:3FFF88B42320681180838C2BD51DE762 xmp.did:4064AC52F1A0E211A8259619CE1CB52B xmp.did:407BA1D2DE21681188C696DC609994EC xmp.did:40F5E85E7ECDE011A9998254DA7B207E xmp.did:41144A9F5CBBE011A9CDC1CC5A8545F0 xmp.did:41178B8188D4DD11BF828F18DEEAE683 xmp.did:41225C25162068118083E4CA328882ED xmp.did:41A8D9E589206811871FBF7EE03058F8 xmp.did:426956A63C7EDF11A5A4E9065FAC704C xmp.did:427629EB1F7AE011BC6ADBE9D9257556 xmp.did:42909406645FE011964FE99A58EBB358 xmp.did:42A169505720681188C6D9EA900BA018 xmp.did:42A8D9E589206811871FBF7EE03058F8 xmp.did:42B79C4D1720681188C69E9C0DE8906E xmp.did:42C8435B1F206811A9619D3E69A42F4A xmp.did:42CBEF71662268118F62F8E68BACEB90 xmp.did:42DD52B8322068118F62C099F7DFBA1B xmp.did:43487F5815BCE011B0BBD5E3244285CA xmp.did:441E8B361020681188C6D9EA900BA018 xmp.did:44569F2270206811B540D1205A8C4334 xmp.did:44972308022368118A6DC7B27BABA40A xmp.did:44BA610FF715E011850FA901B4C1B675 xmp.did:44C7E966DEACE01186C0EE0104E410A1 xmp.did:450652A0D25811E084B2FC8CD418D5A2 xmp.did:453680A25EC9DF11A86DDD161CFCEB0D xmp.did:45599B5D3BDFDF11AD98D0CC567A99E5 xmp.did:4582F7613448DF11AD0C84D94E5D43BD xmp.did:4590A1312920681188C6D159E68FEEFA xmp.did:45BF49C464C8E011BEF0A37AC8AFF6B8 xmp.did:45F62045FF1CE211BF1CBEAB02877C54 xmp.did:4618A328212068118DBBA997D43539B9 xmp.did:461E8B361020681188C6D9EA900BA018 xmp.did:463C55EC1F206811871F9753D344F7A3 xmp.did:4640EA1197DCE1118E89A806EF65A4BF xmp.did:4667C1F29B4411E192E9FD709E2209FE xmp.did:467C5988B9DC11E1A387A11AE8020488 xmp.did:46A95EEE9FBFE011B0BBD5E3244285CA xmp.did:46AB7E0D2730DF119042AD88AD5F9FC9 xmp.did:46BD6B5B42206811871FBF7EE03058F8 xmp.did:46E39520AEB8E011AEBCBCB1E3A15768 xmp.did:46FDAC28978AE0118DBED2E4485D9FF1 xmp.did:4723CCE5234BE111AC6CE507506EC647 xmp.did:4758DFE9017C11E1937E8BD9211F1F0D xmp.did:4804CD8307206811AE56F87BB2B8114A xmp.did:480B7E46AF78DF11A825CF8DE5D91DF7 xmp.did:4814DD170A21681188C696DC609994EC xmp.did:48947023BB4EDE118DE49E2CFEB84DA0 xmp.did:48F5EFE5AE80E0118A91AF6880B6674F xmp.did:4948814585206811BAB9848BFF04B50D xmp.did:496823831E2068118F1CFECA782915C6 xmp.did:4978DD280123681192B0CABB2874AF0C xmp.did:49BC7A4F35206811B311EBA70FD71192 xmp.did:4A83F1387620681197A5B53B0C75C963 xmp.did:4B04CD8307206811AE56F87BB2B8114A xmp.did:4B12AF1A50216811AF5C82C8D4EEE19A xmp.did:4B5C4472412068118083BAFDA65F8430 xmp.did:4C4949F6B82ADE1195A78A8137920439 xmp.did:4C4D4D899EF7DD1180199D0A99EB683F xmp.did:4C51B774A17011E0A528DEF2AC8C55C6 xmp.did:4C8C79BCDBF8DF11A111C57C46790BC9 xmp.did:4CA1D100CDC1DF11AAC7DEF7E9EA2229 xmp.did:4CDA76DA3520681188C6CC41240299E2 xmp.did:4CF62045FF1CE211BF1CBEAB02877C54 xmp.did:4D15C4DBB82BDF11B1C9D5AA7FB5335E xmp.did:4D46A20FF75AE011817EF430ABC94196 xmp.did:4D5C4472412068118083BAFDA65F8430 xmp.did:4D92A42A4AEEDF119356EE6A667C05DF xmp.did:4DCB8A30914DE011BD63DE0802894CA1 xmp.did:4DFE631B1C2068119109D986A10A20A5 xmp.did:4E15C4DBB82BDF11B1C9D5AA7FB5335E xmp.did:4E2A12FF272068118DBBF1E759913209 xmp.did:4E5BCDD097A8E011B01BA4DFDBC23FA5 xmp.did:4E8F42D203D811E190EB8FF8DF0840C7 xmp.did:4E96D8071320681191099262B251A4F6 xmp.did:4F0CFAAE632568118DBBFC31635E93B6 xmp.did:4F2FBD5B3833E211ABC1ADC0DA5AC883 xmp.did:4F6BB8702C206811871FE169E7DC3C98 xmp.did:4FDD2F6FA22BDF11B1C9D5AA7FB5335E xmp.did:4FFFE781FC0CDE11A770A9ABB3D9137E xmp.did:500A9AE2DD206811A613B4EE39B4D58C xmp.did:501167C17451E0119063CB825D612016 xmp.did:5032E746EBDCDD118BB0ED485B2406E3 xmp.did:5046D02657E8E0118873D8CABF5B9B31 xmp.did:505381322485E011BD3DE9624629426F xmp.did:50A9D158862068118C14FC1C697D6C64 xmp.did:50F0464C0C2068118089E259502D6AC2 xmp.did:510B91F3AB2068118A6DF9D78C0F9B15 xmp.did:51546FDD1320681192B0BAA904DE0F8D xmp.did:51B82BC8222068118A6D8F7F76AB4DDC xmp.did:5232646C26CBDF1190EAEC1F0BACD3F2 xmp.did:52910D990C206811A961A044C143500B xmp.did:538F8AD33C23681188C6E3B2AFCF6608 xmp.did:53D2627EE32911E08A618A5AC5C07AD7 xmp.did:543A798F1307E011846FE8C04D3C8DEC xmp.did:54546FDD1320681192B0BAA904DE0F8D xmp.did:5489D78E1966E111BC68E08AF29E25BD xmp.did:5496D8071320681191099262B251A4F6 xmp.did:54BF11E22DCBDE11AC1FBF9D231E361F xmp.did:54C3F9F8BDAEDF11A5DC959C82ABC9E1 xmp.did:54C6CCC48F7DE0118A8F80BF7355E0D1 xmp.did:556E056A4621681188C696DC609994EC xmp.did:557C42AE992068118F42CFE2A9EBEA82 xmp.did:559FCD3B527ADF118914DEB1351761F1 xmp.did:55C093961E2068118083EBC7D6F18424 xmp.did:55E2C85D50B911E09B45EB5D6BDA9918 xmp.did:560A54489961DF11BEE9B786BB033420 xmp.did:56BF11E22DCBDE11AC1FBF9D231E361F xmp.did:56EAD66EECEDE1118EBDD2792BC326D4 xmp.did:56FD0742357AE1118349FA99D447291B xmp.did:57729B10F02BE111AF198DCAA3F1E75B xmp.did:577969B29D5011DF8B1491785F4DE9BB xmp.did:57BCD4A3F738E3119802BE982B1502BD xmp.did:58316A45F5F5DF11807F8C8A28F8A117 xmp.did:583BD1F31720681191098946CB8DAAB6 xmp.did:586276373B20681197A5ABE98A388C5F xmp.did:58F757F1372068119109E4A43CE530D0 xmp.did:590D834E29AFE011BB50818B7E198924 xmp.did:593E6CA71120681188C69B8C88BD3CC1 xmp.did:5A4523D4BAD2E1118B12B8550F44D456 xmp.did:5ACA778625C1E01180B9D22014B81B82 xmp.did:5B00864E4767E01197F3F9B0477D6229 xmp.did:5B3E6CA71120681188C69B8C88BD3CC1 xmp.did:5B6DD2B74584DF11B7248B7DDF794A1A xmp.did:5C146AA32C206811871FBF7EE03058F8 xmp.did:5C20A878E3246811B4F2E4B54918CE3A xmp.did:5C810BCA432068118F62F8D9147DC05A xmp.did:5CAC3B5AF977E011AC53A76EEAD13040 xmp.did:5CE96B67222568118DBBFC31635E93B6 xmp.did:5CEC9C6EC13DE011A0BEF8DDCFC32D6A xmp.did:5D0CDBD57F76E011BA3CF330558605BE xmp.did:5D3E6CA71120681188C69B8C88BD3CC1 xmp.did:5D7E93F5833411E0B62FB7127DA0FEAF xmp.did:5DE7C465E499E011A42DEC14C3EFCAEC xmp.did:5DEA28BF0A20681191098CDF369CA920 xmp.did:5E1C88E1FC20681188C696DC609994EC xmp.did:5EC857194DD3E0118BBCBA5E7FF86AF5 xmp.did:5ED080139B4011E1BDF8AB7E2919F0A2 xmp.did:5EF6E033572FE011A924FF15510F1797 xmp.did:5F0079D829206811B1A4D56600D919C7 xmp.did:5F2CF7595D206811994CE68A7A8A9137 xmp.did:5F4BFDF37F1ADF119CB8E7D742FA3A25 xmp.did:5F8E58AB66AEE011BB50818B7E198924 xmp.did:60640A5C5826E01182CAD38ECEDCE268 xmp.did:610079D829206811B1A4D56600D919C7 xmp.did:61850AFCE49011E185D9D5AC343CED4E xmp.did:628A8AFA8D1211E192BFBBCE8C7D6A8D xmp.did:62D01CE14BF911E0A0A08DC280149321 xmp.did:638880E80920681192B0BAA904DE0F8D xmp.did:6395943583CBDF11BAF5EC302DA3E9DF xmp.did:639B1DD297D5DF119648F8511B7417D3 xmp.did:63AEF9105305E011867F89B0211E4F7A xmp.did:63B9DF027F206811871F80898A1CC3A1 xmp.did:63C7F7A61E20681192B0E03D46CBFB2F xmp.did:63F09B6B8525E1119CDAE92B716695D8 xmp.did:6474C83C687CDF118E1F99D69B3525CC xmp.did:647F1DD60621681188C696DC609994EC xmp.did:648880E80920681192B0BAA904DE0F8D xmp.did:6494CD194F206811871FCD2199AD167E xmp.did:649D06DE7020681188C6D9EA900BA018 xmp.did:64C6C5C839CCDE118040C244BCAE0AC0 xmp.did:64D83FC593206811871FBF7EE03058F8 xmp.did:6515EC6E98206811994C86814C2F3017 xmp.did:653E4C94DD2068118F62D27A6BCE2F0B xmp.did:659F34731BCDDF1191BD97C1AE6A08AB xmp.did:65E9662A8496E1119889E2A76909DC02 xmp.did:6625348F6D43E011B1B5DB40F0283379 xmp.did:664D5C459C7711E08A9C913C073A663E xmp.did:66562D8A30206811822AF66E54970861 xmp.did:668880E80920681192B0BAA904DE0F8D xmp.did:66BCB3B7EAB9E011AEBCBCB1E3A15768 xmp.did:6735706A402068119457C4C657E622B8 xmp.did:677E60494F2068118DBBE52260A278CD xmp.did:678880E80920681192B0BAA904DE0F8D xmp.did:68033E32A59611E0AE7E90E1E54CD6BB xmp.did:6859A8AA4C20681192B0C49A4A67C7CB xmp.did:686C661626206811871FBF7EE03058F8 xmp.did:689B1DD297D5DF119648F8511B7417D3 xmp.did:68C8EE3EEBABE0119875CB404E826AAC xmp.did:6966F9529C23E011BDF9E30C5CFEECDF xmp.did:69993D007926E111864098E5E4DF3557 xmp.did:699D06DE7020681188C6D9EA900BA018 xmp.did:69B2F9191F20681194578A02E8C9B59B xmp.did:6A15AFA28B206811871F8DE1CBDF9EB0 xmp.did:6A284E091A29681192B0D53FF790F85B xmp.did:6A47007B82A4E011A4FEE67DFDD7FB36 xmp.did:6AE4DB37096FDF11BD60EAD4B082D434 xmp.did:6B159B20C5ACE01186C0EE0104E410A1 xmp.did:6B43DD71B9D011DFA897EC2DD419EB70 xmp.did:6B6A135A9DB911E1A8FCB9DED824DBE6 xmp.did:6C5A013B2B216811910990FE46E80D18 xmp.did:6CDE07D55E20681198E99BCF30868C79 xmp.did:6E282DCA7F17E011B0739866E9AD0C81 xmp.did:6E7CD2CED77BE011A60BCDD5CBCAB985 xmp.did:6E843CF8437011E088D29E4C0233231A xmp.did:6FAD2A5D0E20681188C6D9C4D0AF0270 xmp.did:705B30E088F611E083F782CBB1D50FB1 xmp.did:7089C6CFC8B5DF11820885489254C0E7 xmp.did:70A31406DF206811871F81E8BB0F82E6 xmp.did:70D3233031206811871FBF7EE03058F8 xmp.did:710A7400A8EBE011B976D593E6469015 xmp.did:7125C99E1320681182FE98EF7F18BF1D xmp.did:7138CE366F61E111A5F0E9A958BBD36C xmp.did:7162A10113206811871FCD2199AD167E xmp.did:71BF4AE7B28EE1119DACE15551E8B269 xmp.did:727318241C16E011A6BDE351CD2F170F xmp.did:73433320EF38E011B0A3AA87FCB13408 xmp.did:7360C3BF8D206811B6999C6B4BE18F8F xmp.did:73835F56AFD3DE11AE11874F0DDFD12F xmp.did:739D7E9FEBADDF11AADEADA356222083 xmp.did:73B57231C3E9E0119FC8E3CA42FCF1AC xmp.did:73C5D4E7ECA7E011ABD49328F4BC62FE xmp.did:74117FF720071168B4F2D4360359303D xmp.did:7437D61FD021681188C696DC609994EC xmp.did:74F33ECEDBBADE1191609FD758966D64 xmp.did:753A28DD3120681197F3DAD110AB1D7D xmp.did:756A1C8AD8AFE111BCB0C7DF566281B3 xmp.did:759EC5FDBF66E11192B4D50FDFA7DCBB xmp.did:75DEDC25312468118B72DE2C6B104274 xmp.did:75FC7CDC7B20681188C6D9EA900BA018 xmp.did:7631A3109686E0119D98C2D90B3468EC xmp.did:76857F743F20681197A5E7B0831EA4A7 xmp.did:777A8B8D2CCEDE11AC1FBF9D231E361F xmp.did:77FCDCFF0C20681188C6C677A3826B0E xmp.did:7841B3F958A3E1118EE39C2C7AC22163 xmp.did:788200B33261DF11B38F998875CC8654 xmp.did:7925336F792068118F62FB2F86618C29 xmp.did:799A288FE48E11E185D9D5AC343CED4E xmp.did:79CD63DC242AE111A211D8B9742EBC10 xmp.did:7A7A501C1F206811871FE0E4CB6C52AC xmp.did:7AC1A8E47A206811BA24F97E9D027B47 xmp.did:7B043B7D7321E0119D96D946FB4715F7 xmp.did:7B24B5768A72E011938DBEF8D25B6A28 xmp.did:7B29C0F54820681188C6D9EA900BA018 xmp.did:7B78254BE0AEE011853D816FB98ABCA3 xmp.did:7BD2A7176C34E01183C188C0B0DA4CAA xmp.did:7C3E01E7621EE0119FA7EAA9BF1AC2FE xmp.did:7C6F110A13F4E0119A97C6F5F7FD5B9F xmp.did:7C702F8623CEDE11AC1FBF9D231E361F xmp.did:7CDB0AA0EC0011E08BAADF41A5DFD597 xmp.did:7CE9741F22206811AE568088196B6FA8 xmp.did:7D4E139D1885E011BD3DE9624629426F xmp.did:7D5E1B8AEAEFDF118A9DAF75AAD34E89 xmp.did:7D5ED72279B111E19AF3D57CE9DEB3C9 xmp.did:7D5ED72679B111E19AF3D57CE9DEB3C9 xmp.did:7DEF14247280E0118A1A98C5FA0DA4D2 xmp.did:7E30378069FC11E18753C48E566371BB xmp.did:7F6D26F1E2FEE0119C6ABCC0BC7488E3 xmp.did:7F9C53A211206811ACB683AE4DE260D1 xmp.did:7FBFAB2ACFDBE1119E848C69D255D3A5 xmp.did:7FD93A5FBF57DF11A6E5DB9F6F6C55FC xmp.did:7FFFA217A653DF11872EF9A8EFC0E527 xmp.did:801A5C852C20681180839613FFBBFAAC xmp.did:804007CE2420681180839613FFBBFAAC xmp.did:8059655B2C2068118F62CDC0FFB60C81 xmp.did:8078365AE76F11E18533F1ECFAB65801 xmp.did:80C93B4FEB3111DF9C439A7A28CCF362 xmp.did:80CE0A53F2FBE011BE70F7A2A05D4BEA xmp.did:80F11D74C0D411E099C8954F847EAFAE xmp.did:8137BCB2E609E011AFBBDA0630995ED7 xmp.did:8166F94F8E5ADF11B2A8D5C54226B8D0 xmp.did:81BFAB2ACFDBE1119E848C69D255D3A5 xmp.did:81E1AEF49B09E2119BAAB0C9C55048B7 xmp.did:820E24D92B2068118C14B7428F978057 xmp.did:8210FDB3082068118A6DAF67FF497528 xmp.did:830B9C46982568119109AFE3CF4AF35A xmp.did:832892B8412068118F62F71255CC48E7 xmp.did:833C8CE42459DE11A76AB674739B3094 xmp.did:838372649821681188C696DC609994EC xmp.did:838BF2091320681188C6B205E89566F4 xmp.did:83B41E2DDE55DE11AD63CFBD010DF686 xmp.did:83EB4BDCEEC3DF11A03DE80758667799 xmp.did:841A5C852C20681180839613FFBBFAAC xmp.did:842F757B8120681188C688F5D09384AC xmp.did:84C76E5CA61EE0119B62C1A72CDDBB2D xmp.did:84C95075E3FBE0119B5AF02CBE935267 xmp.did:852600B68B8BDF1198968D8BFA9A0C11 xmp.did:85740B880E21681188C696DC609994EC xmp.did:859A4C2A202F11E19107DB90BFA0BECA xmp.did:85B2001FDBA8E1119FFCA576B484D989 xmp.did:861A5C852C20681180839613FFBBFAAC xmp.did:861CB129116CDF11A081DAC65549FFF8 xmp.did:865B2D5F46236811994CB5207DCDF24F xmp.did:86740B880E21681188C696DC609994EC xmp.did:86754CDB0820681188C6DA43C866EEAE xmp.did:86C08269482068119457C4C657E622B8 xmp.did:86D9306BCF20681188C68D6968983E56 xmp.did:87E33B19803811E09258D24CBD61FD3F xmp.did:88740B880E21681188C696DC609994EC xmp.did:88A1231164D711DFA6978521D60DF460 xmp.did:88C351403ED8E11186E3E883EB9255AD xmp.did:88EEB63969FC11E18753C48E566371BB xmp.did:891A5C852C20681180839613FFBBFAAC xmp.did:893835F45F0AE111AB6485CEEA28C3FD xmp.did:89C45F4A208ADF1195A9C4DC515AF3FD xmp.did:89DB88EE8521681188C696DC609994EC xmp.did:89E36FFA7D14DF1197C89C8FF17B2D44 xmp.did:8A101BFFC72068118DBBFC31635E93B6 xmp.did:8A63DD1700CF11E191B7E8D4874E87EA xmp.did:8A84CF9C69FC11E18753C48E566371BB xmp.did:8B90858FB573DF11BFBBF00759A3D452 xmp.did:8BD0CC8BD42268118DBBD37DD26DADFC xmp.did:8BD0EE5C653311E1B736BFACD3620D8F xmp.did:8C808E7F85DDE0119A5BC7203B0F52A5 xmp.did:8C8372649821681188C696DC609994EC xmp.did:8CFA6888BDC9E0118A1894B66E94A91C xmp.did:8D6BF2DD0F206811A8D69B0972D029D7 xmp.did:8DA18CE51B20681188C6E479C139F768 xmp.did:8E966105F320681188C696DC609994EC xmp.did:8F4DFE5AC221681188C696DC609994EC xmp.did:8FC93F7B2EAFE01191C6909159CD1941 xmp.did:9055651CDAA4E01197A1A65F7AE4791A xmp.did:90A1EB3B082068118603AD4B49AD7764 xmp.did:90BBF09D38B1E1119B1BDB5EFCD192A6 xmp.did:90C5D5266479DF11865CEEF09851FD79 xmp.did:90E47E696271DF118311B0C80F59CA13 xmp.did:911C7F2A8A21681188109F9973D46F2A xmp.did:9192FF6B0A4CDF1187C0E54B36521B89 xmp.did:91D03B52A2C5DF11AD408D720C5A42C7 xmp.did:91DB88EE8521681188C696DC609994EC xmp.did:91EE4B6BED92E211B157A76FBA09468E xmp.did:91FF051E0FD3DF11B2D1C51F59B5FB29 xmp.did:9260FA1A3E12DE118089D2AE8FA9A37E xmp.did:92966105F320681188C696DC609994EC xmp.did:92B423E31A2068119109BCD3F23227AF xmp.did:92CBBD15D6206811A7BAB1FC45DDAD2B xmp.did:92E4E5920A20681194098696425599BA xmp.did:92E577500821681188C696DC609994EC xmp.did:930C97C2BFABE0119DFF82FD9D6C9E81 xmp.did:930DD8B928206811AFFD97A6A7E489B5 xmp.did:944A847A363B11E0AEB2FFF11F63D948 xmp.did:94658B6B3B206811871FDB7C73EC7AF4 xmp.did:9497763E26ABE011979696CECC20A286 xmp.did:94BF7C8F16206811822AEEB3D886E662 xmp.did:95A96A28F3DAE111A7AAA5DE6EB18B89 xmp.did:95B2C65AB684E011ABCFE78D83B50568 xmp.did:95C2077600CF11E1B332971007A50C02 xmp.did:96058457A360E11188FC933E59052C44 xmp.did:96591BA8B7E2DF119A52D83C080E6159 xmp.did:9666F0B64C2568118DBBFC31635E93B6 xmp.did:9672422DDBCDDE11ABFAA0D8603A9AA1 xmp.did:967DD1DC2B34E011B6CDA8F0B2C213CD xmp.did:968CEE49372068118A6DC2EB5CD0A707 xmp.did:96925A4197C2E011B180E288B7389DB2 xmp.did:96A47FB56A1FE111952789A0D5E19759 xmp.did:96C81ADD14236811AF6F8C15B6994DA7 xmp.did:96C8249C6FFADF11B295A881C3F5AF4C xmp.did:96E44C36EE4EE01195F4B95F349B38BF xmp.did:97197485D51EDE119E659B86C3686744 xmp.did:973AB16794B1E011AF59B6057C510CF7 xmp.did:9785BA49DBDADF11B163E9831471534B xmp.did:984F950EB29DE111B056A6C58D1607AE xmp.did:98759349A621681188C696DC609994EC xmp.did:98C912840720681192B0E6C15935B3CD xmp.did:992CEF020B2068119109FEECB06854FB xmp.did:99343A4732206811871FE8DD2340C0B0 xmp.did:9A759349A621681188C696DC609994EC xmp.did:9A8FD6619B3CE2119925D9CC22BAEF70 xmp.did:9ACD98F7A9DFE011BAC7F7CD194FE1BE xmp.did:9B0BC90E76B4DF11A365EF5257762381 xmp.did:9B0C97C2BFABE0119DFF82FD9D6C9E81 xmp.did:9B4613316923E111B8D9F5BDE94825E4 xmp.did:9BA59F93AC206811B4CCE9880A1B4D83 xmp.did:9C34F11D8567E1119E03F98C97A3B1AF xmp.did:9C66F0B64C2568118DBBFC31635E93B6 xmp.did:9D764364F93FE1118D3AA6094BA023F6 xmp.did:9DA429A15120681188C6D9EA900BA018 xmp.did:9DEED1530021681188C696DC609994EC xmp.did:9DF1224211206811822AE3B9CDB16A6A xmp.did:9E1C987F773CE0119951FE9E21D95FD2 xmp.did:9E27C63DF158E2118D02EE5CB004327A xmp.did:9E4C6A750820681192B0FEBDA93E3C72 xmp.did:9E5A44A108206811871FE8C12D95F69C xmp.did:9E7D607C4F216811AF5C82C8D4EEE19A xmp.did:9E8FFCECBA17E111A00B91E6F524DF45 xmp.did:9EA1AF2B9358DF11BB73AF92DE6846CC xmp.did:9EC912840720681192B0E6C15935B3CD xmp.did:9EF7D92FC392DF11AED6A59B0EF71149 xmp.did:9F2C9CACEE0AE11186C29F7E56C3BAA4 xmp.did:9F822ADCF0D711DFBE96AA0FFE5462A2 xmp.did:9F822AE4F0D711DFBE96AA0FFE5462A2 xmp.did:A0546D104BC511E0B78A85AD4FD2359F xmp.did:A0704BB7182068119109F6AC020C5FF2 xmp.did:A0AFA84FD870E011B557BFCA0CAA97BB xmp.did:A0EED1530021681188C696DC609994EC xmp.did:A1A747644C21681188C6C2EFB22D669F xmp.did:A1AFD5E0A2F3E2118284B32F29535E66 xmp.did:A1C5E8639820681188C6A894A1D908BE xmp.did:A21F72567D09E211BDF3E77D7562D72A xmp.did:A23DA5AAD6B1E011A5629C3693D5C0CF xmp.did:A26263210D20681192B0B59A26F7999F xmp.did:A2B299F0726FE0118AC58FDA9DF5DA7A xmp.did:A2C2B76E1320681188C69B8C88BD3CC1 xmp.did:A2D86490D952DF11967E8720A676FAF0 xmp.did:A2F5C5F1E5CBDF11AD7D9A1023BE16FD xmp.did:A3501E239D2FE011A325D07E052CB137 xmp.did:A3A429A15120681188C6D9EA900BA018 xmp.did:A3B6ACD2D133E011B14D815C16B7C2CD xmp.did:A3F4D7821620681192B0C5319CB69C7C xmp.did:A41B25DD19206811871F850BE2F5A6A4 xmp.did:A48499331620681188C6D9EA900BA018 xmp.did:A48D36A70E206811822ABFFA029D9A53 xmp.did:A491E44BE6EFE011A72BC4DCA77C5A48 xmp.did:A4A429A15120681188C6D9EA900BA018 xmp.did:A511B8AD212068119109C4FC82D5C1CB xmp.did:A526EE802F40E111B91BB4AFE66AABC6 xmp.did:A5F0B1A348EBE0118A34ADD00EBCF069 xmp.did:A5FBAB916DE9E1118715EE5B318F5724 xmp.did:A60A9CE5B121681188C696DC609994EC xmp.did:A611B8AD212068119109C4FC82D5C1CB xmp.did:A628AAE1CB4DE0118CCDBF34AD86A220 xmp.did:A688D3B59AC6E011A93D9F61069A0227 xmp.did:A6C24E1BF5C3DF119F6D9BF4B2FB596D xmp.did:A6C2B76E1320681188C69B8C88BD3CC1 xmp.did:A6C6277E1C89DE11A849D901E441D0B0 xmp.did:A78499331620681188C6D9EA900BA018 xmp.did:A792B57D4B206811871FBF7EE03058F8 xmp.did:A7E473D0DB77E011A72BB337603AD007 xmp.did:A7E87A2F958C11DFB77CF3AD4F00B0EF xmp.did:A806C3667DA0E011A4FEE67DFDD7FB36 xmp.did:A80A9CE5B121681188C696DC609994EC xmp.did:A817C161BFA411E08C7396F5C0DD6D7F xmp.did:A83A97962E2068119109C80A4C3147BC xmp.did:A8C2B76E1320681188C69B8C88BD3CC1 xmp.did:A8ECE7294820681188C6E275F11AA5DE xmp.did:A9432DF857F7DE118BE884B676DB25DC xmp.did:A947F2DB1A2068118A6D83BDDADBE6EE xmp.did:A9EA192F292068118DBB82DD622598DD xmp.did:AA219AA73F2068119B7BD4F86EBFACF4 xmp.did:AA8C8B5160206811808386281F38E783 xmp.did:AAC2B76E1320681188C69B8C88BD3CC1 xmp.did:AAE0E9190C2068119109B208AFE7A4D2 xmp.did:AAE768FF8D6ADF118290CBB94C5CF4F0 xmp.did:AB074D2D0F9DE011B929E56A1DD8643C xmp.did:AB31483161206811871FBF7EE03058F8 xmp.did:AB74F6F3922068118083DB197420851A xmp.did:AB7E99DDA5D3DF1184108A6DF5F8799A xmp.did:AB9CD0663720681188C6D9EA900BA018 xmp.did:ACC2B76E1320681188C69B8C88BD3CC1 xmp.did:AD026819AF5BDF118C5AF66058A6DDB5 xmp.did:AD118B0104E4DF119190888724FA0B17 xmp.did:AD1818B51F206811815ED0470E64A083 xmp.did:AD3773DD9D53DF11B8B4B48CEB770F68 xmp.did:AD909E2ABF5FE211BC75A780DCE622FB xmp.did:AD92B57D4B206811871FBF7EE03058F8 xmp.did:AE4343DD3D2068119457D1716966A8A1 xmp.did:AE752A91EF8D11E0B59EFA46D6C257DD xmp.did:AE9ABA76FAC8E011A72BDC489F5B89F7 xmp.did:AEEFFB4525C3E011BEF0A37AC8AFF6B8 xmp.did:AEFF010E2F4CE011A153D2BF7C2CEB4B xmp.did:AF223C4E7ED7DD1199E1B78BB722FF90 xmp.did:AF3F48E9A5C0DF118427E32E6F9EFF05 xmp.did:AF3F94FC8A8111DFB58EA5992B51587C xmp.did:AFEBEFE8542068118A6DDF8D24144623 xmp.did:B00AB6B3222068119DB8BB0B9C67E4C5 xmp.did:B01EADEA1DBBE1118C61C3FA7E29662D xmp.did:B031483161206811871FBF7EE03058F8 xmp.did:B03244C1C18EE011AB41D8FD6E7F1E9A xmp.did:B03E696E21C6DF11891AB4133B3B4FF4 xmp.did:B03F48E9A5C0DF118427E32E6F9EFF05 xmp.did:B09C874A37DB11E09A1AECB6F8F33707 xmp.did:B0B076C44920681192B0EC05249DD377 xmp.did:B11D360C25F1DF119445A5FD895D781E xmp.did:B13F48E9A5C0DF118427E32E6F9EFF05 xmp.did:B1854DB6AB37E0118B3D9D759656F948 xmp.did:B1AA322600CF11E185E891BAF236F5D5 xmp.did:B1DD540D3BCEDE11AC1FBF9D231E361F xmp.did:B1EFFB4525C3E011BEF0A37AC8AFF6B8 xmp.did:B22E72991EDFE011BAC7F7CD194FE1BE xmp.did:B251B6060EFDDF11B2E3C4FD4894A392 xmp.did:B28B606385C6E01185BED54A95B1630C xmp.did:B2E2684C49226811AB08A7F30EE532D7 xmp.did:B2E7D2623E52DF119BFF8B070109B2C6 xmp.did:B2FCE64C5DF011E080EDF4F399B355AD xmp.did:B326D72B98C4DF11BA82AFFFE558943D xmp.did:B3DD540D3BCEDE11AC1FBF9D231E361F xmp.did:B3FCE625EDDAE0118842B29FA6343094 xmp.did:B43A9BE516B9E011AEBCBCB1E3A15768 xmp.did:B4592B00292068118DBBBDA095473D70 xmp.did:B505585B4720681188C6D9EA900BA018 xmp.did:B53BDA96C7206811ABD4B664A86E6DC6 xmp.did:B5A517ECBFE5E1118B99A97503504C1B xmp.did:B5B0C2465198DE1186268619AF7D6180 xmp.did:B5F2047052DA11E08FFB97E9624AAF60 xmp.did:B609F8673D2068118DBB9A2BD87D7921 xmp.did:B64468DD2020681192B0FB3680825E28 xmp.did:B650AFBAD12168118CC2AEB4C1718E17 xmp.did:B66B14327664E011BE41B15A6A029915 xmp.did:B6936E01CE9DE011AF4CB0B3AD39C76D xmp.did:B6DB0B007C20681197A5FEC97E293B54 xmp.did:B6F2711BBEBBDF1196F5B44D3A9BD6F6 xmp.did:B705585B4720681188C6D9EA900BA018 xmp.did:B7303852DC5011E0B192AB8A8597E6C6 xmp.did:B74ACEE3B8206811BF3094187AF8421C xmp.did:B7598833D620681188C6C0C998FCF1E5 xmp.did:B7D58F9579B011E19AF3D57CE9DEB3C9 xmp.did:B7D58F9979B011E19AF3D57CE9DEB3C9 xmp.did:B7D58F9D79B011E19AF3D57CE9DEB3C9 xmp.did:B8440D0B0F206811AE3FD62352FF1D11 xmp.did:B85E369DF0ABE011A0EAA0B446E442FE xmp.did:B928BC2D2E2068118F62A2D886FC3EA7 xmp.did:B932B92E0920681188C6956C521FE498 xmp.did:B956EA72157DDF11A762EA67B35A3A50 xmp.did:B9D5D6D3BC38DE11951B998C65B1B618 xmp.did:B9DD4C1C2E2668118DBBFC31635E93B6 xmp.did:BA2334AEFD53E011A54D9507E0E8BC34 xmp.did:BA32B92E0920681188C6956C521FE498 xmp.did:BA621BD59254DF119563A63D2350A99D xmp.did:BAC74A767A3BDF11B81DE3CAC7B760A2 xmp.did:BAE948E4A421681183A2BC64D6373250 xmp.did:BAFCE625EDDAE0118842B29FA6343094 xmp.did:BB1625B78953E011A54D9507E0E8BC34 xmp.did:BB251EF6B780E011BFF8C28A70355E3A xmp.did:BB3565E81520681192B0BAA904DE0F8D xmp.did:BBAD363C202068118F62F8D9147DC05A xmp.did:BBDD540D3BCEDE11AC1FBF9D231E361F xmp.did:BBE0CFA2B12068118F62B83BB8D9B324 xmp.did:BBFFC530D12068119109C37490BE3834 xmp.did:BC14929B7521681188C696DC609994EC xmp.did:BC5E369DF0ABE011A0EAA0B446E442FE xmp.did:BC806AC3DFD7E0118AB9ECA40DAC3FF4 xmp.did:BC87D955B461DF1186C7B47407E46CEC xmp.did:BC9B22EE162068118083B78A909B2B11 xmp.did:BCC8924632206811A178B4862A3AC2C7 xmp.did:BCCA85B00B2068119109870628CE59B5 xmp.did:BD14929B7521681188C696DC609994EC xmp.did:BD3F85792F60E01180C2A532D32911CC xmp.did:BD44F04B1A20681188C6CE9135C0C173 xmp.did:BD6B1DE20174E01192F2D8B5008E758A xmp.did:BD774EEE3E20681188C6D9EA900BA018 xmp.did:BDAEF7BB77D8E0118842B29FA6343094 xmp.did:BEA61E1EE6F0DF118A48A038B5F54722 xmp.did:BEACBAD96F2268118083DD6A9D608EBA xmp.did:BEE10793DF48E1118E76C3D85A8878D0 xmp.did:BF0FF0E5621511E085C1D1F80F173C23 xmp.did:BF4E9F14E9D2E111AE16AB8C13D025EF xmp.did:BF6463E2BE9011DF9756F3B2E85D211F xmp.did:BF7C797A9EA7E011B01BA4DFDBC23FA5 xmp.did:BF7E93310B2068119109E40C65AF52D5 xmp.did:BF9B22EE162068118083B78A909B2B11 xmp.did:BFACBAD96F2268118083DD6A9D608EBA xmp.did:BFD75184AE21681188C696DC609994EC xmp.did:C028BC2D2E2068118F62A2D886FC3EA7 xmp.did:C03040BFDF90DF11AE82CBA880F138F9 xmp.did:C05698F0819011E1B924A4A8CF2A245E xmp.did:C074A85E06F7DE119CCA8227581679DF xmp.did:C0850C312820681197A5B2DA320444DD xmp.did:C085439615206811871FE459E5C10885 xmp.did:C0A61E1EE6F0DF118A48A038B5F54722 xmp.did:C0BA93CBAD206811BFE5BF57D4DB04A4 xmp.did:C12C2402E064DD11AE6AB030FE2B7C4A xmp.did:C16B15488B21681188C696DC609994EC xmp.did:C1774EEE3E20681188C6D9EA900BA018 xmp.did:C1F456B1E5F0DF11A0DC84A10DADEBAB xmp.did:C1F748A95921681188C6BD0FAC4EC9BB xmp.did:C23565E81520681192B0BAA904DE0F8D xmp.did:C26C0D495267DF11B2E5C8CA2A20B501 xmp.did:C29C58B9EBDADF11AF20E3D3A3FCE87D xmp.did:C373CEC0362068118F62D0F7010AC02F xmp.did:C38F0EAD67206811A26EEF0A84B9044C xmp.did:C3DF245BDF2111E1837BCA93B883A4B1 xmp.did:C3E99553BA2BE2118052DF928F7D1CCC xmp.did:C479F20430A6DF119C3AB96E6BC803AD xmp.did:C4AF4E884A20681188C6D9EA900BA018 xmp.did:C53485763605E011B0878B10470BE98C xmp.did:C579B182572068118083CED5C8106250 xmp.did:C5956433422068118083E4CA328882ED xmp.did:C5D75184AE21681188C696DC609994EC xmp.did:C5F5FBA4B262DF11A5908EE048EFD3D2 xmp.did:C66C0D495267DF11B2E5C8CA2A20B501 xmp.did:C67F1174072068119109E40C65AF52D5 xmp.did:C69C58B9EBDADF11AF20E3D3A3FCE87D xmp.did:C6B3A3B94A21681188C696DC609994EC xmp.did:C7110E5F5076DF118E61ACD179D06244 xmp.did:C72BB5B253DDDF11A4D5D54ADD1CE786 xmp.did:C73A523D1846DF118065D80F7B596DE4 xmp.did:C84CCF5DDD21681188C696DC609994EC xmp.did:C85758D352206811871FBF7EE03058F8 xmp.did:C8656C4D0C20681192B0CF50B4F61303 xmp.did:C885439615206811871FE459E5C10885 xmp.did:C8C3AD0F9810E0119E3EED6DA52BB020 xmp.did:C8D94497193FE011BCB2EBD6700DA6F2 xmp.did:C933F621056311E18A71B2C53ED92F96 xmp.did:C952816D83206811BCCDE187B49CA19C xmp.did:C95A7CC3AFA9E0119E7DE495A33FFAC7 xmp.did:C97F117407206811994CF132BC83D69A xmp.did:C9C04586BC53E0119D3985FB4A82845E xmp.did:CA7B75907F2068118083DF8FD5225E6C xmp.did:CA949CCAAFCCDF11AAA5ECB36CFA01C9 xmp.did:CAA83FFC05216811910987CF0230F4F6 xmp.did:CAD23720A27DE011B2AAA058498F3016 xmp.did:CB5A7CC3AFA9E0119E7DE495A33FFAC7 xmp.did:CB5BBB441A2068118083EE03884A9181 xmp.did:CBB4D1F9D22368118DBBF2DAAEBE3D62 xmp.did:CBCA914B2520681186C89F4E62C56BFC xmp.did:CC0C567EB42168118F0FBB5DBDD97766 xmp.did:CC20579C3A20681180839613FFBBFAAC xmp.did:CC233AAA1220681180839CE599C3AD30 xmp.did:CC49A8FC6195DE11A97FFAA811454526 xmp.did:CC4AB591A7DCDF11BF79FA62B51DF6C7 xmp.did:CC6E956B2DE4E011A574825CAC1E8216 xmp.did:CC9EFD375F2068118DBB967E97684763 xmp.did:CCB3A3B94A21681188C696DC609994EC xmp.did:CD2AF5DCA5C4DF11BA82AFFFE558943D xmp.did:CD424D36EFF0DF11A41DD54C81C3BCF8 xmp.did:CD5A7CC3AFA9E0119E7DE495A33FFAC7 xmp.did:CD68A0E616206811822AB5766B66A762 xmp.did:CDB3A3B94A21681188C696DC609994EC xmp.did:CDDB91E8E74CE111BB50FDC03D86DCD2 xmp.did:CDE88BCE4B6FDF11B218B00D847DC297 xmp.did:CE58F6CF24A011E19E12B87F7C1C15CF xmp.did:CE7EFAB95D0D11E2A3119B5C42DD2062 xmp.did:CE807746834D11E0B62FB7127DA0FEAF xmp.did:CEDD717E815111E084CF9208B3BF176F xmp.did:CF05856847206811AEE4ECC20A5D0880 xmp.did:CF202C7400D011E18D96E08C37B82D61 xmp.did:CFA05BAC57C811E0B731C54AC127987D xmp.did:CFB4D1F9D22368118DBBF2DAAEBE3D62 xmp.did:CFC659F89E20DF118A73D73207D10630 xmp.did:CFCCDBEA442168118083ED384A5CA32B xmp.did:D0385D898772E0118C3089D479022CBD xmp.did:D05758D352206811871FBF7EE03058F8 xmp.did:D0A7CE91808CE011A0FC932931B9D7E7 xmp.did:D0B31BC50D206811871F81B8681E3F37 xmp.did:D113248AE42068118BDAECB4C7294005 xmp.did:D19D4794FA45E1119CA8B4DE29831962 xmp.did:D1C13B2778B7DE11994196785E609050 xmp.did:D1EA7F0E7172E011A599C59C80AD6134 xmp.did:D1F017DD47206811AD4CE55DF3434A14 xmp.did:D217B386CF51DE118702BAC19059DE69 xmp.did:D2D750523220681188C6D9EA900BA018 xmp.did:D3451B801E25DF11BAB9C18CADBB71B8 xmp.did:D366EFA10A20681191098977F35DFB2C xmp.did:D3674245D143E111B3C7DCF0635B33AF xmp.did:D36DB02BEF23E011A709EE79085E3A92 xmp.did:D3C068EC2321681192B0ED941B81D256 xmp.did:D3D399022320681191098A39F9B5A384 xmp.did:D4054EC11920681192B0BAA904DE0F8D xmp.did:D44404ACAED5E011A6FE9FC6A55C05A3 xmp.did:D4F431872BE011E1BD20A05C192A7A05 xmp.did:D58C284B1638E0119CCBC45B8A98BC1C xmp.did:D5D9C4ECE5BDE011B0BBD5E3244285CA xmp.did:D608018C282068118A6D94CA2FB9BD94 xmp.did:D60880EA1BD5E21181C5AC231A2B216B xmp.did:D7176B6D58E0E011B95EDA3E835E31DF xmp.did:D7200B25316ADF11BBDBF2B8175EFA10 xmp.did:D736F40B6EEBDF119CE89B15806AEDB9 xmp.did:D76FEA384729681188C6BE54CC59F542 xmp.did:D7A082228321681188C696DC609994EC xmp.did:D83C6E8818206811871FBF7EE03058F8 xmp.did:D85DB58C20AAE011979696CECC20A286 xmp.did:D883498B272068118DBBF11625A05A5C xmp.did:D883D4C80775E011B3C9FB563EB9BBC3 xmp.did:D8D3659C0B20681188C6D9EA900BA018 xmp.did:D8FF4BF0AE71E01192CC8DA08924FABB xmp.did:D905C4C213206811822A95BF04DAE155 xmp.did:D9A628947F21681188C696DC609994EC xmp.did:DA30AD8C12206811910989406DF36966 xmp.did:DA3E09F6DA8211E1BE87EF578EF31FAB xmp.did:DA67C380402068118F62A588B3F859EB xmp.did:DABF1920E8E6E1119507C1B6640A63A6 xmp.did:DAC8507854D5DF11A094DF01E6EDE320 xmp.did:DB00867DC148E211975BE3F01A671811 xmp.did:DB1E4C1CE87ADF118CB7FEA7CD74D35B xmp.did:DB6BC860392168118F62F638EA26DDDD xmp.did:DBF226EE2D81E011A575FF8823ABA620 xmp.did:DC00867DC148E211975BE3F01A671811 xmp.did:DC4F4822108DE011A1C7E8C95E0A5A44 xmp.did:DC5F1D7EB557DF11A6E5DB9F6F6C55FC xmp.did:DC6570B46458DF1191428977A047BDAA xmp.did:DC74AD2D0C206811B1A4827FBE321FD6 xmp.did:DCC0E10A1F95DF11B30EEA8B8FA3A1BD xmp.did:DCC1853A3A216811AEE4ECC20A5D0880 xmp.did:DDAC2FAC1B206811AB08DC8C504A3F44 xmp.did:DE382B3B9D68DF11AEC1C82B050F8955 xmp.did:DEF63713352068118A6DCE218B785D1E xmp.did:DF899B466140E011AE5DE74C62F0E7EC xmp.did:E01E9F4F4EA111E09220D9ED97689A20 xmp.did:E02C190E426EDF11B24DE908ACCAC095 xmp.did:E06F786DFCB1DF1198DFB20F90D3AA6E xmp.did:E0D9104422A4E011926BAE6E10BDBFF1 xmp.did:E0DC5C40852068118F62D27A6BCE2F0B xmp.did:E18B6B7881AFDF11A99089F1760612D8 xmp.did:E1C9C41C142068118083BFAB8F3F6622 xmp.did:E1E03CF4017B11E1937E8BD9211F1F0D xmp.did:E2387CA9092068118A6DD7606065F06D xmp.did:E2421EC8A62068118DBBE9BB7FD2A0C8 xmp.did:E2E0DAC5E2EE11E0BE01E65A46588275 xmp.did:E2F26FF45DBFE111B99DF8E76F9ABF74 xmp.did:E2F3B2A11E2068119109C04F2B24B753 xmp.did:E31FFC57541211E0BD2AF927F2DB9596 xmp.did:E33EEECDC9F8E011A452DB8AC9648D02 xmp.did:E36553242020681192B0876F326BD696 xmp.did:E42882E8F6F211DFA418AE0B3A87249F xmp.did:E4D11ACAE40FDE118598AD22A001510A xmp.did:E5058D4E9E2BE0119DFC94F68E9FB408 xmp.did:E5120C9C0E6BDF11B4F18758ECB3026B xmp.did:E589A9A91D2068119553C5952A36A291 xmp.did:E5F40B46DD64DF11AEF4E21B49241302 xmp.did:E61653204488DF118E8FBD716AC90F65 xmp.did:E6A6562B112068118C14D3B8541D6FB9 xmp.did:E6C74BF40B206811BEDCEC12B17E052F xmp.did:E6EEAC66382068119109E4A43CE530D0 xmp.did:E7041F041F0F11E084C9A70103495335 xmp.did:E747C0F80F65DF119A94C5D8D188955B xmp.did:E794078DDE64DF118A53D4EFE20C3518 xmp.did:E7DD52641A19E01195F1BA474F2C0BAE xmp.did:E7EEAC66382068119109E4A43CE530D0 xmp.did:E8017BD55A3911E0A9D49A9EBFE78424 xmp.did:E812A371FC4CDF11BE559267F53A0BAF xmp.did:E83E8B283232E0118EE68999D946CEB1 xmp.did:E8C1560E9217E011AFFBA65419AF10CB xmp.did:E8F5DDBCEDB0E01191FFBD2DD96ABF07 xmp.did:E8FE6E6DE62E6811994C8EBF8F51C4A6 xmp.did:E9710C1D002FE01195828DEEC618B761 xmp.did:E9785F9708206811B3A9FA077BBC5C96 xmp.did:E9D7FE3B4D2068118083F286C739C2F9 xmp.did:E9F8E4BCC421681188C696DC609994EC xmp.did:EA0D6809B52468119604BD563ECECA8D xmp.did:EA1653204488DF118E8FBD716AC90F65 xmp.did:EA90CCE850216811AE56AF0821E747B2 xmp.did:EA92B2569ED8E0118842B29FA6343094 xmp.did:EAD2576A0D20681192B0FEBDA93E3C72 xmp.did:EAD3D6971220681188C69B8C88BD3CC1 xmp.did:EB9D13B8007C11E0A51DEB87967C265B xmp.did:EC1CAAE8441FE111952789A0D5E19759 xmp.did:EC47EBE89857DF11A6E5DB9F6F6C55FC xmp.did:EC867B3F342068119109909B64798A91 xmp.did:ECAA5F395A2368118F62F8E68BACEB90 xmp.did:ECD3D6971220681188C69B8C88BD3CC1 xmp.did:ECD989D5DF71E01186C4F2433814AC76 xmp.did:ED3E3D66EB7B11E0A5A9E0B0834D7800 xmp.did:ED7F1174072068119457FF348A38AABA xmp.did:EDB543427420681188C6D9EA900BA018 xmp.did:EE060BC9B174DF11B6A78A06DDE30A7A xmp.did:EE162A984C16DF1185C38799BDF561B5 xmp.did:EE693A7E1C2068118DBBB9F63A3FE05F xmp.did:EE9960205D0D11E28E38E0940CE424C6 xmp.did:EE9BFD521973E0118605B93E5BBA3B8C xmp.did:EEC1560E9217E011AFFBA65419AF10CB xmp.did:EED2576A0D20681192B0FEBDA93E3C72 xmp.did:EED3D6971220681188C69B8C88BD3CC1 xmp.did:EEE453CD12206811871FC58FD6F55664 xmp.did:EF0008E2E40911DFB5AAA6008D4E8DB8 xmp.did:EF8441C065E7DF11B8ABBBF7FFA6B0C4 xmp.did:EF9BFD521973E0118605B93E5BBA3B8C xmp.did:F0156A7F33206811871FBF7EE03058F8 xmp.did:F020252D40206811871FE8DD2340C0B0 xmp.did:F04377DB6C20681188C6D9EA900BA018 xmp.did:F064A1845D6E11E080EDF4F399B355AD xmp.did:F0B555145168E0118B1385B28F882E94 xmp.did:F0CA1CDE8020681192B0A9A85A8A7D16 xmp.did:F0D3D6971220681188C69B8C88BD3CC1 xmp.did:F0EC54C91EF0E011BF318C473C42BF32 xmp.did:F1281C1E22206811822ABDDE6FC4B71D xmp.did:F1440447726F11E1B4D898E7C6DC2DE0 xmp.did:F178F87B86206811BEB789E23D201984 xmp.did:F18F93CC6279E011A4D3C40ADA3B0913 xmp.did:F1C1092E02C2E01185C6B675C312A0F3 xmp.did:F22117C53520681180839613FFBBFAAC xmp.did:F2D3D6971220681188C69B8C88BD3CC1 xmp.did:F2D9C097D12DE011A4C39FDDCFC91B6D xmp.did:F348C3CCC40CE011972FEB89052F1F93 xmp.did:F3490D2C1921681188C6B7868B1364E8 xmp.did:F37F1174072068118F62DDDDAFF10DFB xmp.did:F39D39633289E1118849B8370FE74D24 xmp.did:F4BE07503650E01188FDFFA22DD2E1BF xmp.did:F5600DB9092068118083CC59682F5222 xmp.did:F57337FA1D206811808384D0F1D669E1 xmp.did:F5B5082B9B4311E192E9FD709E2209FE xmp.did:F5C288EE8C58E0118A6CFA0D378051C3 xmp.did:F5C949D4FB68DF11BB279F98F067360A xmp.did:F5C96B6611206811994C973DAB47318D xmp.did:F5CF8E2D7490E0119A18FB12BAA81907 xmp.did:F5F3271861E8E011A8B1E233584C880C xmp.did:F65EEB8B6B2068118083AC546C0EE525 xmp.did:F661D9FA8775E011B17A9E22BEA99AB9 xmp.did:F6CF60380D21681188C696DC609994EC xmp.did:F6F9C04A69ACE011A043E0338EFB7D23 xmp.did:F70C4FE61920681188C6E817E1445A54 xmp.did:F7308A261D206811871FBF7EE03058F8 xmp.did:F75D918A1120681192B08BEE29C75DD2 xmp.did:F77D6FDFE93311E1B505F01906542BBD xmp.did:F77D6FE3E93311E1B505F01906542BBD xmp.did:F77D6FE7E93311E1B505F01906542BBD xmp.did:F77F1174072068118016E3CF38EC96CC xmp.did:F77F11740720681180838FBAD129F239 xmp.did:F77F1174072068118083EB83C62BD7C1 xmp.did:F77F1174072068118083F5C1F4AE9621 xmp.did:F77F117407206811822A8CFF8F7B958E xmp.did:F77F117407206811822AC2D40AA7F8BA xmp.did:F77F117407206811822AFC260B154F81 xmp.did:F77F1174072068118603B4EB98C19FD1 xmp.did:F77F117407206811871F867F3B44C780 xmp.did:F77F117407206811871FAF8B0949E228 xmp.did:F77F117407206811871FCCB4A2ADB235 xmp.did:F77F117407206811871FE2FFC5A15DAA xmp.did:F77F117407206811871FE54CC1F6E823 xmp.did:F77F117407206811871FFE96F47936D6 xmp.did:F77F11740720681188C69E72FB9C9FD5 xmp.did:F77F11740720681188C6B07CC95C0538 xmp.did:F77F11740720681188C6D9EA900BA018 xmp.did:F77F11740720681188C6F83C91933163 xmp.did:F77F1174072068118A6D90E1FCEAAC55 xmp.did:F77F1174072068118A6D99D68D2699F7 xmp.did:F77F1174072068118A6DA93661469E78 xmp.did:F77F1174072068118A6DBA8381C39EEB xmp.did:F77F1174072068118A6DBB3238D4DB65 xmp.did:F77F1174072068118A6DBCFF8FBBF0B9 xmp.did:F77F1174072068118A6DCE44DE9A6594 xmp.did:F77F1174072068118A6DE0B41756505B xmp.did:F77F1174072068118A6DF43387500C21 xmp.did:F77F1174072068118BF792C16EE1E716 xmp.did:F77F1174072068118C14928747CA1A04 xmp.did:F77F1174072068118C14CD081E66E7E8 xmp.did:F77F1174072068118C14E9255BB07F2C xmp.did:F77F1174072068118DBBA8F193EBC78B xmp.did:F77F1174072068118DBBBF093A1DAA97 xmp.did:F77F1174072068118DC196984EFEC09F xmp.did:F77F1174072068118F1CFECA782915C6 xmp.did:F77F1174072068118F62EEA207DB2DFF xmp.did:F77F1174072068118F62FDBD9649A46B xmp.did:F77F1174072068119109862065E637A5 xmp.did:F77F1174072068119109A61C6B9B1188 xmp.did:F77F1174072068119109AA3891E71C20 xmp.did:F77F1174072068119109B80DD3093C00 xmp.did:F77F1174072068119109BC552EB79E12 xmp.did:F77F1174072068119109CC85AE74B274 xmp.did:F77F1174072068119109CD214D5A7EFE xmp.did:F77F1174072068119109EC839F3C61B6 xmp.did:F77F1174072068119109F8FE27718D5A xmp.did:F77F11740720681192B0A1AA0B2EFC15 xmp.did:F77F11740720681192B0E25DE3CF5EA6 xmp.did:F77F1174072068119457F53F102BBA12 xmp.did:F77F11740720681194FC8A3235E08E7E xmp.did:F77F11740720681195FEC1F5E62B59CE xmp.did:F77F11740720681195FEE3C51095942E xmp.did:F77F11740720681197A5E94B7C2456C1 xmp.did:F77F11740720681198E99BCF30868C79 xmp.did:F77F117407206811994C8A8243CF6DD5 xmp.did:F77F1174072068119B83CEEA27995AC4 xmp.did:F77F1174072068119C12FCC73F11446E xmp.did:F77F1174072068119EB8F890500830B9 xmp.did:F77F117407206811A178B4862A3AC2C7 xmp.did:F77F117407206811A52E8953DB82452D xmp.did:F77F117407206811A613FC07C3D4EEBA xmp.did:F77F117407206811A781EBFF837DF325 xmp.did:F77F117407206811A7BACE4D918669F7 xmp.did:F77F117407206811A9F8A44324AE3979 xmp.did:F77F117407206811AA7CEE1FC8B15BD5 xmp.did:F77F117407206811AB088ED073FBA775 xmp.did:F77F117407206811AE56D6748533125F xmp.did:F77F117407206811AEE1E85804F1BC1E xmp.did:F77F117407206811B516B5B451545A40 xmp.did:F77F117407206811B5669AC054FE53DD xmp.did:F77F117407206811B5FEC38E6EA09CBA xmp.did:F77F117407206811B823B27E8187C0A8 xmp.did:F77F117407206811BA24F97E9D027B47 xmp.did:F77F117407206811BAFDD8C559CCB40F xmp.did:F77F117407206811BB8EE28C44C74A0A xmp.did:F77F117407206811BEDCA708FFA8A08A xmp.did:F77F117407206811BF8EAA6E2CF6254A xmp.did:F7A270C2A7A3DF119F139B952251B991 xmp.did:F7CF60380D21681188C696DC609994EC xmp.did:F87F117407206811808384D0F1D669E1 xmp.did:F87F117407206811808386F774EDA757 xmp.did:F87F117407206811808399331810C790 xmp.did:F87F117407206811822AC478A9276ED4 xmp.did:F87F11740720681188C6956C521FE498 xmp.did:F87F1174072068118A6DBB3238D4DB65 xmp.did:F87F1174072068118C1482C953781ED9 xmp.did:F87F1174072068118C1499CEFB83A67B xmp.did:F87F1174072068118DBBBF093A1DAA97 xmp.did:F87F1174072068119109AAFB9F469FD0 xmp.did:F87F117407206811994CA9A71151591E xmp.did:F87F1174072068119CD4DB2985335F93 xmp.did:F87F117407206811A138D837490E6437 xmp.did:F87F117407206811B4E49E03AC4C228B xmp.did:F87F117407206811B9B1DE3DF693708F xmp.did:F88F820B1420681188C6D9EA900BA018 xmp.did:F8B1200EC82068118F62B55C94B5F1CA xmp.did:F8BC412B0C2068119109C80A4C3147BC xmp.did:F8C58836202368119AA4FC7100F2C672 xmp.did:F8E327E22F21681188C696DC609994EC xmp.did:F92117C53520681180839613FFBBFAAC xmp.did:F94377DB6C20681188C6D9EA900BA018 xmp.did:F974D8AD50E3DE119B98A0D1FCBA1444 xmp.did:F9760D1D9B4211E1BDF8AB7E2919F0A2 xmp.did:F97F1174072068118083EB83C62BD7C1 xmp.did:F97F117407206811871FEB8DB824A23C xmp.did:F97F11740720681188C6956C521FE498 xmp.did:F97F1174072068118A6DF1EB259C6C29 xmp.did:F97F1174072068118C14886BEA417E94 xmp.did:F97F1174072068118C14F8EC1C27609B xmp.did:F97F1174072068118DBBB19E0C24AE1C xmp.did:F97F1174072068118DBBEB69C03E24DA xmp.did:F97F1174072068118DBBF1EFF81BD277 xmp.did:F99A94C85A2068119457B4E8E216C3A8 xmp.did:F9BD06E86176E011BBC0D959D25D44FD xmp.did:F9D2BC0A0398DF118E0DFBCC39F1D70C xmp.did:FA130DF832216811B6D09349CCF4BD48 xmp.did:FA7F117407206811822AC411053758AF xmp.did:FA7F1174072068118C14AF6C9BD96AB9 xmp.did:FA7F1174072068118F628C4A209C8985 xmp.did:FA7F1174072068119D68B0A7E60C0F5F xmp.did:FA7F117407206811A964A31DC56DDF2F xmp.did:FACF60380D21681188C696DC609994EC xmp.did:FAFBB512432668118DBBFC31635E93B6 xmp.did:FB1A20AB659BE011913BB35C5E38BF39 xmp.did:FB2B2121D016E11180D1BBB1A0D9259F xmp.did:FB2E2AA02D15E1118308D89485463889 xmp.did:FB536F21AB21681188C696DC609994EC xmp.did:FB7F1174072068118603AD4B49AD7764 xmp.did:FB7F117407206811871FEEA6EC09A2E5 xmp.did:FB7F11740720681188C6CC16CFB2376C xmp.did:FB7F1174072068118F628504B14915F2 xmp.did:FB7F1174072068118F62B4C0222208FE xmp.did:FB7F11740720681192B0A1AA0B2EFC15 xmp.did:FB7F11740720681192B0A6951AA679E5 xmp.did:FB7F11740720681192B0DC8DC9EE0D67 xmp.did:FB7F11740720681197A58C87B58F4D68 xmp.did:FB9AB60C0BE6DF119976D66446F575DC xmp.did:FBC4D2040A2068119109CC642C44EC0C xmp.did:FBF99EB7567DDF11A74EE6CE03994422 xmp.did:FBF99FCCEA61DF11B23FC8C2DC80D41E xmp.did:FC6F0BD5F22FE111835FCEA6CCEB95E2 xmp.did:FC7F1174072068118A6DBB3238D4DB65 xmp.did:FC7F1174072068118A6DBEF0F202E5F4 xmp.did:FC7F1174072068118A6DF3C73496F8E5 xmp.did:FC7F1174072068118DBBF11625A05A5C xmp.did:FC7F1174072068118F62D51A6DC08DF3 xmp.did:FC7F117407206811AD43B1EC353D4389 xmp.did:FC7F117407206811AE568088196B6FA8 xmp.did:FC9AB60C0BE6DF119976D66446F575DC xmp.did:FCEB59718E206811871FBF7EE03058F8 xmp.did:FD7F11740720681182FE98EF7F18BF1D xmp.did:FD7F117407206811A178B4862A3AC2C7 xmp.did:FD7F117407206811BF24C98FA878C053 xmp.did:FD9AB60C0BE6DF119976D66446F575DC xmp.did:FE7F1174072068118083BAFDA65F8430 xmp.did:FE7F1174072068118083E4FF021AA64B xmp.did:FE7F1174072068118F62DD804FF26847 xmp.did:FE7F117407206811A961E68EEDC136C8 xmp.did:FE8F876C7E2168118F62E601B48A9F82 xmp.did:FEC52D397663DF11B26194DD13427F8B xmp.did:FF3550F002AD11E18740F64E75AD4D2A xmp.did:FF7F11740720681192B0DCE86BF657A9 1 720000/10000 720000/10000 2 1 16 16 v cHRMz%u0`:o_F3IDATxڤӽJ\Q\!%AB`@R7p&V),H7AV h "bDG*nεAUZCUUAKFmjWOqO$XBl[PC96";o1O=8ܗ b氈UXy)l_ VBV!zOXdqQStYdg$N;\Ek1Op]v"y(ᘧk q~ê[uI^%!<ƪyFmjoZmRo\os_uln~?WIENDB`i.Q !3smartSEO/modules/on_page_optimization/assets/32.png obPNG  IHDR szz'IDATx^Ֆ}PTƟ², "?,J%1h R81qkhmt&SfDZS51~4Z"5bՂȨ.޽?aos{-ƍK,L5jl˓/6~*iiiz\2kW*`ZtL_Q+ݞV>X|]}Clp{NL$C&yx{{J\E&Jh2 C+U 9teDXcHjYZ'1Ohsb縸8w.u/cIE^3cTVVvdhm!u#0\څ)%^P+CfHb+M:ٔQ*5o 7#qh<|⋳,1cx/dZݻux K!vogH푥< 6i27ŋMޮBtJJJT~~~:W^{Nyۢ{-x#'AQWyʗkdph[ p5lb'QWD*0X|]}Clp{NL$C&yx{{J\E&Jh2 C+U 9teDXcHjYZ'1Ohsb縸8w.u/cIE^3cTVVvdhm!u#0\څ)%^P+CfHb+M:ٔQ*5o 7#qh<|⋳,1cx/dZݻux K!vogH푥< 6i27ŋMޮBtJJJT~~~:W^{Nyۢ{-x#'AQWyʗkdph[ p5lb'QWD*0= 0) this._delimiters[whitespace] = '\\s' if (dash >= 0) { delete this._delimiters[dash] this._delimiters.unshift('-') } var specialCharacters = ['\\', '$', '[', '{', '^', '.', '|', '?', '*', '+', '(', ')'] $.each(this._delimiters, function (index, character) { var pos = $.inArray(character, specialCharacters) if (pos >= 0) _self._delimiters[index] = '\\' + character; }); //:::::::::::::::::::::::::::::::::::::::::::::::::::::::: // start bug fix //http://stackoverflow.com/questions/754607/ //try { styleSheet[cssRules].length; } catch(err) { return; } function css(a) { var sheets = document.styleSheets, o = {}; for (var i in sheets) { try { sheets[i][cssRules].length; } catch(err) { continue; } var rules = sheets[i].rules || sheets[i].cssRules; for (var r in rules) { if (a.is(rules[r].selectorText)) { o = $.extend(o, css2json(rules[r].style), css2json(a.attr('style'))); } } } return o; } function css2json(css) { var s = {}; if (!css) return s; if (css instanceof CSSStyleDeclaration) { for (var i in css) { if ((css[i]).toLowerCase) { s[(css[i]).toLowerCase()] = (css[css[i]]); } } } else if (typeof css == "string") { css = css.split("; "); for (var i in css) { var l = css[i].split(": "); s[l[0].toLowerCase()] = (l[1]); } } return s; } // Store original input width /* var elRules = (window && typeof window.getMatchedCSSRules === 'function') ? window.getMatchedCSSRules( element ) : null , elStyleWidth = element.style.width , elCSSWidth , elWidth = this.$element.width() if (elRules) { $.each( elRules, function (i, rule) { if (rule.style.width) { elCSSWidth = rule.style.width; } }); } */ var elStyleWidth = element.style.width, elCSSWidth = css( $(element ) ).width, elWidth = this.$element.width(); // end bug fix //:::::::::::::::::::::::::::::::::::::::::::::::::::::::: // Move original input out of the way var hidingPosition = $('body').css('direction') === 'rtl' ? 'right' : 'left', originalStyles = { position: this.$element.css('position') }; originalStyles[hidingPosition] = this.$element.css(hidingPosition); this.$element .data('original-styles', originalStyles) .data('original-tabindex', this.$element.prop('tabindex')) .css('position', 'absolute') .css(hidingPosition, '-10000px') .prop('tabindex', -1) // Create a wrapper this.$wrapper = $('
    ') if (this.$element.hasClass('input-lg')) this.$wrapper.addClass('input-lg') if (this.$element.hasClass('input-sm')) this.$wrapper.addClass('input-sm') if (this.textDirection === 'rtl') this.$wrapper.addClass('rtl') // Create a new input var id = this.$element.prop('id') || new Date().getTime() + '' + Math.floor((1 + Math.random()) * 100) this.$input = $('') .appendTo( this.$wrapper ) .prop( 'placeholder', this.$element.prop('placeholder') ) .prop( 'id', id + '-tokenfield' ) .prop( 'tabindex', this.$element.data('original-tabindex') ) // Re-route original input label to new input var $label = $( 'label[for="' + this.$element.prop('id') + '"]' ) if ( $label.length ) { $label.prop( 'for', this.$input.prop('id') ) } // Set up a copy helper to handle copy & paste this.$copyHelper = $('').css('position', 'absolute').css(hidingPosition, '-10000px').prop('tabindex', -1).prependTo( this.$wrapper ) // Set wrapper width if (elStyleWidth) { this.$wrapper.css('width', elStyleWidth); } else if (elCSSWidth) { this.$wrapper.css('width', elCSSWidth); } // If input is inside inline-form with no width set, set fixed width else if (this.$element.parents('.form-inline').length) { this.$wrapper.width( elWidth ) } // Set tokenfield disabled, if original or fieldset input is disabled if (this.$element.prop('disabled') || this.$element.parents('fieldset[disabled]').length) { this.disable(); } // Set tokenfield readonly, if original input is readonly if (this.$element.prop('readonly')) { this.readonly(); } // Set up mirror for input auto-sizing this.$mirror = $(''); this.$input.css('min-width', this.options.minWidth + 'px') $.each([ 'fontFamily', 'fontSize', 'fontWeight', 'fontStyle', 'letterSpacing', 'textTransform', 'wordSpacing', 'textIndent' ], function (i, val) { _self.$mirror[0].style[val] = _self.$input.css(val); }); this.$mirror.appendTo( 'body' ) // Insert tokenfield to HTML this.$wrapper.insertBefore( this.$element ) this.$element.prependTo( this.$wrapper ) // Calculate inner input width this.update() // Create initial tokens, if any this.setTokens(this.options.tokens, false, ! this.$element.val() && this.options.tokens ) // Start listening to events this.listen() // Initialize autocomplete, if necessary if ( ! $.isEmptyObject( this.options.autocomplete ) ) { var side = this.textDirection === 'rtl' ? 'right' : 'left' , autocompleteOptions = $.extend({ minLength: this.options.showAutocompleteOnFocus ? 0 : null, position: { my: side + " top", at: side + " bottom", of: this.$wrapper } }, this.options.autocomplete ) this.$input.autocomplete( autocompleteOptions ) } // Initialize typeahead, if necessary if ( ! $.isEmptyObject( this.options.typeahead ) ) { var typeaheadOptions = this.options.typeahead , defaults = { minLength: this.options.showAutocompleteOnFocus ? 0 : null } , args = $.isArray( typeaheadOptions ) ? typeaheadOptions : [typeaheadOptions, typeaheadOptions] args[0] = $.extend( {}, defaults, args[0] ) this.$input.typeahead.apply( this.$input, args ) this.$hint = this.$input.prev('.tt-hint') this.typeahead = true } } Tokenfield.prototype = { constructor: Tokenfield , createToken: function (attrs, triggerChange) { var _self = this if (typeof attrs === 'string') { attrs = { value: attrs, label: attrs } } else { // Copy objects to prevent contamination of data sources. attrs = $.extend( {}, attrs ) } if (typeof triggerChange === 'undefined') { triggerChange = true } // Normalize label and value attrs.value = $.trim(attrs.value.toString()); attrs.label = attrs.label && attrs.label.length ? $.trim(attrs.label) : attrs.value // Bail out if has no value or label, or label is too short if (!attrs.value.length || !attrs.label.length || attrs.label.length <= this.options.minLength) return // Bail out if maximum number of tokens is reached if (this.options.limit && this.getTokens().length >= this.options.limit) return // Allow changing token data before creating it var createEvent = $.Event('tokenfield:createtoken', { attrs: attrs }) this.$element.trigger(createEvent) // Bail out if there if attributes are empty or event was defaultPrevented if (!createEvent.attrs || createEvent.isDefaultPrevented()) return var $token = $('
    ') .append('') .append('×') .data('attrs', attrs) // Insert token into HTML if (this.$input.hasClass('tt-input')) { // If the input has typeahead enabled, insert token before it's parent this.$input.parent().before( $token ) } else { this.$input.before( $token ) } // Temporarily set input width to minimum this.$input.css('width', this.options.minWidth + 'px') var $tokenLabel = $token.find('.token-label') , $closeButton = $token.find('.close') // Determine maximum possible token label width if (!this.maxTokenWidth) { //console.log( this.$wrapper, this.$wrapper.width(), this.$wrapper.outerWidth(), $closeButton.outerWidth() ); this.maxTokenWidth = this.$wrapper.width() - $closeButton.outerWidth() - parseInt($closeButton.css('margin-left'), 10) - parseInt($closeButton.css('margin-right'), 10) - parseInt($token.css('border-left-width'), 10) - parseInt($token.css('border-right-width'), 10) - parseInt($token.css('padding-left'), 10) - parseInt($token.css('padding-right'), 10) parseInt($tokenLabel.css('border-left-width'), 10) - parseInt($tokenLabel.css('border-right-width'), 10) - parseInt($tokenLabel.css('padding-left'), 10) - parseInt($tokenLabel.css('padding-right'), 10) parseInt($tokenLabel.css('margin-left'), 10) - parseInt($tokenLabel.css('margin-right'), 10) } $tokenLabel .text(attrs.label) .css('max-width', this.maxTokenWidth) // Listen to events on token $token .on('mousedown', function (e) { if (_self._disabled || _self._readonly) return false _self.preventDeactivation = true }) .on('click', function (e) { if (_self._disabled || _self._readonly) return false _self.preventDeactivation = false if (e.ctrlKey || e.metaKey) { e.preventDefault() return _self.toggle( $token ) } _self.activate( $token, e.shiftKey, e.shiftKey ) }) .on('dblclick', function (e) { if (_self._disabled || _self._readonly || !_self.options.allowEditing ) return false _self.edit( $token ) }) $closeButton .on('click', $.proxy(this.remove, this)) // Trigger createdtoken event on the original field // indicating that the token is now in the DOM this.$element.trigger($.Event('tokenfield:createdtoken', { attrs: attrs, relatedTarget: $token.get(0) })) // Trigger change event on the original field if (triggerChange) { this.$element.val( this.getTokensList() ).trigger( $.Event('change', { initiator: 'tokenfield' }) ) } // Update tokenfield dimensions this.update() // Return original element return this.$element.get(0) } , setTokens: function (tokens, add, triggerChange) { if (!tokens) return if (!add) this.$wrapper.find('.token').remove() if (typeof triggerChange === 'undefined') { triggerChange = true } if (typeof tokens === 'string') { if (this._delimiters.length) { // Split based on delimiters tokens = tokens.split( new RegExp( '[' + this._delimiters.join('') + ']' ) ) } else { tokens = [tokens]; } } var _self = this $.each(tokens, function (i, attrs) { _self.createToken(attrs, triggerChange) }) return this.$element.get(0) } , getTokenData: function($token) { var data = $token.map(function() { var $token = $(this); return $token.data('attrs') }).get(); if (data.length == 1) { data = data[0]; } return data; } , getTokens: function(active) { var self = this , tokens = [] , activeClass = active ? '.active' : '' // get active tokens only this.$wrapper.find( '.token' + activeClass ).each( function() { tokens.push( self.getTokenData( $(this) ) ) }) return tokens } , getTokensList: function(delimiter, beautify, active) { delimiter = delimiter || this._firstDelimiter beautify = ( typeof beautify !== 'undefined' && beautify !== null ) ? beautify : this.options.beautify var separator = delimiter + ( beautify && delimiter !== ' ' ? ' ' : '') return $.map( this.getTokens(active), function (token) { return token.value }).join(separator) } , getInput: function() { return this.$input.val() } , listen: function () { var _self = this this.$element .on('change', $.proxy(this.change, this)) this.$wrapper .on('mousedown',$.proxy(this.focusInput, this)) this.$input .on('focus', $.proxy(this.focus, this)) .on('blur', $.proxy(this.blur, this)) .on('paste', $.proxy(this.paste, this)) .on('keydown', $.proxy(this.keydown, this)) .on('keypress', $.proxy(this.keypress, this)) .on('keyup', $.proxy(this.keyup, this)) this.$copyHelper .on('focus', $.proxy(this.focus, this)) .on('blur', $.proxy(this.blur, this)) .on('keydown', $.proxy(this.keydown, this)) .on('keyup', $.proxy(this.keyup, this)) // Secondary listeners for input width calculation this.$input .on('keypress', $.proxy(this.update, this)) .on('keyup', $.proxy(this.update, this)) this.$input .on('autocompletecreate', function() { // Set minimum autocomplete menu width var $_menuElement = $(this).data('ui-autocomplete').menu.element var minWidth = _self.$wrapper.outerWidth() - parseInt( $_menuElement.css('border-left-width'), 10 ) - parseInt( $_menuElement.css('border-right-width'), 10 ) $_menuElement.css( 'min-width', minWidth + 'px' ) }) .on('autocompleteselect', function (e, ui) { if (_self.createToken( ui.item )) { _self.$input.val('') if (_self.$input.data( 'edit' )) { _self.unedit(true) } } return false }) .on('typeahead:selected typeahead:autocompleted', function (e, datum, dataset) { // Create token if (_self.createToken( datum )) { _self.$input.typeahead('val', '') if (_self.$input.data( 'edit' )) { _self.unedit(true) } } }) // Listen to window resize $(window).on('resize', $.proxy(this.update, this )) } , keydown: function (e) { if (!this.focused) return var _self = this switch(e.keyCode) { case 8: // backspace if (!this.$input.is(document.activeElement)) break this.lastInputValue = this.$input.val() break case 37: // left arrow leftRight( this.textDirection === 'rtl' ? 'next': 'prev' ) break case 38: // up arrow upDown('prev') break case 39: // right arrow leftRight( this.textDirection === 'rtl' ? 'prev': 'next' ) break case 40: // down arrow upDown('next') break case 65: // a (to handle ctrl + a) if (this.$input.val().length > 0 || !(e.ctrlKey || e.metaKey)) break this.activateAll() e.preventDefault() break case 9: // tab case 13: // enter // We will handle creating tokens from autocomplete in autocomplete events if (this.$input.data('ui-autocomplete') && this.$input.data('ui-autocomplete').menu.element.find("li:has(a.ui-state-focus), li.ui-state-focus").length) break // We will handle creating tokens from typeahead in typeahead events if (this.$input.hasClass('tt-input') && this.$wrapper.find('.tt-cursor').length ) break if (this.$input.hasClass('tt-input') && this.$wrapper.find('.tt-hint').val() && this.$wrapper.find('.tt-hint').val().length) break // Create token if (this.$input.is(document.activeElement) && this.$input.val().length || this.$input.data('edit')) { return this.createTokensFromInput(e, this.$input.data('edit')); } // Edit token if (e.keyCode === 13) { if (!this.$copyHelper.is(document.activeElement) || this.$wrapper.find('.token.active').length !== 1) break if (!_self.options.allowEditing) break this.edit( this.$wrapper.find('.token.active') ) } } function leftRight(direction) { if (_self.$input.is(document.activeElement)) { if (_self.$input.val().length > 0) return direction += 'All' var $token = _self.$input.hasClass('tt-input') ? _self.$input.parent()[direction]('.token:first') : _self.$input[direction]('.token:first') if (!$token.length) return _self.preventInputFocus = true _self.preventDeactivation = true _self.activate( $token ) e.preventDefault() } else { _self[direction]( e.shiftKey ) e.preventDefault() } } function upDown(direction) { if (!e.shiftKey) return if (_self.$input.is(document.activeElement)) { if (_self.$input.val().length > 0) return var $token = _self.$input.hasClass('tt-input') ? _self.$input.parent()[direction + 'All']('.token:first') : _self.$input[direction + 'All']('.token:first') if (!$token.length) return _self.activate( $token ) } var opposite = direction === 'prev' ? 'next' : 'prev' , position = direction === 'prev' ? 'first' : 'last' _self.$firstActiveToken[opposite + 'All']('.token').each(function() { _self.deactivate( $(this) ) }) _self.activate( _self.$wrapper.find('.token:' + position), true, true ) e.preventDefault() } this.lastKeyDown = e.keyCode } , keypress: function(e) { // Comma if ($.inArray( e.which, this._triggerKeys) !== -1 && this.$input.is(document.activeElement)) { if (this.$input.val()) { this.createTokensFromInput(e) } return false; } } , keyup: function (e) { this.preventInputFocus = false if (!this.focused) return switch(e.keyCode) { case 8: // backspace if (this.$input.is(document.activeElement)) { if (this.$input.val().length || this.lastInputValue.length && this.lastKeyDown === 8) break this.preventDeactivation = true var $prevToken = this.$input.hasClass('tt-input') ? this.$input.parent().prevAll('.token:first') : this.$input.prevAll('.token:first') if (!$prevToken.length) break this.activate( $prevToken ) } else { this.remove(e) } break case 46: // delete this.remove(e, 'next') break } this.lastKeyUp = e.keyCode } , focus: function (e) { this.focused = true this.$wrapper.addClass('focus') if (this.$input.is(document.activeElement)) { this.$wrapper.find('.active').removeClass('active') this.$firstActiveToken = null if (this.options.showAutocompleteOnFocus) { this.search() } } } , blur: function (e) { this.focused = false this.$wrapper.removeClass('focus') if (!this.preventDeactivation && !this.$element.is(document.activeElement)) { this.$wrapper.find('.active').removeClass('active') this.$firstActiveToken = null } if (!this.preventCreateTokens && (this.$input.data('edit') && !this.$input.is(document.activeElement) || this.options.createTokensOnBlur )) { this.createTokensFromInput(e) } this.preventDeactivation = false this.preventCreateTokens = false } , paste: function (e) { var _self = this // Add tokens to existing ones if (_self.options.allowPasting) { setTimeout(function () { _self.createTokensFromInput(e) }, 1) } } , change: function (e) { if ( e.initiator === 'tokenfield' ) return // Prevent loops this.setTokens( this.$element.val() ) } , createTokensFromInput: function (e, focus) { if (this.$input.val().length < this.options.minLength) return // No input, simply return var tokensBefore = this.getTokensList() this.setTokens( this.$input.val(), true ) if (tokensBefore == this.getTokensList() && this.$input.val().length) return false // No tokens were added, do nothing (prevent form submit) if (this.$input.hasClass('tt-input')) { // Typeahead acts weird when simply setting input value to empty, // so we set the query to empty instead this.$input.typeahead('val', '') } else { this.$input.val('') } if (this.$input.data( 'edit' )) { this.unedit(focus) } return false // Prevent form being submitted } , next: function (add) { if (add) { var $firstActiveToken = this.$wrapper.find('.active:first') , deactivate = $firstActiveToken && this.$firstActiveToken ? $firstActiveToken.index() < this.$firstActiveToken.index() : false if (deactivate) return this.deactivate( $firstActiveToken ) } var $lastActiveToken = this.$wrapper.find('.active:last') , $nextToken = $lastActiveToken.nextAll('.token:first') if (!$nextToken.length) { this.$input.focus() return } this.activate($nextToken, add) } , prev: function (add) { if (add) { var $lastActiveToken = this.$wrapper.find('.active:last') , deactivate = $lastActiveToken && this.$firstActiveToken ? $lastActiveToken.index() > this.$firstActiveToken.index() : false if (deactivate) return this.deactivate( $lastActiveToken ) } var $firstActiveToken = this.$wrapper.find('.active:first') , $prevToken = $firstActiveToken.prevAll('.token:first') if (!$prevToken.length) { $prevToken = this.$wrapper.find('.token:first') } if (!$prevToken.length && !add) { this.$input.focus() return } this.activate( $prevToken, add ) } , activate: function ($token, add, multi, remember) { if (!$token) return if (typeof remember === 'undefined') var remember = true if (multi) var add = true this.$copyHelper.focus() if (!add) { this.$wrapper.find('.active').removeClass('active') if (remember) { this.$firstActiveToken = $token } else { delete this.$firstActiveToken } } if (multi && this.$firstActiveToken) { // Determine first active token and the current tokens indicies // Account for the 1 hidden textarea by subtracting 1 from both var i = this.$firstActiveToken.index() - 2 , a = $token.index() - 2 , _self = this this.$wrapper.find('.token').slice( Math.min(i, a) + 1, Math.max(i, a) ).each( function() { _self.activate( $(this), true ) }) } $token.addClass('active') this.$copyHelper.val( this.getTokensList( null, null, true ) ).select() } , activateAll: function() { var _self = this this.$wrapper.find('.token').each( function (i) { _self.activate($(this), i !== 0, false, false) }) } , deactivate: function($token) { if (!$token) return $token.removeClass('active') this.$copyHelper.val( this.getTokensList( null, null, true ) ).select() } , toggle: function($token) { if (!$token) return $token.toggleClass('active') this.$copyHelper.val( this.getTokensList( null, null, true ) ).select() } , edit: function ($token) { if (!$token) return var attrs = $token.data('attrs') // Allow changing input value before editing var options = { attrs: attrs, relatedTarget: $token.get(0) } var editEvent = $.Event('tokenfield:edittoken', options) this.$element.trigger( editEvent ) // Edit event can be cancelled if default is prevented if (editEvent.isDefaultPrevented()) return $token.find('.token-label').text(attrs.value) var tokenWidth = $token.outerWidth() var $_input = this.$input.hasClass('tt-input') ? this.$input.parent() : this.$input $token.replaceWith( $_input ) this.preventCreateTokens = true this.$input.val( attrs.value ) .select() .data( 'edit', true ) .width( tokenWidth ) this.update(); // Indicate that token is now being edited, and is replaced with an input field in the DOM this.$element.trigger($.Event('tokenfield:editedtoken', options )) } , unedit: function (focus) { var $_input = this.$input.hasClass('tt-input') ? this.$input.parent() : this.$input $_input.appendTo( this.$wrapper ) this.$input.data('edit', false) this.$mirror.text('') this.update() // Because moving the input element around in DOM // will cause it to lose focus, we provide an option // to re-focus the input after appending it to the wrapper if (focus) { var _self = this setTimeout(function () { _self.$input.focus() }, 1) } } , remove: function (e, direction) { if (this.$input.is(document.activeElement) || this._disabled || this._readonly) return var $token = (e.type === 'click') ? $(e.target).closest('.token') : this.$wrapper.find('.token.active') if (e.type !== 'click') { if (!direction) var direction = 'prev' this[direction]() // Was it the first token? if (direction === 'prev') var firstToken = $token.first().prevAll('.token:first').length === 0 } // Prepare events and their options var options = { attrs: this.getTokenData( $token ), relatedTarget: $token.get(0) } , removeEvent = $.Event('tokenfield:removetoken', options) this.$element.trigger(removeEvent); // Remove event can be intercepted and cancelled if (removeEvent.isDefaultPrevented()) return var removedEvent = $.Event('tokenfield:removedtoken', options) , changeEvent = $.Event('change', { initiator: 'tokenfield' }) // Remove token from DOM $token.remove() // Trigger events this.$element.val( this.getTokensList() ).trigger( removedEvent ).trigger( changeEvent ) // Focus, when necessary: // When there are no more tokens, or if this was the first token // and it was removed with backspace or it was clicked on if (!this.$wrapper.find('.token').length || e.type === 'click' || firstToken) this.$input.focus() // Adjust input width this.$input.css('width', this.options.minWidth + 'px') this.update() // Cancel original event handlers e.preventDefault() e.stopPropagation() } /** * Update tokenfield dimensions */ , update: function (e) { var value = this.$input.val() , inputPaddingLeft = parseInt(this.$input.css('padding-left'), 10) , inputPaddingRight = parseInt(this.$input.css('padding-right'), 10) , inputPadding = inputPaddingLeft + inputPaddingRight if (this.$input.data('edit')) { if (!value) { value = this.$input.prop("placeholder") } if (value === this.$mirror.text()) return this.$mirror.text(value) var mirrorWidth = this.$mirror.width() + 10; if ( mirrorWidth > this.$wrapper.width() ) { return this.$input.width( this.$wrapper.width() ) } this.$input.width( mirrorWidth ) if (this.$hint) { this.$hint.width( mirrorWidth ) } } else { var w = (this.textDirection === 'rtl') ? this.$input.offset().left + this.$input.outerWidth() - this.$wrapper.offset().left - parseInt(this.$wrapper.css('padding-left'), 10) - inputPadding - 1 : this.$wrapper.offset().left + this.$wrapper.width() + parseInt(this.$wrapper.css('padding-left'), 10) - this.$input.offset().left - inputPadding; // // some usecases pre-render widget before attaching to DOM, // dimensions returned by jquery will be NaN -> we default to 100% // so placeholder won't be cut off. isNaN(w) ? this.$input.width('100%') : this.$input.width(w); if (this.$hint) { isNaN(w) ? this.$hint.width('100%') : this.$hint.width(w); } } } , focusInput: function (e) { if ( $(e.target).closest('.token').length || $(e.target).closest('.token-input').length || $(e.target).closest('.tt-dropdown-menu').length ) return // Focus only after the current call stack has cleared, // otherwise has no effect. // Reason: mousedown is too early - input will lose focus // after mousedown. However, since the input may be moved // in DOM, there may be no click or mouseup event triggered. var _self = this setTimeout(function() { _self.$input.focus() }, 0) } , search: function () { if ( this.$input.data('ui-autocomplete') ) { this.$input.autocomplete('search') } } , disable: function () { this.setProperty('disabled', true); } , enable: function () { this.setProperty('disabled', false); } , readonly: function () { this.setProperty('readonly', true); } , writeable: function () { this.setProperty('readonly', false); } , setProperty: function(property, value) { this['_' + property] = value; this.$input.prop(property, value); this.$element.prop(property, value); this.$wrapper[ value ? 'addClass' : 'removeClass' ](property); } , destroy: function() { // Set field value this.$element.val( this.getTokensList() ); // Restore styles and properties this.$element.css( this.$element.data('original-styles') ); this.$element.prop( 'tabindex', this.$element.data('original-tabindex') ); // Re-route tokenfield label to original input var $label = $( 'label[for="' + this.$input.prop('id') + '"]' ) if ( $label.length ) { $label.prop( 'for', this.$element.prop('id') ) } // Move original element outside of tokenfield wrapper this.$element.insertBefore( this.$wrapper ); // Remove tokenfield-related data this.$element.removeData('original-styles') .removeData('original-tabindex') .removeData('bs.tokenfield'); // Remove tokenfield from DOM this.$wrapper.remove(); this.$mirror.remove(); var $_element = this.$element; return $_element; } } /* TOKENFIELD PLUGIN DEFINITION * ======================== */ var old = $.fn.tokenfield $.fn.tokenfield = function (option, param) { var value , args = [] Array.prototype.push.apply( args, arguments ); var elements = this.each(function () { var $this = $(this) , data = $this.data('bs.tokenfield') , options = typeof option == 'object' && option if (typeof option === 'string' && data && data[option]) { args.shift() value = data[option].apply(data, args) } else { if (!data && typeof option !== 'string' && !param) { $this.data('bs.tokenfield', (data = new Tokenfield(this, options))) $this.trigger('tokenfield:initialize') } } }) return typeof value !== 'undefined' ? value : elements; } $.fn.tokenfield.defaults = { minWidth: 60, minLength: 0, allowEditing: true, allowPasting: true, limit: 0, autocomplete: {}, typeahead: {}, showAutocompleteOnFocus: false, createTokensOnBlur: false, delimiter: ',', beautify: true, inputType: 'text' } $.fn.tokenfield.Constructor = Tokenfield /* TOKENFIELD NO CONFLICT * ================== */ $.fn.tokenfield.noConflict = function () { $.fn.tokenfield = old return this } return Tokenfield; })); :u 䂀WsmartSEO/modules/on_page_optimization/bootstrap-tokenfield/bootstrap-tokenfield.min.css ob/*! * bootstrap-tokenfield * https://github.com/sliptree/bootstrap-tokenfield * Copyright 2013-2014 Sliptree and other contributors; Licensed MIT */@-webkit-keyframes blink{0%{border-color:#ededed}100%{border-color:#b94a48}}@-moz-keyframes blink{0%{border-color:#ededed}100%{border-color:#b94a48}}@keyframes blink{0%{border-color:#ededed}100%{border-color:#b94a48}}.tokenfield{height:auto;min-height:34px;padding-bottom:0}.tokenfield.focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.tokenfield .token{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;display:inline-block;border:1px solid #d9d9d9;background-color:#ededed;white-space:nowrap;margin:-1px 5px 5px 0;height:22px;vertical-align:top;cursor:default}.tokenfield .token:hover{border-color:#b9b9b9}.tokenfield .token.active{border-color:#52a8ec;border-color:rgba(82,168,236,.8)}.tokenfield .token.duplicate{border-color:#ebccd1;-webkit-animation-name:blink;animation-name:blink;-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-direction:normal;animation-direction:normal;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.tokenfield .token.invalid{background:0 0;border:1px solid transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border-bottom:1px dotted #d9534f}.tokenfield .token.invalid.active{background:#ededed;border:1px solid #ededed;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.tokenfield .token .token-label{display:inline-block;overflow:hidden;text-overflow:ellipsis;padding-left:4px;vertical-align:top}.tokenfield .token .close{font-family:Arial;display:inline-block;line-height:100%;font-size:1.1em;line-height:1.49em;margin-left:5px;float:none;height:100%;vertical-align:top;padding-right:4px}.tokenfield .token-input{background:0 0;width:60px;min-width:60px;border:0;height:20px;padding:0;margin-bottom:6px;-webkit-box-shadow:none;box-shadow:none}.tokenfield .token-input:focus{border-color:transparent;outline:0;-webkit-box-shadow:none;box-shadow:none}.tokenfield.disabled{cursor:not-allowed;background-color:#eee}.tokenfield.disabled .token-input{cursor:not-allowed}.tokenfield.disabled .token:hover{cursor:not-allowed;border-color:#d9d9d9}.tokenfield.disabled .token:hover .close{cursor:not-allowed;opacity:.2;filter:alpha(opacity=20)}.has-warning .tokenfield.focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-error .tokenfield.focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-success .tokenfield.focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.tokenfield.input-sm,.input-group-sm .tokenfield{min-height:30px;padding-bottom:0}.input-group-sm .token,.tokenfield.input-sm .token{height:20px;margin-bottom:4px}.input-group-sm .token-input,.tokenfield.input-sm .token-input{height:18px;margin-bottom:5px}.tokenfield.input-lg,.input-group-lg .tokenfield{height:auto;min-height:45px;padding-bottom:4px}.input-group-lg .token,.tokenfield.input-lg .token{height:25px}.input-group-lg .token-label,.tokenfield.input-lg .token-label{line-height:23px}.input-group-lg .token .close,.tokenfield.input-lg .token .close{line-height:1.3em}.input-group-lg .token-input,.tokenfield.input-lg .token-input{height:23px;line-height:23px;margin-bottom:6px;vertical-align:top}.tokenfield.rtl{direction:rtl;text-align:right}.tokenfield.rtl .token{margin:-1px 0 5px 5px}.tokenfield.rtl .token .token-label{padding-left:0;padding-right:4px}ffצv /VsmartSEO/modules/on_page_optimization/bootstrap-tokenfield/bootstrap-tokenfield.min.js ob/*! * bootstrap-tokenfield 0.12.1 * https://github.com/sliptree/bootstrap-tokenfield * Copyright 2013-2014 Sliptree and other contributors; Licensed MIT */ !function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?module.exports=global.window&&global.window.$?a(global.window.$):function(b){if(!b.$&&!b.fn)throw new Error("Tokenfield requires a window object with jQuery or a jQuery instance");return a(b.$||b)}:a(jQuery,window)}(function(a,b){"use strict";var c=function(c,d){var e=this;this.$element=a(c),this.textDirection=this.$element.css("direction"),this.options=a.extend(!0,{},a.fn.tokenfield.defaults,{tokens:this.$element.val()},this.$element.data(),d),this._delimiters="string"==typeof this.options.delimiter?[this.options.delimiter]:this.options.delimiter,this._triggerKeys=a.map(this._delimiters,function(a){return a.charCodeAt(0)}),this._firstDelimiter=this._delimiters[0];var f=a.inArray(" ",this._delimiters),g=a.inArray("-",this._delimiters);f>=0&&(this._delimiters[f]="\\s"),g>=0&&(delete this._delimiters[g],this._delimiters.unshift("-"));var h=["\\","$","[","{","^",".","|","?","*","+","(",")"];a.each(this._delimiters,function(b,c){var d=a.inArray(c,h);d>=0&&(e._delimiters[b]="\\"+c)});var i,j=b&&"function"==typeof b.getMatchedCSSRules?b.getMatchedCSSRules(c):null,k=c.style.width,l=this.$element.width();j&&a.each(j,function(a,b){b.style.width&&(i=b.style.width)});var m="rtl"===a("body").css("direction")?"right":"left",n={position:this.$element.css("position")};n[m]=this.$element.css(m),this.$element.data("original-styles",n).data("original-tabindex",this.$element.prop("tabindex")).css("position","absolute").css(m,"-10000px").prop("tabindex",-1),this.$wrapper=a('
    '),this.$element.hasClass("input-lg")&&this.$wrapper.addClass("input-lg"),this.$element.hasClass("input-sm")&&this.$wrapper.addClass("input-sm"),"rtl"===this.textDirection&&this.$wrapper.addClass("rtl");var o=this.$element.prop("id")||(new Date).getTime()+""+Math.floor(100*(1+Math.random()));this.$input=a('').appendTo(this.$wrapper).prop("placeholder",this.$element.prop("placeholder")).prop("id",o+"-tokenfield").prop("tabindex",this.$element.data("original-tabindex"));var p=a('label[for="'+this.$element.prop("id")+'"]');if(p.length&&p.prop("for",this.$input.prop("id")),this.$copyHelper=a('').css("position","absolute").css(m,"-10000px").prop("tabindex",-1).prependTo(this.$wrapper),k?this.$wrapper.css("width",k):i?this.$wrapper.css("width",i):this.$element.parents(".form-inline").length&&this.$wrapper.width(l),(this.$element.prop("disabled")||this.$element.parents("fieldset[disabled]").length)&&this.disable(),this.$element.prop("readonly")&&this.readonly(),this.$mirror=a(''),this.$input.css("min-width",this.options.minWidth+"px"),a.each(["fontFamily","fontSize","fontWeight","fontStyle","letterSpacing","textTransform","wordSpacing","textIndent"],function(a,b){e.$mirror[0].style[b]=e.$input.css(b)}),this.$mirror.appendTo("body"),this.$wrapper.insertBefore(this.$element),this.$element.prependTo(this.$wrapper),this.update(),this.setTokens(this.options.tokens,!1,!this.$element.val()&&this.options.tokens),this.listen(),!a.isEmptyObject(this.options.autocomplete)){var q="rtl"===this.textDirection?"right":"left",r=a.extend({minLength:this.options.showAutocompleteOnFocus?0:null,position:{my:q+" top",at:q+" bottom",of:this.$wrapper}},this.options.autocomplete);this.$input.autocomplete(r)}if(!a.isEmptyObject(this.options.typeahead)){var s=this.options.typeahead,t={minLength:this.options.showAutocompleteOnFocus?0:null},u=a.isArray(s)?s:[s,s];u[0]=a.extend({},t,u[0]),this.$input.typeahead.apply(this.$input,u),this.typeahead=!0}};c.prototype={constructor:c,createToken:function(b,c){var d=this;if(b="string"==typeof b?{value:b,label:b}:a.extend({},b),"undefined"==typeof c&&(c=!0),b.value=a.trim(b.value.toString()),b.label=b.label&&b.label.length?a.trim(b.label):b.value,!(!b.value.length||!b.label.length||b.label.length<=this.options.minLength||this.options.limit&&this.getTokens().length>=this.options.limit)){var e=a.Event("tokenfield:createtoken",{attrs:b});if(this.$element.trigger(e),e.attrs&&!e.isDefaultPrevented()){var f=a('
    ').append('').append('×').data("attrs",b);this.$input.hasClass("tt-input")?this.$input.parent().before(f):this.$input.before(f),this.$input.css("width",this.options.minWidth+"px");var g=f.find(".token-label"),h=f.find(".close");return this.maxTokenWidth||(this.maxTokenWidth=this.$wrapper.width()-h.outerWidth()-parseInt(h.css("margin-left"),10)-parseInt(h.css("margin-right"),10)-parseInt(f.css("border-left-width"),10)-parseInt(f.css("border-right-width"),10)-parseInt(f.css("padding-left"),10)-parseInt(f.css("padding-right"),10),parseInt(g.css("border-left-width"),10)-parseInt(g.css("border-right-width"),10)-parseInt(g.css("padding-left"),10)-parseInt(g.css("padding-right"),10),parseInt(g.css("margin-left"),10)-parseInt(g.css("margin-right"),10)),g.text(b.label).css("max-width",this.maxTokenWidth),f.on("mousedown",function(){return d._disabled||d._readonly?!1:(d.preventDeactivation=!0,void 0)}).on("click",function(a){return d._disabled||d._readonly?!1:(d.preventDeactivation=!1,a.ctrlKey||a.metaKey?(a.preventDefault(),d.toggle(f)):(d.activate(f,a.shiftKey,a.shiftKey),void 0))}).on("dblclick",function(){return d._disabled||d._readonly||!d.options.allowEditing?!1:(d.edit(f),void 0)}),h.on("click",a.proxy(this.remove,this)),this.$element.trigger(a.Event("tokenfield:createdtoken",{attrs:b,relatedTarget:f.get(0)})),c&&this.$element.val(this.getTokensList()).trigger(a.Event("change",{initiator:"tokenfield"})),this.update(),this.$element.get(0)}}},setTokens:function(b,c,d){if(b){c||this.$wrapper.find(".token").remove(),"undefined"==typeof d&&(d=!0),"string"==typeof b&&(b=this._delimiters.length?b.split(new RegExp("["+this._delimiters.join("")+"]")):[b]);var e=this;return a.each(b,function(a,b){e.createToken(b,d)}),this.$element.get(0)}},getTokenData:function(b){var c=b.map(function(){var b=a(this);return b.data("attrs")}).get();return 1==c.length&&(c=c[0]),c},getTokens:function(b){var c=this,d=[],e=b?".active":"";return this.$wrapper.find(".token"+e).each(function(){d.push(c.getTokenData(a(this)))}),d},getTokensList:function(b,c,d){b=b||this._firstDelimiter,c="undefined"!=typeof c&&null!==c?c:this.options.beautify;var e=b+(c&&" "!==b?" ":"");return a.map(this.getTokens(d),function(a){return a.value}).join(e)},getInput:function(){return this.$input.val()},listen:function(){var c=this;this.$element.on("change",a.proxy(this.change,this)),this.$wrapper.on("mousedown",a.proxy(this.focusInput,this)),this.$input.on("focus",a.proxy(this.focus,this)).on("blur",a.proxy(this.blur,this)).on("paste",a.proxy(this.paste,this)).on("keydown",a.proxy(this.keydown,this)).on("keypress",a.proxy(this.keypress,this)).on("keyup",a.proxy(this.keyup,this)),this.$copyHelper.on("focus",a.proxy(this.focus,this)).on("blur",a.proxy(this.blur,this)).on("keydown",a.proxy(this.keydown,this)).on("keyup",a.proxy(this.keyup,this)),this.$input.on("keypress",a.proxy(this.update,this)).on("keyup",a.proxy(this.update,this)),this.$input.on("autocompletecreate",function(){var b=a(this).data("ui-autocomplete").menu.element,d=c.$wrapper.outerWidth()-parseInt(b.css("border-left-width"),10)-parseInt(b.css("border-right-width"),10);b.css("min-width",d+"px")}).on("autocompleteselect",function(a,b){return c.createToken(b.item)&&(c.$input.val(""),c.$input.data("edit")&&c.unedit(!0)),!1}).on("typeahead:selected typeahead:autocompleted",function(a,b){c.createToken(b)&&(c.$input.typeahead("val",""),c.$input.data("edit")&&c.unedit(!0))}),a(b).on("resize",a.proxy(this.update,this))},keydown:function(b){function c(a){if(e.$input.is(document.activeElement)){if(e.$input.val().length>0)return;a+="All";var c=e.$input.hasClass("tt-input")?e.$input.parent()[a](".token:first"):e.$input[a](".token:first");if(!c.length)return;e.preventInputFocus=!0,e.preventDeactivation=!0,e.activate(c),b.preventDefault()}else e[a](b.shiftKey),b.preventDefault()}function d(c){if(b.shiftKey){if(e.$input.is(document.activeElement)){if(e.$input.val().length>0)return;var d=e.$input.hasClass("tt-input")?e.$input.parent()[c+"All"](".token:first"):e.$input[c+"All"](".token:first");if(!d.length)return;e.activate(d)}var f="prev"===c?"next":"prev",g="prev"===c?"first":"last";e.$firstActiveToken[f+"All"](".token").each(function(){e.deactivate(a(this))}),e.activate(e.$wrapper.find(".token:"+g),!0,!0),b.preventDefault()}}if(this.focused){var e=this;switch(b.keyCode){case 8:if(!this.$input.is(document.activeElement))break;this.lastInputValue=this.$input.val();break;case 37:c("rtl"===this.textDirection?"next":"prev");break;case 38:d("prev");break;case 39:c("rtl"===this.textDirection?"prev":"next");break;case 40:d("next");break;case 65:if(this.$input.val().length>0||!b.ctrlKey&&!b.metaKey)break;this.activateAll(),b.preventDefault();break;case 9:case 13:if(this.$input.data("ui-autocomplete")&&this.$input.data("ui-autocomplete").menu.element.find("li:has(a.ui-state-focus), li.ui-state-focus").length)break;if(this.$input.hasClass("tt-input")&&this.$wrapper.find(".tt-cursor").length)break;if(this.$input.hasClass("tt-input")&&this.$wrapper.find(".tt-hint").val()&&this.$wrapper.find(".tt-hint").val().length)break;if(this.$input.is(document.activeElement)&&this.$input.val().length||this.$input.data("edit"))return this.createTokensFromInput(b,this.$input.data("edit"));if(13===b.keyCode){if(!this.$copyHelper.is(document.activeElement)||1!==this.$wrapper.find(".token.active").length)break;if(!e.options.allowEditing)break;this.edit(this.$wrapper.find(".token.active"))}}this.lastKeyDown=b.keyCode}},keypress:function(b){return-1!==a.inArray(b.which,this._triggerKeys)&&this.$input.is(document.activeElement)?(this.$input.val()&&this.createTokensFromInput(b),!1):void 0},keyup:function(a){if(this.preventInputFocus=!1,this.focused){switch(a.keyCode){case 8:if(this.$input.is(document.activeElement)){if(this.$input.val().length||this.lastInputValue.length&&8===this.lastKeyDown)break;this.preventDeactivation=!0;var b=this.$input.hasClass("tt-input")?this.$input.parent().prevAll(".token:first"):this.$input.prevAll(".token:first");if(!b.length)break;this.activate(b)}else this.remove(a);break;case 46:this.remove(a,"next")}this.lastKeyUp=a.keyCode}},focus:function(){this.focused=!0,this.$wrapper.addClass("focus"),this.$input.is(document.activeElement)&&(this.$wrapper.find(".active").removeClass("active"),this.$firstActiveToken=null,this.options.showAutocompleteOnFocus&&this.search())},blur:function(a){this.focused=!1,this.$wrapper.removeClass("focus"),this.preventDeactivation||this.$element.is(document.activeElement)||(this.$wrapper.find(".active").removeClass("active"),this.$firstActiveToken=null),!this.preventCreateTokens&&(this.$input.data("edit")&&!this.$input.is(document.activeElement)||this.options.createTokensOnBlur)&&this.createTokensFromInput(a),this.preventDeactivation=!1,this.preventCreateTokens=!1},paste:function(a){var b=this;b.options.allowPasting&&setTimeout(function(){b.createTokensFromInput(a)},1)},change:function(a){"tokenfield"!==a.initiator&&this.setTokens(this.$element.val())},createTokensFromInput:function(a,b){if(!(this.$input.val().lengththis.$firstActiveToken.index():!1;if(c)return this.deactivate(b)}var d=this.$wrapper.find(".active:first"),e=d.prevAll(".token:first");return e.length||(e=this.$wrapper.find(".token:first")),e.length||a?(this.activate(e,a),void 0):(this.$input.focus(),void 0)},activate:function(b,c,d,e){if(b){if("undefined"==typeof e)var e=!0;if(d)var c=!0;if(this.$copyHelper.focus(),c||(this.$wrapper.find(".active").removeClass("active"),e?this.$firstActiveToken=b:delete this.$firstActiveToken),d&&this.$firstActiveToken){var f=this.$firstActiveToken.index()-2,g=b.index()-2,h=this;this.$wrapper.find(".token").slice(Math.min(f,g)+1,Math.max(f,g)).each(function(){h.activate(a(this),!0)})}b.addClass("active"),this.$copyHelper.val(this.getTokensList(null,null,!0)).select()}},activateAll:function(){var b=this;this.$wrapper.find(".token").each(function(c){b.activate(a(this),0!==c,!1,!1)})},deactivate:function(a){a&&(a.removeClass("active"),this.$copyHelper.val(this.getTokensList(null,null,!0)).select())},toggle:function(a){a&&(a.toggleClass("active"),this.$copyHelper.val(this.getTokensList(null,null,!0)).select())},edit:function(b){if(b){var c=b.data("attrs"),d={attrs:c,relatedTarget:b.get(0)},e=a.Event("tokenfield:edittoken",d);if(this.$element.trigger(e),!e.isDefaultPrevented()){b.find(".token-label").text(c.value);var f=b.outerWidth(),g=this.$input.hasClass("tt-input")?this.$input.parent():this.$input;b.replaceWith(g),this.preventCreateTokens=!0,this.$input.val(c.value).select().data("edit",!0).width(f),this.update(),this.$element.trigger(a.Event("tokenfield:editedtoken",d))}}},unedit:function(a){var b=this.$input.hasClass("tt-input")?this.$input.parent():this.$input;if(b.appendTo(this.$wrapper),this.$input.data("edit",!1),this.$mirror.text(""),this.update(),a){var c=this;setTimeout(function(){c.$input.focus()},1)}},remove:function(b,c){if(!(this.$input.is(document.activeElement)||this._disabled||this._readonly)){var d="click"===b.type?a(b.target).closest(".token"):this.$wrapper.find(".token.active");if("click"!==b.type){if(!c)var c="prev";if(this[c](),"prev"===c)var e=0===d.first().prevAll(".token:first").length}var f={attrs:this.getTokenData(d),relatedTarget:d.get(0)},g=a.Event("tokenfield:removetoken",f);if(this.$element.trigger(g),!g.isDefaultPrevented()){var h=a.Event("tokenfield:removedtoken",f),i=a.Event("change",{initiator:"tokenfield"});d.remove(),this.$element.val(this.getTokensList()).trigger(h).trigger(i),(!this.$wrapper.find(".token").length||"click"===b.type||e)&&this.$input.focus(),this.$input.css("width",this.options.minWidth+"px"),this.update(),b.preventDefault(),b.stopPropagation()}}},update:function(){var a=this.$input.val(),b=parseInt(this.$input.css("padding-left"),10),c=parseInt(this.$input.css("padding-right"),10),d=b+c;if(this.$input.data("edit")){if(a||(a=this.$input.prop("placeholder")),a===this.$mirror.text())return;this.$mirror.text(a);var e=this.$mirror.width()+10;if(e>this.$wrapper.width())return this.$input.width(this.$wrapper.width());this.$input.width(e)}else{var f="rtl"===this.textDirection?this.$input.offset().left+this.$input.outerWidth()-this.$wrapper.offset().left-parseInt(this.$wrapper.css("padding-left"),10)-d-1:this.$wrapper.offset().left+this.$wrapper.width()+parseInt(this.$wrapper.css("padding-left"),10)-this.$input.offset().left-d;isNaN(f)?this.$input.width("100%"):this.$input.width(f)}},focusInput:function(b){if(!(a(b.target).closest(".token").length||a(b.target).closest(".token-input").length||a(b.target).closest(".tt-dropdown-menu").length)){var c=this;setTimeout(function(){c.$input.focus()},0)}},search:function(){this.$input.data("ui-autocomplete")&&this.$input.autocomplete("search")},disable:function(){this.setProperty("disabled",!0)},enable:function(){this.setProperty("disabled",!1)},readonly:function(){this.setProperty("readonly",!0)},writeable:function(){this.setProperty("readonly",!1)},setProperty:function(a,b){this["_"+a]=b,this.$input.prop(a,b),this.$element.prop(a,b),this.$wrapper[b?"addClass":"removeClass"](a)},destroy:function(){this.$element.val(this.getTokensList()),this.$element.css(this.$element.data("original-styles")),this.$element.prop("tabindex",this.$element.data("original-tabindex"));var b=a('label[for="'+this.$input.prop("id")+'"]');b.length&&b.prop("for",this.$element.prop("id")),this.$element.insertBefore(this.$wrapper),this.$element.removeData("original-styles").removeData("original-tabindex").removeData("bs.tokenfield"),this.$wrapper.remove(),this.$mirror.remove();var c=this.$element;return c}};var d=a.fn.tokenfield;return a.fn.tokenfield=function(b,d){var e,f=[];Array.prototype.push.apply(f,arguments);var g=this.each(function(){var g=a(this),h=g.data("bs.tokenfield"),i="object"==typeof b&&b;"string"==typeof b&&h&&h[b]?(f.shift(),e=h[b].apply(h,f)):h||"string"==typeof b||d||(g.data("bs.tokenfield",h=new c(this,i)),g.trigger("tokenfield:initialize"))});return"undefined"!=typeof e?e:g},a.fn.tokenfield.defaults={minWidth:60,minLength:0,allowEditing:!0,allowPasting:!0,limit:0,autocomplete:{},typeahead:{},showAutocompleteOnFocus:!1,createTokensOnBlur:!1,delimiter:",",beautify:!0,inputType:"text"},a.fn.tokenfield.Constructor=c,a.fn.tokenfield.noConflict=function(){return a.fn.tokenfield=d,this},c});`N  gQ0smartSEO/modules/on_page_optimization/config.php ob array( 'version' => '1.0', 'menu' => array( 'order' => 93, 'show_in_menu' => false, 'title' => __('Settings', 'psp'), 'icon' => '', ), /* 'in_dashboard' => array( 'icon' => '', 'url' => admin_url('admin.php?page=' . $psp->alias . "_massOptimization") ),*/ 'description' => __('Settings', 'psp'), 'module_init' => 'init.php', 'help' => array( 'type' => 'remote', 'url' => '' ), 'load_in' => array( 'backend' => array( 'admin.php?page=psp_massOptimization', 'admin-ajax.php', 'edit.php', 'post.php', 'post-new.php', 'edit-tags.php', 'term.php' ), 'frontend' => false ), 'javascript' => array( 'admin', 'hashchange', 'tipsy', 'ajaxupload', 'jquery-ui-core', 'jquery-ui-autocomplete' ), 'css' => array( 'admin' ) ) ) );rKL 0smartSEO/modules/on_page_optimization/index.html ob")N JR3(.smartSEO/modules/on_page_optimization/init.php obthe_plugin = $psp; $this->module_folder = $this->the_plugin->cfg['paths']['plugin_dir_url'] . 'modules/on_page_optimization/'; $this->module = $this->the_plugin->cfg['modules']['on_page_optimization']; if (is_admin()) { add_action('admin_menu', array( $this, 'adminMenu' )); if ( $this->the_plugin->capabilities_user_has_module('on_page_optimization') ) { add_action( 'save_post', array( $this, 'auto_optimize_on_save' )); } add_action('admin_footer', array($this, 'add_to_wp_publish_box') ); // ajax optimize helper add_action('wp_ajax_pspOptimizePage', array( $this, 'optimize_page' )); add_action('wp_ajax_pspGetSeoReport', array( $this, 'get_seo_report' )); add_action('wp_ajax_pspQuickEdit', array( $this, 'ajax_quick_edit_post' )); // ajax requests metabox add_action('wp_ajax_psp_metabox_seosettings', array( $this, 'ajax_requests_metabox') ); } } /** * add Custom Coloumns to pages | posts | custom post types - listing! * */ public function page_seo_info() { $post_types = get_post_types(array( 'public' => true )); //unset media - images | videos are treated as belonging to post, pages, custom post types unset($post_types['attachment'], $post_types['revision']); $screens = $post_types; foreach ($screens as $screen) { //add_filter( 'manage_edit-' . $screen . '_columns', array( $this, 'custom_col_head' ), 10, 1 ); add_filter( 'manage_' . $screen . '_posts_columns', array( $this, 'custom_col_head' ), 10, 1 ); add_action( 'manage_' . $screen . '_posts_custom_column', array( $this, 'custom_col_content' ), 10, 2 ); add_action( 'manage_edit-' . $screen . '_sortable_columns', array( $this, 'custom_col_sort' ), 10, 2 ); } add_action( 'restrict_manage_posts', array( $this, 'custom_col_sort_select' ) ); add_filter( 'request', array( $this, 'custom_col_sort_orderby' ) ); } public function custom_col_head( $columns ) { //$new_columns['psp_seo_score'] = __('SEO Score ', 'psp'); //$new_columns['psp_seo_title'] = __('SEO Title', 'psp'); //$new_columns['psp_seo_fkw'] = __('SEO Focus KW', 'psp'); $new_columns['psp_info'] = __('SEO Score ', 'psp'); return array_merge( $columns, $new_columns ); } public function custom_col_content( $column_name, $post_id ) { if ( isset($post_id) && (int)$post_id > 0 ) { $display = ''; $score = get_post_meta( $post_id, 'psp_score', true ); $score = isset($score) && !empty($score) ? $score : 0; //$focus_kw = get_post_meta( $post_id, 'psp_kw', true ); //$focus_kw_ = esc_html( $focus_kw ); $meta = $this->the_plugin->get_psp_meta( $post_id ); $seo_title = isset($meta['title']) ? $meta['title'] : ''; $seo_title_ = esc_html( $seo_title ); $focus_kw = isset($meta['focus_keyword']) ? $meta['focus_keyword'] : ''; $focus_kw_ = esc_html( $focus_kw ); $sidebar_box = $this->sidebar_box_seo( $post_id ); //var_dump('
    ', $sidebar_box, '
    '); echo __FILE__ . ":" . __LINE__;die . PHP_EOL; switch ($column_name) { case 'psp_info': $html = array(); $html[] = '
    '; // title="' . __('PSP Focus Keyword: ') . $focus_kw_ . '" $html[] = '

    SEO score

    '; $html[] = '
    '; $html[] = '
    '; $html[] = '
    ' . $score . '%
    '; $html[] = '
    '; $html[] = $this->do_progress_bar( '#psp-custom-col-progress-bar-'.$post_id, $score ); if ( '' != $focus_kw_ ) { $html[] = '
    ' . $focus_kw_ . '
    '; } if ( '' != $seo_title_ ) { $html[] = '
    ' . $seo_title_ . '
    '; } $html[] = '
    '; $display = implode(PHP_EOL, $html); break; case 'psp_info_sidebar': $html = array(); $html[] = '
    '; // title="' . __('PSP Focus Keyword: ') . $focus_kw_ . '" $html[] = $sidebar_box['html']; $html[] = '
    '; $display = implode(PHP_EOL, $html); break; default; break; } // end switch echo $display; } } public function sidebar_box_seo( $post_id ) { $ret = array( 'status' => 'valid', 'html' => '--sidebarbox--', ); //return $ret; //debug $postIdentifier = $post_id; $psp_meta = $this->the_plugin->get_psp_meta( $post_id ); //$seo_data = $this->get_seo_report($postIdentifier, $psp_meta['mfocus_keyword'], 'array', 'large'); //var_dump('
    ', $seo_data, '
    '); echo __FILE__ . ":" . __LINE__;die . PHP_EOL; $summary_seo_data = $this->get_seo_report($postIdentifier, $psp_meta['mfocus_keyword'], 'array', 'summary'); //var_dump('
    ', $summary_seo_data, '
    '); echo __FILE__ . ":" . __LINE__;die . PHP_EOL; if (1) { //seo check script! $seo = pspSeoCheck::getInstance(); $kwlist = array(); $kwlistd = array(); if ( isset($psp_meta['mfocus_keyword']) ) { // if has multi keywords $kwlist = $this->the_plugin->mkw_get_keywords($psp_meta['mfocus_keyword']); if ( is_array($kwlist) && empty($kwlist) ) { $kwlist = array(''); // add fake '' string } $rules_settings = $seo->get_rules_settings(); $cc = 0; foreach ($kwlist as $kwitem) { $__summary_html = ''; if ( isset($summary_seo_data['html'], $summary_seo_data['html']["$kwitem"]) ) { $__summary_html = $summary_seo_data['html']["$kwitem"]; } $__rules_stats = array(); if ( isset($summary_seo_data['rules_stats'], $summary_seo_data['rules_stats']["$kwitem"]) ) { $__rules_stats = $summary_seo_data['rules_stats']["$kwitem"]; } $__seo_score = 0; $__dens_proc = 0; if ( isset($summary_seo_data['multikw'], $summary_seo_data['multikw']["$kwitem"]) ) { $__ = $summary_seo_data['multikw']["$kwitem"]; $__seo_score = isset($__['score']) ? $__['score'] : 0; $__dens_proc = isset($__['density'], $__['density']['density']) ? $__['density']['density'] : 0; } $__dens_show = 10; //size_0_20 if ( $__dens_proc>=$rules_settings['keyword_density_good_min'] && $__dens_proc<=$rules_settings['keyword_density_good_max'] ) { $__dens_show = 100; //size_80_100 } else if ( $__dens_proc>=$rules_settings['keyword_density_poor_min'] && $__dens_proc<=$rules_settings['keyword_density_poor_max'] ) { $__dens_show = 70; //size_60_80 } else if ( $__dens_proc>0.1 && $__dens_proc<10 ) { $__dens_show = 30; //size_20_40 } $kwlistd["$kwitem"] = compact('__summary_html', '__seo_score', '__dens_proc', '__dens_show', '__rules_stats'); $cc++; } // end foreach } // end if has multi keywords } // end if(1) ob_start(); ?>

    ',$kwlistd["$kwitem"]['__rules_stats'],''); if ( is_array($kwlistd["$kwitem"]['__rules_stats']) && ! empty($kwlistd["$kwitem"]['__rules_stats']) ) { foreach ( $kwlistd["$kwitem"]['__rules_stats'] as $kkRule => $vvRule) { ?>
    */ ?> $html, )); return $ret; } public function custom_col_sort( $columns ) { //$new_columns['psp_seo_score'] = 'psp_seo_score'; $new_columns['psp_info'] = 'psp_info'; return array_merge( $columns, $new_columns ); } public function custom_col_sort_orderby( $request ) { // score select / drop-down if ( isset( $_GET['psp_score_select'] ) ) { $selVal = $_GET['psp_score_select']; $interval = false; if ( $selVal == 'none' ) $interval = 0; else if ( $selVal == 'bad' ) $interval = array(0.1, 25.9); else if ( $selVal == 'poor' ) $interval = array(26, 45.9); else if ( $selVal == 'ok' ) $interval = array(46, 65.9); else if ( $selVal == 'good' ) $interval = array(66, 79.9); else if ( $selVal == 'excellent' ) $interval = array(80, 100); if ( $interval!==false ) { if ( $interval == 0 ) { $request = array_merge($request, array( 'meta_query' => array( 'relation' => 'AND' ,array( 'key' => 'psp_score', 'value' => '', // this is ignored, but is necessary 'compare' => 'NOT EXISTS', // works ) /*, ,'relation' => 'OR' ,array( 'key' => 'psp_score', 'value' => array(0.1, 100), 'type' => 'NUMERIC', 'compare' => 'NOT IN BETWEEN' ) */ ) )); } else if ( is_array($interval) && count($interval)>=2 ) { $request = array_merge($request, array( 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'psp_score', 'value' => $interval, 'type' => 'NUMERIC', 'compare' => 'BETWEEN' ) ) )); } } } // score column: psp_seo_score | psp_info if ( isset( $request['orderby'] ) && $request['orderby'] == 'psp_info' ) { $request = array_merge($request, array( 'meta_key' => 'psp_score', 'orderby' => 'meta_value_num' )); } return $request; } public function custom_col_sort_select() { global $pagenow; if ( $pagenow == 'upload.php' ) { return false; } $html = array(); $html[] = ''; echo implode('', $html); } public function add_to_wp_publish_box() { global $post; $post_id = isset($post->ID) ? (int) $post->ID : 0; if ( ! $post_id ) return false; //ob_start(); echo ''; //$html = ob_get_clean(); //echo $html; } public function auto_optimize_on_save() { wp_reset_query(); global $post; if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; $postID = isset($post->ID) && (int) $post->ID > 0 ? $post->ID : 0; if( $postID > 0 ){ //$focus_kw = isset($_REQUEST['psp-field-focuskw']) ? $_REQUEST['psp-field-focuskw'] : ''; $focus_kw = isset($_REQUEST['psp-field-multifocuskw']) ? $_REQUEST['psp-field-multifocuskw'] : ''; // FIX: CORNERSTONE skip if( isset($_REQUEST['action']) && $_REQUEST['action'] == 'cs_endpoint_save' ) { return; } $this->optimize_page( $postID, $focus_kw ); } } /** * Hooks */ static public function adminMenu() { self::getInstance() ->_registerAdminPages() ->_registerMetaBoxes(); } /** * Register plug-in module admin pages and menus */ protected function _registerAdminPages() { if ( $this->the_plugin->capabilities_user_has_module('on_page_optimization') ) { add_submenu_page( $this->the_plugin->alias, $this->the_plugin->alias . " " . __('Settings', 'psp'), __('Settings', 'psp'), 'read', $this->the_plugin->alias . "#on_page_optimization", array($this, 'display_index_page') ); } return $this; } public function display_index_page() { $this->printBaseInterface(); } private function numToOrdinalWord($num) { $first_word = array('eth','st','nd','rd','th','th','th','th','th','th','th','ts','th','th','th','th','th','th','th','th','th'); return $num . "" . $first_word[$num] . ''; } /** * Register plug-in admin metaboxes */ protected function _registerMetaBoxes() { if ( $this->the_plugin->capabilities_user_has_module('on_page_optimization') ) { //posts | pages | custom post types $post_types = get_post_types(array( 'public' => true )); //unset media - images | videos are treated as belonging to post, pages, custom post types unset($post_types['attachment'], $post_types['revision']); $screens = $post_types; foreach ($screens as $key => $screen) { $screen = str_replace("_", " ", $screen); $screen = ucfirst($screen); add_meta_box( 'psp_onpage_optimize_meta_box', $screen . ' - ' . __( 'SEO Settings', $this->the_plugin->localizationName ), array($this, 'display_meta_box'), $key ); } } return $this; } private function makePrintBoxParams( $pms=array() ) { $pms = array_replace_recursive(array( 'tax' => false, 'post' => null, ), $pms); extract($pms); $ret = array( 'ga' => null, '__istax' => $this->the_plugin->__tax_istax( $tax ), 'post' => null, 'post_id' => 0, 'post_content' => '', 'post_type' => '', 'seo' => null, //aka seo check class instance 'psp_option' => array(), //aka psp_title_meta_format 'focus_kw' => '', 'psp_meta' => array(), 'psp_sitemap_isincluded' => '', 'seo_data' => '', //seo report large html 'summary_seo_data' => '', //seo report summary html 'seo_title' => '', //'__nb_words' => 0, //'__kw_occurences' => 0, //'__density' => 0, 'fb_default_img' => '', 'fb_isactive' => '', 'fb_opengraph' => '', 'parse_shortcodes' => false ); // base info! if ( $this->the_plugin->__tax_istax( $tax ) ) { //taxonomy data! $post = $tax; $post_id = (int) $post->term_id; //$post_content = $this->the_plugin->getPageContent( $post, $post->description, true ); $post_type = ''; $postIdentifier = (object) array('term_id' => (int) $post->term_id, 'taxonomy' => $post->taxonomy); $psp_current_taxseo = $this->the_plugin->__tax_get_post_meta( null, $post ); if ( is_null($psp_current_taxseo) || !is_array($psp_current_taxseo) ) $psp_current_taxseo = array(); $post_seo_status = $this->the_plugin->__tax_get_post_meta( $psp_current_taxseo, $post_id, 'psp_status' ); } else { $post_id = (int) $post->ID; //$post_content = $this->the_plugin->getPageContent( $post, $post->post_content ); $post_type = $post->post_type; $postIdentifier = $post_id; $post_seo_status = get_post_meta( $post_id, 'psp_status', true); } $ret = array_merge($ret, array( 'post' => $post, 'post_id' => $post_id, //'post_content' => $post_content )); //seo check script! $seo = pspSeoCheck::getInstance(); //title meta format options! $psp_option = $this->the_plugin->get_theoption('psp_title_meta_format'); // check if isset and string have content //if(isset($psp_option) && trim($psp_option) != ""){ // $psp_option = unserialize($psp_option); //} $ret = array_merge($ret, array( 'seo' => $seo, 'psp_option' => $psp_option )); //focus keyword & meta info! if ( $this->the_plugin->__tax_istax( $tax ) ) { //taxonomy data! //$psp_current_taxseo = $this->the_plugin->__tax_get_post_meta( null, $post ); //if ( is_null($psp_current_taxseo) || !is_array($psp_current_taxseo) ) // $psp_current_taxseo = array(); //$focus_kw = $this->the_plugin->__tax_get_post_meta( $psp_current_taxseo, $post, 'psp_kw' ); $psp_meta = $this->the_plugin->get_psp_meta( $post, $psp_current_taxseo ); $psp_sitemap_isincluded = ''; } else { // is post | page | custom post type edit page! //$focus_kw = get_post_meta( $post_id, 'psp_kw', true ); $psp_meta = $this->the_plugin->get_psp_meta( $post_id ); $psp_sitemap_isincluded = get_post_meta( $post_id, 'psp_sitemap_isincluded', true ); } $focus_kw = isset($psp_meta['focus_keyword']) ? $psp_meta['focus_keyword'] : ''; $seo_data = $this->get_seo_report($postIdentifier, $psp_meta['mfocus_keyword'], 'array', 'large'); $summary_seo_data = $this->get_seo_report($postIdentifier, $psp_meta['mfocus_keyword'], 'array', 'summary'); $seo_title = isset($psp_meta['title']) ? $psp_meta['title'] : ''; // keyword density //$__density = isset($post_seo_status["kw_density"]["details"]) ? $post_seo_status["kw_density"]["details"] : array(); //$__nb_words = isset($__density['nb_words']) ? $__density['nb_words'] : ''; //$__kw_occurences = isset($__density['kw_occurences']) ? $__density['kw_occurences'] : ''; //$__density = isset($__density['density']) ? $__density['density'] : 0; $ret = array_merge($ret, array( 'focus_kw' => $focus_kw, 'psp_meta' => $psp_meta, 'psp_sitemap_isincluded' => $psp_sitemap_isincluded, 'seo_data' => $seo_data, 'summary_seo_data' => $summary_seo_data, 'seo_title' => $seo_title, //'__nb_words' => $__nb_words, //'__kw_occurences' => $__kw_occurences, //'__density' => $__density )); $optimizeSettings = $this->the_plugin->getAllSettings( 'array', 'on_page_optimization' ); if ( !isset($optimizeSettings['parse_shortcodes']) || ( isset($optimizeSettings['parse_shortcodes']) && $optimizeSettings['parse_shortcodes'] != 'yes' ) ) { if ( $this->the_plugin->__tax_istax( $tax ) ) { //taxonomy data! $__row_actions = $this->the_plugin->edit_post_inline_data( $post_id, $seo, $tax ); } else { $__row_actions = $this->the_plugin->edit_post_inline_data( $post_id, $seo ); } $ret['__row_actions'] = $__row_actions; } else { $ret['parse_shortcodes'] = true; } // end parse_shortcodes //facebook image if ( $this->the_plugin->__tax_istax( $tax ) ) { //taxonomy data! $fb_default_img = ''; // no facebook image for custom taxonomy! } else { $__featured_image = ''; if ( function_exists( 'has_post_thumbnail' ) && has_post_thumbnail( $post_id ) ) { $__featured_image = wp_get_attachment_image_src( get_post_thumbnail_id( $post_id ), 'single-post-thumbnail' ); $__featured_image = $__featured_image[0]; } $fb_default_img = ''; if ( isset($psp_option['social_default_img']) && !empty($psp_option['social_default_img']) ) //default image $fb_default_img = $psp_option['social_default_img']; if ( isset($__featured_image) && !empty($__featured_image) ) //featured image $fb_default_img = $__featured_image; if ( isset($psp_meta['facebook_image']) && !empty($psp_meta['facebook_image']) ) //custom image $fb_default_img = $psp_meta['facebook_image']; } //facebook is active $fb_isactive = 'default'; //if ( isset($psp_option['social_use_meta']) && !empty($psp_option['social_use_meta']) ) // $fb_isactive = $psp_option['social_use_meta']; if ( isset($psp_meta['facebook_isactive']) && !empty($psp_meta['facebook_isactive']) ) $fb_isactive = $psp_meta['facebook_isactive']; //open graph type $fb_opengraph = 'default'; //if ( isset($psp_option['social_opengraph_default']) && !empty($psp_option['social_opengraph_default']) // && ! $this->the_plugin->__tax_istax( $tax ) ) { // if( isset($psp_option['social_opengraph_default']["{$post_type}"]) ) { // $ogdef = $psp_option['social_opengraph_default']["{$post_type}"]; // } //} //if ( isset($ogdef) && !empty($ogdef) ) // $fb_opengraph = $ogdef; if ( isset($psp_meta['facebook_opengraph_type']) && !empty($psp_meta['facebook_opengraph_type']) ) $fb_opengraph = $psp_meta['facebook_opengraph_type']; $ret = array_merge($ret, array( 'fb_default_img' => $fb_default_img, 'fb_isactive' => $fb_isactive, 'fb_opengraph' => $fb_opengraph )); // post has twitter app card type $twc_app_isactive = 'default2'; //if ( isset($psp_option['psp_twc_site_app']) && !empty($psp_option['psp_twc_site_app']) ) // $twc_app_isactive = $psp_option['psp_twc_site_app']; if ( isset($psp_meta['psp_twc_app_isactive']) && !empty($psp_meta['psp_twc_app_isactive']) ) $twc_app_isactive = $psp_meta['psp_twc_app_isactive']; // post twitter card type $twc_post_cardtype = 'default'; //if ( isset($psp_option['psp_twc_cardstype_default'], $psp_option['psp_twc_cardstype_default']["{$post_type}"]) && !empty($psp_option['psp_twc_cardstype_default']) ) // $twc_post_cardtype = $psp_option['psp_twc_cardstype_default']["{$post_type}"]; if ( isset($psp_meta['psp_twc_post_cardtype']) && !empty($psp_meta['psp_twc_post_cardtype']) ) $twc_post_cardtype = $psp_meta['psp_twc_post_cardtype']; // post twitter card thumb size $twc_post_thumbsize = 'default'; //if ( isset($psp_option['psp_twc_thumb_sizes']) && !empty($psp_option['psp_twc_thumb_sizes']) ) // $twc_post_thumbsize = $psp_option['psp_twc_thumb_sizes']; if ( isset($psp_meta['psp_twc_post_thumbsize']) && !empty($psp_meta['psp_twc_post_thumbsize']) ) $twc_post_thumbsize = $psp_meta['psp_twc_post_thumbsize']; $ret = array_merge($ret, array( 'twc_app_isactive' => $twc_app_isactive, 'twc_post_cardtype' => $twc_post_cardtype, 'twc_post_thumbsize' => $twc_post_thumbsize )); //unset($ret['seo'], $ret['psp_option']); return $ret; } public function display_meta_box( $tax=false ) { // base info! $__istax = $this->the_plugin->__tax_istax( $tax ); if ( $__istax ) { //taxonomy data! $post = $tax; $post_id = (int) $post->term_id; $post_type = ''; $postIdentifier = (object) array('term_id' => (int) $post->term_id, 'taxonomy' => $post->taxonomy); } else { global $post; $post_id = isset($post->ID) ? (int) $post->ID : 0; $post_type = $post->post_type; $postIdentifier = $post_id; } ?>
    false, 'post' => null, ), $pms); extract($pms); $ret = $this->makePrintBoxParams( $pms ); //var_dump('
    ', $ret, '
    '); echo __FILE__ . ":" . __LINE__;die . PHP_EOL; extract( $ret ); if ( isset($post_id) && $post_id > 0 ) { // if post_id $postDefault = $this->the_plugin->get_post_metatags( $post ); // add meta placeholder // Twitter Cards ajax action & public methods! require_once( $this->the_plugin->cfg['paths']['freamwork_dir_path'] . 'utils/twitter_cards.php' ); $twc = new pspTwitterCards( $this->the_plugin ); $fieldsParams = array( 'mfocus_keyword' => isset($psp_meta['mfocus_keyword']) ? $psp_meta['mfocus_keyword'] : '' ); $kwlist = array(); $kwlistd = array(); if ( isset($psp_meta['mfocus_keyword']) ) { // if has multi keywords $kwlist = $this->the_plugin->mkw_get_keywords($psp_meta['mfocus_keyword']); if ( is_array($kwlist) && empty($kwlist) ) { $kwlist = array(''); // add fake '' string } $rules_settings = $seo->get_rules_settings(); $cc = 0; foreach ($kwlist as $kwitem) { $__summary_html = ''; if ( isset($summary_seo_data['html'], $summary_seo_data['html']["$kwitem"]) ) { $__summary_html = $summary_seo_data['html']["$kwitem"]; } $__seo_score = 0; $__dens_proc = 0; if ( isset($summary_seo_data['multikw'], $summary_seo_data['multikw']["$kwitem"]) ) { $__ = $summary_seo_data['multikw']["$kwitem"]; $__seo_score = isset($__['score']) ? $__['score'] : 0; $__dens_proc = isset($__['density'], $__['density']['density']) ? $__['density']['density'] : 0; } $__dens_show = 10; //size_0_20 if ( $__dens_proc>=$rules_settings['keyword_density_good_min'] && $__dens_proc<=$rules_settings['keyword_density_good_max'] ) { $__dens_show = 100; //size_80_100 } else if ( $__dens_proc>=$rules_settings['keyword_density_poor_min'] && $__dens_proc<=$rules_settings['keyword_density_poor_max'] ) { $__dens_show = 70; //size_60_80 } else if ( $__dens_proc>0.1 && $__dens_proc<10 ) { $__dens_show = 30; //size_20_40 } $kwlistd["$kwitem"] = compact('__summary_html', '__seo_score', '__dens_proc', '__dens_show'); $cc++; } // end foreach } // end if has multi keywords ob_start(); ?>
    */ ?>
    make_active('on_page_optimization|on_page_optimization')->show_menu(); ?>
    print_section_header( $this->module['on_page_optimization']['menu']['title'], $this->module['on_page_optimization']['description'], $this->module['on_page_optimization']['help']['url'] ); ?>

    the_plugin ) ->setup(array( 'id' => 'pspPageOptimization', 'show_header' => true, 'show_header_buttons' => true, 'items_per_page' => '10', 'post_statuses' => 'all', 'columns' => array( 'checkbox' => array( 'th' => 'checkbox', 'td' => 'checkbox', ), 'id' => array( 'th' => __('ID', 'psp'), 'td' => '%ID%', 'width' => '40' ), 'title' => array( 'th' => __('Title', 'psp'), 'td' => '%title_and_actions%', 'align' => 'left' ), 'score' => array( 'th' => __('Score', 'psp'), 'td' => '%score%', 'width' => '120' ), 'focus_keyword' => array( 'th' => __('Multi Focus Keyword', 'psp'), 'td' => '%focus_keyword%', 'align' => 'left', 'width' => '370' //'250' ), /*'date' => array( 'th' => __('Date', 'psp'), 'td' => '%date%', 'width' => '120' ),*/ 'auto_detect' => array( 'th' => __('Auto detect', 'psp'), 'td' => '%auto_detect%', 'align' => 'center', 'width' => '110' ), 'seo_report' => array( 'th' => __('Seo report', 'psp'), 'td' => '%seo_report%', 'align' => 'center', 'width' => '110' ), 'optimize_btn' => array( 'th' => __('Action', 'psp'), 'td' => '%button%', 'option' => array( 'value' => __('Optimize', 'psp'), 'action' => 'do_item_optimize', 'color' => 'warning' ), 'width' => '80' ), ) )) ->print_html(); ?>
    isset($_REQUEST['id']) ? $_REQUEST['id'] : $id, 'kw' => isset($_REQUEST['kw']) ? $_REQUEST['kw'] : $kw ); foreach ( $request as $k => $v ) { //preg_replace('/[^a-zA-Z0-9\s]/', '', $v); if ( ! in_array($k, array('id')) ) { $request[ $k ] = trim( $v ); } if ( in_array($k, array('id')) ) { continue 1; } $request[ $k ] = strtolower( $v ); $request[ $k ] = strip_tags( $v ); $request[ $k ] = stripslashes( $v ); } // NOTICE: for taxonomy refresh! if ( ! $this->the_plugin->__tax_istax( $request['id'] ) ) { $request['id'] = (int) $request['id']; $post_seo_status = get_post_meta( $request['id'], 'psp_status', true); } if( //no check yet! ! isset($post_seo_status) || ! is_array($post_seo_status) || empty($post_seo_status) // NOTICE: for taxonomy refresh! || $this->the_plugin->__tax_istax( $request['id'] ) //old meta check => make multi keyword check! || ( isset($post_seo_status['title']) && isset($post_seo_status['meta_description']) ) ) { // re-check score based on rules $seo = pspSeoCheck::getInstance(); $seo->set_current_post( $request['id'] ); $seo->set_current_keyword( $this->the_plugin->mkw_get_keywords($request['kw']) ); $post_seo_status = $seo->get_seo_score( 'array'); $this->save_seo_score( $request['id'], $post_seo_status ); $post_seo_status = $post_seo_status['mkw']; //data } $multikw = array(); $html = array(); $summary = array(); $score = 0; $rules_stats = array(); if( ! is_array($post_seo_status) || empty($post_seo_status) ) { // post seo status rules $ret = array( 'status' => 'invalid', 'post_id' => $request['id'], 'score' => 0, // score for first focus keyword 'html' => '', 'multikw' => array(), 'rules_stats' => array(), ); if( $returnAs == 'die' ){ die(json_encode($ret)); } elseif( $returnAs == 'array' ){ return $ret; } } if( is_array($post_seo_status) && count($post_seo_status) > 0 ) { // post seo status rules $rules_allowed = $this->the_plugin->get_content_analyzing_allowed_rules( array( 'settings' => array(), 'istax' => $this->the_plugin->__tax_istax( $request['id'] ), )); ob_start(); ?>
    $vv) { $summary["$kk"] = implode("\n", $vv); } reset($multikw); $first = current($multikw); $ret = array( 'status' => 'valid', 'post_id' => $request['id'], 'score' => isset($first['score']) ? $first['score'] : 0, 'html' => ( $data == 'large' ? implode("\n", $html) : $summary ), 'multikw' => $multikw, 'rules_stats' => $rules_stats, ); if( $returnAs == 'die' ){ die(json_encode($ret)); } elseif( $returnAs == 'array' ){ return $ret; } } // this will create force optimization of your page, and return a SEO score public function optimize_page( $id='', $kw='', $returnAs='die' ) { $request = array( 'action' => isset($_REQUEST['action']) ? $_REQUEST['action'] : 'default', 'id' => isset($_REQUEST['id']) ? $_REQUEST['id'] : $id, 'kw' => isset($_REQUEST['kw']) ? $_REQUEST['kw'] : $kw, 'meta_title' => isset($_REQUEST['psp-editpost-meta-title']) ? trim($_REQUEST['psp-editpost-meta-title']) : '', 'meta_description' => isset($_REQUEST['psp-editpost-meta-description']) ? trim($_REQUEST['psp-editpost-meta-description']) : '', 'meta_keywords' => isset($_REQUEST['psp-editpost-meta-keywords']) ? trim($_REQUEST['psp-editpost-meta-keywords']) : '', 'meta_canonical' => isset($_REQUEST['psp-editpost-meta-canonical']) ? trim($_REQUEST['psp-editpost-meta-canonical']) : '', 'meta_robots_index' => isset($_REQUEST['psp-editpost-meta-robots-index']) ? trim($_REQUEST['psp-editpost-meta-robots-index']) : '', 'meta_robots_follow'=> isset($_REQUEST['psp-editpost-meta-robots-follow']) ? trim($_REQUEST['psp-editpost-meta-robots-follow']) : '', 'sitemap_priority' => isset($_REQUEST['psp-editpost-priority-sitemap']) ? trim($_REQUEST['psp-editpost-priority-sitemap']) : '', 'sitemap_include' => isset($_REQUEST['psp-editpost-include-sitemap']) ? trim($_REQUEST['psp-editpost-include-sitemap']) : '' ); foreach ( $request as $k => $v ) { //preg_replace('/[^a-zA-Z0-9\s]/', '', $v); if ( ! in_array($k, array('id')) ) { $request[ $k ] = trim( $v ); } if ( in_array($k, array('id', 'action', 'meta_canonical')) ) { //, 'meta_title', 'meta_description' continue 1; } $request[ $k ] = strtolower( $v ); $request[ $k ] = strip_tags( $v ); $request[ $k ] = stripslashes( $v ); } // outside ajax => when update metabox if ( ! in_array($request['action'], array('pspOptimizePage', 'pspQuickEdit')) ) { if ( isset($_REQUEST['post_ID']) && !empty($_REQUEST['post_ID']) ) { $request['id'] = (int) $_REQUEST['post_ID']; } } // Step 1, generate meta keywords, and description for your requested item $seo = pspSeoCheck::getInstance(); if ( $this->the_plugin->__tax_istax( $request['id'] ) ) { //taxonomy data! $psp_current_taxseo = $this->the_plugin->__tax_get_post_meta( null, $request['id'] ); if ( is_null($psp_current_taxseo) || !is_array($psp_current_taxseo) ) $psp_current_taxseo = array(); $post_metas = $this->the_plugin->get_psp_meta( $request['id'], $psp_current_taxseo ); $post = $this->the_plugin->__tax_get_post( $request['id'], ARRAY_A ); $post_title = $post['name']; $post_content = $this->the_plugin->getPageContent( $post, $post['description'], true ); } else { $request['id'] = (int) $request['id']; $post_metas = $this->the_plugin->get_psp_meta( $request['id'] ); $post = get_post( $request['id'], ARRAY_A); $post_title = $post['post_title']; $post_content = $this->the_plugin->getPageContent( $post, $post['post_content'] ); } if( !isset($post_metas) || empty($post_metas) <= 0 || !is_array($post_metas) ) { $post_metas = array(); } $post_metas = array_merge(array( 'title' => '', 'description' => '', 'keywords' => '', 'focus_keyword' => '', 'mfocus_keyword' => '', 'facebook_isactive' => '', 'facebook_titlu' => '', 'facebook_desc' => '', 'facebook_image' => '', 'facebook_opengraph_type' => '', 'robots_index' => '', 'robots_follow' => '', 'priority' => '', 'canonical' => '' ), $post_metas); // get info! if( !is_null($post) && count($post) > 0 ) { // if post don't have meta, setup the one if( !isset($post_metas['mfocus_keyword']) || trim($post_metas['mfocus_keyword']) == "" ){ $post_metas['mfocus_keyword'] = $post_title; $post_metas['focus_keyword'] = $post_title; } if( !isset($post_metas['title']) || trim($post_metas['title']) == "" ){ $post_metas['title'] = $post_title; } if( !isset($post_metas['description']) || trim($post_metas['description']) == "" ){ // meta description $first_paragraph = $seo->get_first_paragraph( $post_content ); $get_meta_desc = $seo->get_meta_desc( $first_paragraph ); $post_metas['description'] = $get_meta_desc; } if( !isset($post_metas['keywords']) || trim($post_metas['keywords']) == "" ){ // meta keywords $get_meta_keywords = array(); if ( !empty($post_metas['mfocus_keyword']) ) { $get_meta_keywords[] = implode(', ', $this->the_plugin->mkw_get_keywords($post_metas['mfocus_keyword'])); } $__tmp = $seo->get_meta_keywords( $post_content ); if ( !empty($__tmp) ) { //$get_meta_keywords[] = $__tmp; $get_meta_keywords[] = implode(", ", $__tmp ); } $post_metas['keywords'] = implode(', ', $get_meta_keywords); } //ajax request from plugin module! - optimize action if ( $request['action']=='pspOptimizePage' ) { if ( isset($request['kw']) && trim($request['kw']) != "" ) { $request['kw'] = implode("\n", $this->the_plugin->mkw_get_keywords($request['kw'])); $post_metas['focus_keyword'] = $this->the_plugin->mkw_get_main_keyword( $request['kw'] ); $post_metas['mfocus_keyword'] = $request['kw']; } } //ajax request from plugin module! - quick edit action else if ( $request['action']=='pspQuickEdit' ) { $request['kw'] = implode("\n", $this->the_plugin->mkw_get_keywords($request['kw'])); $post_metas = array_merge($post_metas, array( 'title' => $request['meta_title'], 'description' => $request['meta_description'], 'keywords' => $request['meta_keywords'], 'focus_keyword' => $this->the_plugin->mkw_get_main_keyword( $request['kw'] ), 'mfocus_keyword' => $request['kw'], 'robots_index' => $request['meta_robots_index'], 'robots_follow' => $request['meta_robots_follow'], 'priority' => $request['sitemap_priority'], 'canonical' => $request['meta_canonical'], )); if ( !$this->the_plugin->__tax_istax( $request['id'] ) ) //not taxonomy data! update_post_meta( $request['id'], 'psp_sitemap_isincluded', $request['sitemap_include'] ); } //new or edit post/tax action from meta_box! else { // clean focus keyword //$__cleanFocusKW = isset($_REQUEST['psp-field-focuskw']) ? $_REQUEST['psp-field-focuskw'] : ''; //$__cleanFocusKW = preg_replace('/[^a-zA-Z0-9\s]/', '', $__cleanFocusKW); $__cleanFocusKW = isset($_REQUEST['psp-field-multifocuskw']) ? trim( $_REQUEST['psp-field-multifocuskw'] ) : ''; $__cleanFocusKW = implode("\n", $this->the_plugin->mkw_get_keywords($__cleanFocusKW)); $post_metas = array_merge($post_metas, array( 'title' => isset($_REQUEST['psp-field-title']) ? trim( $_REQUEST['psp-field-title'] ) : '', 'description' => isset($_REQUEST['psp-field-metadesc']) ? trim( $_REQUEST['psp-field-metadesc'] ) : '', 'keywords' => isset($_REQUEST['psp-field-metakewords']) ? trim( $_REQUEST['psp-field-metakewords'] ) : '', 'focus_keyword' => $this->the_plugin->mkw_get_main_keyword( $__cleanFocusKW ), 'mfocus_keyword' => $__cleanFocusKW, 'facebook_isactive' => isset($_REQUEST['psp-field-facebook-isactive']) ? trim( $_REQUEST['psp-field-facebook-isactive'] ) : '', 'facebook_titlu' => isset($_REQUEST['psp-field-facebook-titlu']) ? trim( $_REQUEST['psp-field-facebook-titlu'] ) : '', 'facebook_desc' => isset($_REQUEST['psp-field-facebook-desc']) ? trim( $_REQUEST['psp-field-facebook-desc'] ) : '', 'facebook_image' => isset($_REQUEST['psp-field-facebook-image']) ? trim( $_REQUEST['psp-field-facebook-image'] ) : '', 'facebook_opengraph_type' => isset($_REQUEST['psp-field-facebook-opengraph-type']) ? trim( $_REQUEST['psp-field-facebook-opengraph-type'] ) : '', 'robots_index' => isset($_REQUEST['psp-field-meta_robots_index']) ? trim( $_REQUEST['psp-field-meta_robots_index'] ) : '', 'robots_follow' => isset($_REQUEST['psp-field-meta_robots_follow']) ? trim( $_REQUEST['psp-field-meta_robots_follow'] ) : '', 'priority' => isset($_REQUEST['psp-field-priority-sitemap']) ? trim( $_REQUEST['psp-field-priority-sitemap'] ) : '', 'canonical' => isset($_REQUEST['psp-field-canonical']) ? trim( $_REQUEST['psp-field-canonical'] ) : '' )); // Twitter Cards ajax action & public methods! require_once( $this->the_plugin->cfg['paths']['freamwork_dir_path'] . 'utils/twitter_cards.php' ); $twc = new pspTwitterCards( $this->the_plugin ); $post_metas = array_merge($post_metas, $twc->save_meta()); if ( !$this->the_plugin->__tax_istax( $request['id'] ) ) //not taxonomy data! update_post_meta( $request['id'], 'psp_sitemap_isincluded', isset($_REQUEST['psp-field-include-sitemap']) ? trim($_REQUEST['psp-field-include-sitemap']) : '' ); } // update post/tax meta data! if ( $this->the_plugin->__tax_istax( $request['id'] ) ) { //taxonomy data! $this->the_plugin->__tax_update_post_meta( $request['id'], array( 'psp_kw' => $post_metas['focus_keyword'], 'psp_meta' => $post_metas )); } else { update_post_meta( $request['id'], 'psp_kw', $post_metas['focus_keyword'] ); update_post_meta( $request['id'], 'psp_meta', $post_metas ); } // get SEO score $seo->set_current_post( $request['id'], $post_content ); $seo->set_current_keyword( $this->the_plugin->mkw_get_keywords($post_metas['mfocus_keyword']) ); $post_seo_status = $seo->get_seo_score( 'array' ); $this->save_seo_score( $request['id'], $post_seo_status ); if ( $request['action']=='pspQuickEdit' || $request['action']=='pspOptimizePage' ) { $__editInline = $this->the_plugin->edit_post_inline_data( $request['id'], $seo, false, $post_content ); $post_seo_status = array_merge($post_seo_status, array( //'status' => 'valid', 'edit_inline_new' => $__editInline )); die(json_encode($post_seo_status)); } return $post_seo_status; } } // Save score public function save_seo_score( $p=0, $pms=array() ) { $pms2 = array( 'status' => array(), 'score' => 0, 'kw' => '', ); foreach ($pms2 as $kk => $vv) { $key = ( 'status' == $kk ? 'mkw' : $kk ); //data if ( isset($pms["$key"]) ) { $pms2["$kk"] = $pms["$key"]; } } extract($pms2); if ( $this->the_plugin->__tax_istax( $p ) ) //taxonomy data! $post_id = (int) $p->term_id; else $post_id = (int) $p; if( count($status) <= 0 || $post_id <= 0 ) { return false; } if ( $this->the_plugin->__tax_istax( $p ) ) { //taxonomy data! $this->the_plugin->__tax_update_post_meta( $p, array( 'psp_status' => $status, 'psp_score' => $score, 'psp_kw' => $kw, )); } else { update_post_meta( $p, 'psp_status', $status ); update_post_meta( $p, 'psp_score', $score ); update_post_meta( $p, 'psp_kw', $kw ); } return true; } /** * Upload Image Button * * is based on settings option: * $elm_id is the array KEY * $elm_data is the array VALUE, which is also an array 'image' => array( 'type' => 'upload_image', 'size' => 'large', 'title' => 'Quiz image', 'value' => 'Upload image', 'thumbSize' => array( 'w' => '100', 'h' => '100', 'zc' => '2', ), 'desc' => 'Choose the image' ) */ private function uploadImage( $elm ) { global $psp; // loop the box elements now foreach ( $elm as $elm_id => $value ){ $val = ''; // Set default value to $val if ( isset( $value['std'] ) && !empty( $value['std'] ) ) { $val = $value['std']; } // If the option is already saved, ovveride $val if ( isset( $value['db_value'] ) && !empty( $value['db_value'] ) ) { $val = $value['db_value']; } $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = '
    '; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = '' . ( $value['value'] ) . ' '; //$html[] = '' . __('Remove', 'psp') . ' '; $html[] = '
    '; $html[] = ''; if(!empty($val)){ $imgSrc = $psp->image_resize( $val, $value['thumbSize']['w'], $value['thumbSize']['h'], $value['thumbSize']['zc'] ); $html[] = ''; } $html[] = ''; $html[] = ''; } // return the $html return implode("\n", $html); } private function OpenGraphTypes( $field_name, $db_meta_name ) { //ob_start(); $html = ' '; $val = 'default'; if( isset($db_meta_name) ){ $val = $db_meta_name; } $html .= '      '; //$output = ob_get_contents(); //ob_end_clean(); return $html; } private function TwitterCardTypes( $field_name, $db_meta_name ) { //ob_start(); $html = ' '; $val = 'default'; if( isset($db_meta_name) ){ $val = $db_meta_name; } if ( ! in_array($val, array('default', 'none', 'summary', 'summary_large_image', 'player')) ) { $val = 'summary'; } $html .= '      '; //$output = ob_get_contents(); //ob_end_clean(); return $html; } private function TwitterCardThumbSize( $field_name, $db_meta_name ) { //ob_start(); $html = ' '; $val = 'default'; if( isset($db_meta_name) ){ $val = $db_meta_name; } $html .= '      '; //$output = ob_get_contents(); //ob_end_clean(); return $html; } public function do_progress_bar($elem, $score) { ob_start(); ?> isset($_REQUEST['id']) ? (int) $_REQUEST['id'] : 0 ); $postID = $req['id']; if( $postID > 0 ) { $this->optimize_page( $postID ); } die(json_encode( array('status' => 'invalid') )); } /** * Singleton pattern * * @return pspOnPageOptimization Singleton instance */ static public function getInstance() { if (!self::$_instance) { self::$_instance = new self; } if ( self::$_instance->the_plugin->capabilities_user_has_module('on_page_optimization') ) { add_action( 'admin_init', array( self::$_instance, 'page_seo_info' ) ); self::$_instance->_customMetaBox(); //meta box for: category | tag | custom taxonomy } return self::$_instance; } /** * Taxonomy meta box methods! */ /** * Register plug-in admin metaboxes */ public function _customMetaBox() { $taxonomy = isset( $_GET['taxonomy'] ) ? $_GET['taxonomy'] : null; if ( is_admin() && !is_null($taxonomy) ) add_action( $taxonomy . '_edit_form', array( $this, '_tax_meta_box' ), 10, 1 ); add_action( 'edit_term', array( $this, '_tax_meta_update' ), 99, 3 ); } public function _tax_meta_box( $term ) { ?>
    '; $this->display_meta_box( $term ); echo '
    ';?>
    0 ? $post_id : 0; if( $postID > 0 ){ //$focus_kw = isset($_REQUEST['psp-field-focuskw']) ? $_REQUEST['psp-field-focuskw'] : ''; $focus_kw = isset($_REQUEST['psp-field-multifocuskw']) ? $_REQUEST['psp-field-multifocuskw'] : ''; $this->optimize_page( (object) array('term_id' => $term_id, 'taxonomy' => $taxonomy), $focus_kw ); } } public function ajax_requests_metabox() { $action = isset($_REQUEST['sub_action']) ? $_REQUEST['sub_action'] : 'none'; $allowed_action = array( 'load_box' ); if( !in_array($action, $allowed_action) ){ die(json_encode(array( 'status' => 'invalid', 'html' => 'Invalid action!' ))); } if ( 'load_box' == $action ) { $req = array( 'post_id' => isset($_REQUEST['post_id']) ? (int) $_REQUEST['post_id'] : 0, 'istax' => isset($_REQUEST['istax']) ? (string) $_REQUEST['istax'] : 0, 'taxonomy' => isset($_REQUEST['taxonomy']) ? (string) $_REQUEST['taxonomy'] : '', 'term_id' => isset($_REQUEST['term_id']) ? (int) $_REQUEST['term_id'] : '', ); extract($req); //var_dump('
    ', $req, '
    '); echo __FILE__ . ":" . __LINE__;die . PHP_EOL; $pms = array( 'tax' => false, 'post' => null, ); if ( 'yes' == $istax ) { $pms['tax'] = get_term( $term_id, $taxonomy ); } else { $pms['post'] = get_post( $post_id ); } $html = $this->display_page_options($pms); die(json_encode(array( 'status' => 'valid', 'html' => $html, ))); } die(json_encode(array( 'status' => 'invalid', 'html' => 'Invalid action!' ))); } } } // Initialize the pspOnPageOptimization class //$pspOnPageOptimization = new pspOnPageOptimization($this->cfg, ( isset($module) ? $module : array()) ); $pspOnPageOptimization = pspOnPageOptimization::getInstance($this->cfg, ( isset($module) ? $module : array()) );O --uW1smartSEO/modules/on_page_optimization/options.php ob array( /* define the form_messages box */ 'on_page_optimization' => array( 'title' => __('Mass Optimization', 'psp'), 'icon' => '{plugin_folder_uri}assets/menu_icon.png', 'size' => 'grid_4', // grid_1|grid_2|grid_3|grid_4 'header' => true, // true|false 'toggler' => false, // true|false 'buttons' => true, // true|false 'style' => 'panel', // panel|panel-widget // create the box elements array 'elements' => array( /*'install_box' => array( 'type' => 'app', 'path' => '{plugin_folder_path}panel.php', )*/ /*array( 'type' => 'message', 'html' => __('

    Mass Optimization

    ', 'psp') ),*/ 'parse_shortcodes' => array( 'type' => 'select', 'std' => 'no', 'size' => 'large', 'force_width'=> '120', 'title' => __('Parse content shortcodes:', 'psp'), 'desc' => __('If you choose "yes", the shortcodes in the page/post content are also parsed by the optimization algorithm, but the process will be more time consuming.', 'psp'), 'options' => array( 'yes' => 'YES', 'no' => 'NO' ) ), 'charset' => array( 'type' => 'text', 'std' => '', 'size' => 'large', 'force_width'=> '400', 'title' => __('Server Charset:', 'psp'), 'desc' => __('Server Charset (used internal by the php-query class)', 'psp') ), 'meta_title_sufix' => array( 'type' => 'text', 'std' => '', 'size' => 'large', 'force_width'=> '400', 'title' => __('Meta title - text append to:', $psp->localizationName), 'desc' => __('Append this text to the end of the meta title value from the database', $psp->localizationName) ), 'meta_keywords_stop_words' => array( 'type' => 'textarea', 'std' => 'a, you, if', 'size' => 'large', 'force_width'=> '400', 'title' => __('Stop Words List:', 'psp'), 'desc' => __('Used default at optimize to auto generate Meta Keywords
    The list of stop words (comma separated) which are not taken into consideration when analyzing the content. Default list: a, you, if', 'psp'), 'height' => '200px' ), 'meta_keywords_stop_words_content' => array( 'type' => 'select', 'std' => 'yes', 'size' => 'large', 'force_width'=> '120', 'title' => __('Stop Words List - Content:', 'psp'), 'desc' => __('Choose "yes" if you want to use the "Stop Words List" for SEO Content Analysis rules too (to determine keyword density and if the page content or meta seo title has enough words).', 'psp'), 'options' => array( 'yes' => 'YES', 'no' => 'NO' ) ), 'word_min_chars' => array( 'type' => 'select', 'std' => '4', 'size' => 'large', 'title' => __('Word Min Chars:', 'psp'), 'force_width'=> '100', 'desc' => __('Used default at optimize to auto generate Meta Keywords
    The minimum number of characters for a word to be considered valid.', 'psp'), 'options' => $psp->doRange( range(0, 10, 1) ) ), 'word_min_chars_content' => array( 'type' => 'select', 'std' => 'yes', 'size' => 'large', 'force_width'=> '120', 'title' => __('Word Min Chars - Content:', 'psp'), 'desc' => __('Choose "yes" if you want to use the "Word Min Chars" for SEO Content Analysis rules too (to determine keyword density and if the page content or meta seo title has enough words).', 'psp'), 'options' => array( 'yes' => 'YES', 'no' => 'NO' ) ), 'post_allowed_rules' => array( 'type' => 'multiselect_left2right', 'std' => array_keys( $psp->get_content_analyzing_rules() ), //array(), 'size' => 'large', 'rows_visible' => 10, 'title' => __('Post: Allowed Rules', $psp->localizationName), 'desc' => __('here you can choose which rules you want to use when analyzing content for posts, pages, custom post types.
    to view a rule\'s full text, hover over it.', $psp->localizationName), 'info' => array( 'left' => __('All Rules list', $psp->localizationName), 'right' => __('Your chosen rules from list', $psp->localizationName), ), 'options' => $psp->get_content_analyzing_rules(), ), 'category_allowed_rules' => array( 'type' => 'multiselect_left2right', 'std' => array_keys( $psp->get_content_analyzing_rules() ), //array(), 'size' => 'large', 'rows_visible' => 10, 'title' => __('Category: Allowed Rules', $psp->localizationName), 'desc' => __('here you can choose which rules you want to use when analyzing content for categories, tags, custom taxonomies.
    to view a rule\'s full text, hover over it.', $psp->localizationName), 'info' => array( 'left' => __('All Rules list', $psp->localizationName), 'right' => __('Your chosen rules from list', $psp->localizationName), ), 'options' => $psp->get_content_analyzing_rules(), ) ) ) ) ) );llG {|ۘ'smartSEO/modules/server_status/ajax.php obthe_plugin = $the_plugin; $this->module_folder = $this->the_plugin->cfg['paths']['plugin_dir_url'] . 'modules/server_status/'; // ajax helper add_action('wp_ajax_pspServerStatusRequest', array( $this, 'ajax_request' )); add_action('wp_ajax_pspServerStatusVerify', array( $this, 'verify_step' )); add_action('wp_ajax_pspServerStatusOperation', array( $this, 'ajax_operation' )); } /* * ajax_request, method * -------------------- * * this will create requests to 404 table */ public function ajax_request() { $return = array(); $actions = isset($_REQUEST['sub_action']) ? explode(",", $_REQUEST['sub_action']) : ''; // Check Memory Limit if( in_array( 'check_memory_limit', array_values($actions)) ){ $memory = $this->let_to_num( WP_MEMORY_LIMIT ); $html = array(); if ( $memory < 127108864 ) { $html[] = '
    ' . sprintf( __( '%s - We recommend setting memory to at least 128MB. See: Increasing memory allocated to PHP', 'psp' ), size_format( $memory ), 'http://codex.wordpress.org/Editing_wp-config.php#Increasing_memory_allocated_to_PHP' ) . '
    '; } else { $html[] = '
    ' . size_format( $memory ) . '
    '; } $return = array( 'status' => 'valid', 'html' => implode("\n", $html) ); } // Export LOG if( in_array( 'export_log', array_values($actions)) ){ $log = isset($_REQUEST['log']) ? $_REQUEST['log'] : ''; $temp_file = tmpfile(); fwrite( $temp_file, $log ); fseek( $temp_file, 0 ); header( 'Content-Type: application/octet-stream' ); header( 'Content-Disposition: attachment; filename="psp-logs.html"' ); header( 'Content-Length: ' . strlen($log) ); echo fread( $temp_file, strlen($log) ); // this removes the file fclose( $temp_file ); die; } // Remote GET if( in_array( 'remote_get', array_values($actions)) ){ $status = false; $msg = ''; // WP Remote Get Check $response = wp_remote_get( 'http://google.com'); if ( ! is_wp_error( $response ) && $response['response']['code'] >= 200 && $response['response']['code'] < 300 ) { $msg = __('wp_remote_get() was successful', 'psp' ); $status = true; } elseif ( is_wp_error( $response ) ) { $msg = __( 'wp_remote_get() failed. Webservices Amazon won\'t work with your server. Contact your hosting provider. Error:', 'psp' ) . ' ' . $response->get_error_message(); $status = false; } else { $msg = __( 'wp_remote_get() failed. Webservices Amazon may not work with your server.', 'psp' ); $status = false; } $return = array( 'status' => ( 1/*$status == true*/ ? 'valid' : 'invalid' ), 'html' => ( $status == true ? '
    ' : '
    ' ) . $msg . '
    ' ); } // check SOAP if( in_array( 'check_soap', array_values($actions)) ){ $status = false; $msg = ''; if ( class_exists( 'SoapClient' ) ) { $msg = __('Your server has the SOAP Client class enabled.', 'psp' ); $status = true; } else { $msg = sprintf( __( 'Your server does not have the SOAP Client class enabled - some gateway plugins which use SOAP may not work as expected.', 'psp' ), 'http://php.net/manual/en/class.soapclient.php' ) . ''; $status = false; } $return = array( 'status' => ( 1/*$status == true*/ ? 'valid' : 'invalid' ), 'html' => ( $status == true ? '
    ' : '
    ' ) . $msg . '
    ' ); } // active plugins if( in_array( 'active_plugins', array_values($actions)) ){ $active_plugins = (array) get_option( 'active_plugins', array() ); if ( is_multisite() ) $active_plugins = array_merge( $active_plugins, get_site_option( 'active_sitewide_plugins', array() ) ); $wc_plugins = array(); foreach ( $active_plugins as $plugin ) { $plugin_data = @get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ); $dirname = dirname( $plugin ); $version_string = ''; if ( ! empty( $plugin_data['Name'] ) ) { if ( strstr( $dirname, 'psp' ) ) { if ( false === ( $version_data = get_transient( $plugin . '_version_data' ) ) ) { $changelog = wp_remote_get( 'http://dzv365zjfbd8v.cloudfront.net/changelogs/' . $dirname . '/changelog.txt' ); $cl_lines = explode( "\n", wp_remote_retrieve_body( $changelog ) ); if ( ! empty( $cl_lines ) ) { foreach ( $cl_lines as $line_num => $cl_line ) { if ( preg_match( '/^[0-9]/', $cl_line ) ) { $date = str_replace( '.' , '-' , trim( substr( $cl_line , 0 , strpos( $cl_line , '-' ) ) ) ); $version = preg_replace( '~[^0-9,.]~' , '' ,stristr( $cl_line , "version" ) ); $update = trim( str_replace( "*" , "" , $cl_lines[ $line_num + 1 ] ) ); $version_data = array( 'date' => $date , 'version' => $version , 'update' => $update , 'changelog' => $changelog ); set_transient( $plugin . '_version_data', $version_data , 60*60*12 ); break; } } } } if ( ! empty( $version_data['version'] ) && version_compare( $version_data['version'], $plugin_data['Version'], '!=' ) ) $version_string = ' – ' . $version_data['version'] . ' ' . __( 'is available', 'psp' ) . ''; } $wc_plugins[] = $plugin_data['Name'] . ' ' . __( 'by', 'psp' ) . ' ' . $plugin_data['Author'] . ' ' . __( 'version', 'psp' ) . ' ' . $plugin_data['Version'] . $version_string; } } if ( sizeof( $wc_plugins ) > 0 ){ $return = array( 'status' => 'valid', 'html' => implode( ',
    ', $wc_plugins ) ); } } // active modules of the plugin if( in_array( 'active_modules', array_values($actions)) ){ $active_modules = (array) $this->the_plugin->cfg['activate_modules']; $__modules = array(); foreach ( $active_modules as $module => $status ) { $tryed_module = $this->the_plugin->cfg['modules'][ "$module" ]; $moduleInfo = array(); if( isset($tryed_module) && count($tryed_module) > 0 ) { $moduleInfo = array( 'title' => $tryed_module["$module"]['menu']['title'], 'version' => $tryed_module["$module"]['version'], 'icon' => $tryed_module["$module"]['menu']['icon'], 'description' => isset($tryed_module["$module"]['description']) ? $tryed_module["$module"]['description'] : '', 'url' => isset($tryed_module["$module"]['in_dashboard']['url']) ? $tryed_module["$module"]['in_dashboard']['url'] : '' ); $title = '' . $moduleInfo['title'] . ''; if ( isset($moduleInfo['url']) && !empty($moduleInfo['url']) ) { $title = '' . $title . ''; } $__modules[] = '
    ' . $moduleInfo['icon'] . $title . ',' . $moduleInfo['version'] . ' (' . $moduleInfo['description'] . ')
    '; } } if ( sizeof( $__modules ) > 0 ){ $return = array( 'status' => 'valid', 'html' => implode( '', $__modules ) ); } } // Remote GET smushit if( in_array( 'smushit_remote_get', array_values($actions)) ){ define('SMUSHIT_URL_BASE', 'http://www.smushit.com/'); define('SMUSHIT_URL', 'http://www.smushit.com/ysmush.it/ws.php?img=%s'); $status = false; $msg = ''; // WP Remote Get Check $params = array( 'sslverify' => false, 'timeout' => 20, 'body' => array() ); $response = wp_remote_post( SMUSHIT_URL_BASE, $params ); if ( ! is_wp_error( $response ) && $response['response']['code'] >= 200 && $response['response']['code'] < 300 ) { $msg = __('Connection to smushit.com server was successful', 'psp' ); $status = true; } elseif ( is_wp_error( $response ) ) { $msg = __( 'Connection to smushit.com server failed. Contact your hosting provider. Error:', 'psp' ) . ' ' . $response->get_error_message(); $status = false; } else { $msg = __( 'Connection to smushit.com server failed.', 'psp' ); $status = false; } $return = array( 'status' => ( 1/*$status == true*/ ? 'valid' : 'invalid' ), 'html' => ( $status == true ? '
    ' : '
    ' ) . $msg . '
    ' ); } // Remote GET tiny compress if( in_array( 'tiny_compress_remote_get', array_values($actions)) ){ define('TINYCOMPRESS_URL_BASE', 'https://api.tinypng.com/shrink'); //define('SMUSHIT_URL', 'http://www.smushit.com/ysmush.it/ws.php?img=%s'); define('TINYCOMPRESS_SERVER', 'TinyPNG.com'); $status = false; $msg = ''; // WP Remote Get Check $params = array( 'sslverify' => false, 'timeout' => 20, 'body' => array() ); $response = wp_remote_post( TINYCOMPRESS_URL_BASE, $params ); //var_dump('
    ', $response, '
    '); die('debug...'); if ( ! is_wp_error( $response ) && $response['response']['code'] >= 200 && $response['response']['code'] < 300 ) { $msg = __('Connection to '.TINYCOMPRESS_SERVER.' server was successful', 'psp' ); $status = true; } elseif ( is_wp_error( $response ) ) { $msg = __( 'Connection to '.TINYCOMPRESS_SERVER.' server failed. Contact your hosting provider. Error:', 'psp' ) . ' ' . $response->get_error_message(); $status = false; } else { $msg = __( 'Connection to '.TINYCOMPRESS_SERVER.' server failed. Error:', 'psp' ) . ' ' . $response['response']['code'] . ' - ' . $response['response']['message']; $status = false; } $return = array( 'status' => ( 1/*$status == true*/ ? 'valid' : 'invalid' ), 'html' => ( $status == true ? '
    ' : '
    ' ) . $msg . '
    ' ); } die(json_encode($return)); } public function verify_step() { $module = isset($_REQUEST['module']) ? trim($_REQUEST['module']) : ''; $action = isset($_REQUEST['sub_action']) ? trim($_REQUEST['sub_action']) : ''; $start = microtime(true); $return = array( 'status' => 'invalid', 'log' => '' ); // google analytics if ( $module == 'google_analytics' ) { $analytics_settings = $this->the_plugin->get_theoption( $this->the_plugin->alias . '_google_analytics' ); $analytics_mandatoryFields = array( 'client_id' => false, 'client_secret' => false, 'redirect_uri' => false ); // get the module init file require_once( $this->the_plugin->cfg['paths']['plugin_dir_path'] . 'modules/Google_Analytics/init.php' ); // Initialize the pspGoogleAnalytics class $pspGoogleAnalytics = new pspGoogleAnalytics(); if ( $action == 'step1' ) { if ( isset($analytics_settings['client_id']) && !empty($analytics_settings['client_id']) ) $analytics_mandatoryFields['client_id'] = true; if ( isset($analytics_settings['client_secret']) && !empty($analytics_settings['client_secret']) ) $analytics_mandatoryFields['client_secret'] = true; if ( isset($analytics_settings['redirect_uri']) && !empty($analytics_settings['redirect_uri']) ) $analytics_mandatoryFields['redirect_uri'] = true; $mandatoryValid = true; foreach ($analytics_mandatoryFields as $k=>$v) { if ( !$v ) { $mandatoryValid = false; break; } } $return = array( 'status' => $mandatoryValid ? 'valid' : 'invalid', 'log' => $mandatoryValid ? __('all mandatory fields: client id, client secret, redirect uri are set!', 'psp') : __('some of the mandatory fields: client id, client secret, redirect uri are NOT set!', 'psp'), 'execution_time' => number_format( microtime(true) - $start, 2) ); } // end step 1 if ( $action == 'step2' ) { $auth = $pspGoogleAnalytics->makeoAuthLogin(); $msg = isset($analytics_settings['last_status']) ? $analytics_settings['last_status'] : 'no message logged yet!'; $return = array( 'status' => $auth ? 'valid' : 'invalid', 'log' => $msg, 'execution_time' => number_format( microtime(true) - $start, 2) ); } // end step 2 if ( $action == 'step3' ) { $getProfile = $pspGoogleAnalytics->get_profiles(); $isProfile = false; if ( isset($analytics_settings['profile_id']) && !empty($analytics_settings['profile_id']) && count($getProfile) > 0 && !isset($getProfile['0']) ) { $isProfile = true; } $msg = isset($analytics_settings['profile_last_status']) ? $analytics_settings['profile_last_status'] : 'no message logged yet!'; $return = array( 'status' => $isProfile ? 'valid' : 'invalid', 'log' => $msg, 'execution_time' => number_format( microtime(true) - $start, 2) ); } // end step 3 if ( $action == 'step4' ) { $today = date( 'Y-m-d' ); $_REQUEST['return'] = 'array'; $_REQUEST['sub_action'] = 'getAudience'; $_REQUEST['from_date'] = date( 'Y-m-d', strtotime( "-1 week", strtotime( $today ) ) ); $_REQUEST['to_date'] = date( 'Y-m-d', strtotime( $today ) ); $getGraph = $pspGoogleAnalytics->ajax_request(); $isGraph = false; if ( isset($getGraph['getAudience']['status']) ) { $isGraph = true; if ( isset($getGraph['getAudience']['data']) ) { $msg = $getGraph['getAudience']['data']; } else { $msg = $getGraph['getAudience']['reason']; } } else { $msg = $getGraph['__access']['msg']; } $return = array( 'status' => $isGraph ? 'valid' : 'invalid', 'log' => $msg, 'execution_time' => number_format( microtime(true) - $start, 2) ); } // end step 4 } // SERP if ( $module == 'serp' ) { // Google SERP $serp_settings = $this->the_plugin->get_theoption( $this->the_plugin->alias . '_serp' ); $serp_mandatoryFields = array( 'developer_key' => false, 'custom_search_id' => false, 'google_country' => false ); // get the module init file require_once( $this->the_plugin->cfg['paths']['plugin_dir_path'] . 'modules/serp/init.php' ); // Initialize the pspGoogleAnalytics class $pspSERP = new pspSERP(); if ( $action == 'step1' ) { if ( isset($serp_settings['developer_key']) && !empty($serp_settings['developer_key']) ) $serp_mandatoryFields['developer_key'] = true; if ( isset($serp_settings['custom_search_id']) && !empty($serp_settings['custom_search_id']) ) $serp_mandatoryFields['custom_search_id'] = true; if ( isset($serp_settings['google_country']) && !empty($serp_settings['google_country']) ) $serp_mandatoryFields['google_country'] = true; $mandatoryValid = true; foreach ($serp_mandatoryFields as $k=>$v) { if ( !$v ) { $mandatoryValid = false; break; } } $return = array( 'status' => $mandatoryValid ? 'valid' : 'invalid', 'log' => $mandatoryValid ? __('all mandatory fields: developer key, custom search id, google country are set!', 'psp') : __('some of the mandatory fields: developer key, custom search id, google country are NOT set!', 'psp'), 'execution_time' => number_format( microtime(true) - $start, 2) ); } // end step 1 if ( $action == 'step2' ) { $today = date( 'Y-m-d' ); $_REQUEST['return'] = 'array'; $_REQUEST['keyword'] = 'test'; $_REQUEST['link'] = 'www.test.com'; $getGraph = $pspSERP->addToReporter(); $isGraph = false; if ( isset($getGraph['status']) && $getGraph['status']=='valid' ) { $isGraph = true; $msg = $getGraph['status']; } else { $msg = $getGraph['status']; } // refresh to get new log! $serp_settings = $this->the_plugin->get_theoption( $this->the_plugin->alias . '_serp' ); $msg = isset($serp_settings['last_status']) ? $serp_settings['last_status'] : 'no message logged yet!'; $return = array( 'status' => $isGraph ? 'valid' : 'invalid', 'log' => $msg, 'execution_time' => number_format( microtime(true) - $start, 2) ); } // end step 2 } // Pagespeed if ( $module == 'pagespeed' ) { // Google Pagespeed $pagespeed_settings = $this->the_plugin->get_theoption( $this->the_plugin->alias . '_pagespeed' ); $pagespeed_mandatoryFields = array( 'developer_key' => false, 'google_language' => false ); // get the module init file require_once( $this->the_plugin->cfg['paths']['plugin_dir_path'] . 'modules/google_pagespeed/ajax.php' ); // Initialize the pspPageSpeedInsightsAjax class $pspPagespeed = new pspPageSpeedInsightsAjax($this->the_plugin); if ( $action == 'step1' ) { if ( isset($pagespeed_settings['developer_key']) && !empty($pagespeed_settings['developer_key']) ) $pagespeed_mandatoryFields['developer_key'] = true; if ( isset($pagespeed_settings['google_language']) && !empty($pagespeed_settings['google_language']) ) $pagespeed_mandatoryFields['google_language'] = true; $mandatoryValid = true; foreach ($pagespeed_mandatoryFields as $k=>$v) { if ( !$v ) { $mandatoryValid = false; break; } } $return = array( 'status' => $mandatoryValid ? 'valid' : 'invalid', 'log' => $mandatoryValid ? __('all mandatory fields: developer key, google language are set!', 'psp') : __('some of the mandatory fields: developer key, google language are NOT set!', 'psp'), 'execution_time' => number_format( microtime(true) - $start, 2) ); } // end step 1 if ( $action == 'step2' ) { $today = date( 'Y-m-d' ); $_REQUEST['return'] = 'array'; $_REQUEST['sub_actions'] = 'checkPage,viewSpeedRaportById'; // get homepage $postid = 0; $postid = get_option( 'page_for_posts' ); if ( !$postid ) { $postid = get_option( 'page_on_front' ); } if ( !$postid ) { $args = array( 'posts_per_page' => 1, 'offset'=> 0 ); $myposts = get_posts( $args ); $postid = $myposts[0]->ID; } $_REQUEST['postid'] = $postid; $_REQUEST['link'] = get_permalink( (int) $_REQUEST['postid'] ); $getGraph = $pspPagespeed->check_page( $_REQUEST['link'], $_REQUEST['postid'] ); $isGraph = false; if ( isset($getGraph['status']) && $getGraph['status']=='valid' ) { $isGraph = true; $msg = $getGraph['status']; } else { $msg = $getGraph['status']; } // refresh to get new log! $pagespeed_settings = $this->the_plugin->get_theoption( $this->the_plugin->alias . '_pagespeed' ); $msg = isset($pagespeed_settings['last_status']) ? $pagespeed_settings['last_status'] : 'no message logged yet!'; $return = array( 'status' => $isGraph ? 'valid' : 'invalid', 'log' => $msg, 'execution_time' => number_format( microtime(true) - $start, 2) ); } // end step 2 } // facebook planner if ( $module == 'facebook_planner' ) { $facebook_settings = $this->the_plugin->get_theoption( $this->the_plugin->alias . '_facebook_planner' ); $facebook_mandatoryFields = array( 'app_id' => false, 'app_secret' => false, 'language' => false, 'redirect_uri' => false ); // get the module init file require_once( $this->the_plugin->cfg['paths']['plugin_dir_path'] . 'modules/facebook_planner/init.php' ); // Initialize the pspGoogleAnalytics class $pspFacebook_Planner = new pspFacebook_Planner(); if ( $action == 'step1' ) { if ( isset($facebook_settings['app_id']) && !empty($facebook_settings['app_id']) ) $facebook_mandatoryFields['app_id'] = true; if ( isset($facebook_settings['app_secret']) && !empty($facebook_settings['app_secret']) ) $facebook_mandatoryFields['app_secret'] = true; if ( isset($facebook_settings['redirect_uri']) && !empty($facebook_settings['redirect_uri']) ) $facebook_mandatoryFields['redirect_uri'] = true; if ( isset($facebook_settings['language']) && !empty($facebook_settings['language']) ) $facebook_mandatoryFields['language'] = true; $mandatoryValid = true; foreach ($facebook_mandatoryFields as $k=>$v) { if ( !$v ) { $mandatoryValid = false; break; } } $return = array( 'status' => $mandatoryValid ? 'valid' : 'invalid', 'log' => $mandatoryValid ? __('all mandatory fields: app id, app secret, language are set!', 'psp') : __('some of the mandatory fields: app id, app secret, language are NOT set!', 'psp'), 'execution_time' => number_format( microtime(true) - $start, 2) ); } // end step 1 if ( $action == 'step2' ) { if ( 'fbv4' == $this->the_plugin->facebook_sdk_version ) { $auth = $pspFacebook_Planner->makeoAuthLogin_fbv4(array( 'psp_redirect_url' => 'server_status', )); } //else { // $auth = $pspFacebook_Planner->makeoAuthLogin(); //} $msg = isset($facebook_settings['last_status']) ? $facebook_settings['last_status'] : 'no message logged yet!'; $return = array( 'status' => $auth ? 'valid' : 'invalid', 'log' => $msg, 'execution_time' => number_format( microtime(true) - $start, 2) ); } // end step 2 } // Tiny Compress if ( $module == 'tinycompress' ) { // Tiny Compress $tinycompress_settings = $this->the_plugin->get_theoption( $this->the_plugin->alias . '_tiny_compress' ); $tinycompress_mandatoryFields = array( 'tiny_key' => false, 'image_sizes' => false, ); // get the module init file require_once( $this->the_plugin->cfg['paths']['plugin_dir_path'] . 'modules/tiny_compress/init.php' ); // Initialize the pspTinyCompress class $pspTinyCompress = new pspTinyCompress(); if ( $action == 'step1' ) { if ( isset($tinycompress_settings['tiny_key']) && !empty($tinycompress_settings['tiny_key']) ) $tinycompress_mandatoryFields['tiny_key'] = true; if ( isset($tinycompress_settings['image_sizes']) && !empty($tinycompress_settings['image_sizes']) ) $tinycompress_mandatoryFields['image_sizes'] = true; $mandatoryValid = true; foreach ($tinycompress_mandatoryFields as $k=>$v) { if ( !$v ) { $mandatoryValid = false; break; } } $return = array( 'status' => $mandatoryValid ? 'valid' : 'invalid', 'log' => $mandatoryValid ? __('all mandatory fields: tiny api key, image sizes are set!', 'psp') : __('some of the mandatory fields: tiny api key, image sizes are NOT set!', 'psp'), 'execution_time' => number_format( microtime(true) - $start, 2) ); } // end step 1 if ( $action == 'step2' ) { $today = date( 'Y-m-d' ); $connection_status = $pspTinyCompress->get_connection_status(); $isLastStatus = false; if ( isset($connection_status['status']) && $connection_status['status']=='valid' ) { $isLastStatus = true; $msg = $connection_status['msg']; } else { $msg = $connection_status['msg']; } // refresh to get new log! /* $tinycompress_settings = $this->the_plugin->get_theoption( $this->the_plugin->alias . '_tiny_compress' ); $lt = isset($tinycompress_settings['last_status']) ? $tinycompress_settings['last_status'] : ''; $isLastStatus = empty($lt) || preg_match('/^\'+$/imu', $lt) ? false : true; $msg = $isLastStatus ? $lt : 'no message logged yet!'; */ $return = array( 'status' => $isLastStatus ? 'valid' : 'invalid', 'log' => $msg, 'execution_time' => number_format( microtime(true) - $start, 2) ); } // end step 2 } die(json_encode($return)); } public function ajax_operation( $retType = 'die' ) { $action = isset($_REQUEST['sub_action']) ? $_REQUEST['sub_action'] : ''; $ret = array( 'status' => 'invalid', 'html' => '' ); if (!in_array($action, array( 'check_integrity_database', ))) die(json_encode($ret)); if ( 'check_integrity_database' == $action ) { $opStatus = $this->the_plugin->plugin_integrity_check( 'check_database', true ); $opStatus_stat = $this->the_plugin->plugin_integrity_get_last_status( 'check_database' ); $check_last_msg = ''; if ( '' != trim($opStatus_stat['html']) ) { $check_last_msg = ( $opStatus_stat['status'] == true ? '
    ' : '
    ' ) . $opStatus_stat['html'] . '
    '; } $ret = array( 'status' => 'valid', //( $opStatus_stat['status'] == true ? 'valid' : 'valid' ), 'html' => $check_last_msg ); } //if ( $retType == 'die' ) die(json_encode($ret)); //else return $ret; die(json_encode($ret)); } } }wK \ +smartSEO/modules/server_status/app.class.js ob/* Document : 404 Monitor Author : Andrei Dinca, AA-Team http://codecanyon.net/user/AA-Team */ // Initialization and events code for the app pspPriceUpdateMonitor = (function ($) { "use strict"; // public var debug_level = 0; var maincontainer = null; var loading = null; var loaded_page = 0; // init function, autoload (function init() { // load the triggers $(document).ready(function(){ maincontainer = $(".psp-main"); loading = maincontainer.find("#psp-main-loading"); triggers(); }); })(); function row_loading( row, status ) { if( status == 'show' ){ if( row.size() > 0 ){ if( row.find('.psp-row-loading-marker').size() == 0 ){ var row_loading_box = $('
    ') row_loading_box.find('div.psp-row-loading').css({ 'width': row.width(), 'height': row.height(), 'top': '-16px' }); row.find('td').eq(0).append(row_loading_box); } row.find('.psp-row-loading-marker').fadeIn('fast'); } }else{ row.find('.psp-row-loading-marker').fadeOut('fast'); } } function server_status( that, action ) { //return false; jQuery.post(ajaxurl, { 'action' : 'pspServerStatusRequest', 'sub_action' : action, 'debug_level' : debug_level }, function(response) { if( response.status == 'valid' ){ that.css('background-image', 'none'); that.html( response.html ); if ( action == 'active_modules' ) that.data('hasResponse', 'yes'); } }, 'json'); } function export_logs( log ) { jQuery.post(ajaxurl, { 'action' : 'pspServerStatusRequest', 'sub_action' : 'export_log', //'log' : log.html(), 'log' : 'test', 'debug_level' : debug_level }, function(response) { if( response.status == 'valid' ){ that.css('background-image', 'none'); that.html( response.html ); } }, 'json'); } function stress_test_step1( that, module ) { var $wrapper = that.parent('div').parent('div.psp-verify-products-test'); // hide the begin test button // that.parent('div').fadeOut(); // show the timeline var timeline = $wrapper.find(".psp-test-timeline"); timeline.show(); // show log container var logs_container = $wrapper.find(".psp-table.psp-logs"); logs_container.show(); var status_box_step = $wrapper.find(".stepid-step1").find(".psp-step-status"); jQuery.post(ajaxurl, { 'action' : 'pspServerStatusVerify', 'module' : module, 'sub_action' : 'step1', 'debug_level' : debug_level }, function(response) { // save the log logs_container.find(".logbox-step1").css('opacity', 1); logs_container.find(".logbox-step1 .psp-log-details").val( JSON.stringify( response.log ) ); // show the status into timeline status_box_step.removeClass('psp-loading-inprogress'); if( response.status == 'valid' ){ status_box_step.addClass('psp-loading-success'); status_box_step.html("success " + ( response.execution_time ) + "\""); // if success, go to step 2 stress_test_step2( that, module, timeline, logs_container ); } else{ status_box_step.addClass('psp-loading-error'); status_box_step.html("error"); } }, 'json') .error(function(response) { // save the log logs_container.find(".logbox-step1").css('opacity', 1); var messge = "Please contact your server administrator and ask about this error: " + response.status + ": " + response.statusText; logs_container.find(".logbox-step1 .psp-log-details").val( messge ); status_box_step.removeClass('psp-loading-inprogress').addClass('psp-loading-error'); status_box_step.html("error"); }); } function stress_test_step2( that, module, timeline, logs_container ) { var $wrapper = that.parent('div').parent('div.psp-verify-products-test'); // set step 2 timeline loading var status_box_step = $wrapper.find(".stepid-step2").find(".psp-step-status"); status_box_step.addClass('psp-loading-inprogress'); jQuery.post(ajaxurl, { 'action' : 'pspServerStatusVerify', 'module' : module, 'sub_action' : 'step2', 'debug_level' : debug_level }, function(response) { // save the log logs_container.find(".logbox-step2").css('opacity', 1); logs_container.find(".logbox-step2 .psp-log-details").val( JSON.stringify( response.log ) ); // show the status into timeline status_box_step.removeClass('psp-loading-inprogress'); if( response.status == 'valid' ){ status_box_step.addClass('psp-loading-success'); status_box_step.html("success " + ( response.execution_time ) + "\""); // if success, go to step 3 stress_test_step3( that, module, timeline, logs_container ); } else{ status_box_step.removeClass('psp-loading-inprogress').addClass('psp-loading-error'); status_box_step.html("error"); } }, 'json') .error(function(response) { // save the log logs_container.find(".logbox-step2").css('opacity', 1); var messge = "Please contact your server administrator and ask about this error: " + response.status + ": " + response.statusText; logs_container.find(".logbox-step2 .psp-log-details").val( messge ); status_box_step.addClass('psp-loading-error'); status_box_step.html("error"); }); } function stress_test_step3( that, module, timeline, logs_container ) { var $wrapper = that.parent('div').parent('div.psp-verify-products-test'); // set step 3 timeline loading var status_box_step = $wrapper.find(".stepid-step3").find(".psp-step-status"); status_box_step.addClass('psp-loading-inprogress'); jQuery.post(ajaxurl, { 'action' : 'pspServerStatusVerify', 'module' : module, 'sub_action' : 'step3', 'debug_level' : debug_level }, function(response) { // save the log logs_container.find(".logbox-step3").css('opacity', 1); logs_container.find(".logbox-step3 .psp-log-details").val( JSON.stringify( response.log ) ); // show the status into timeline status_box_step.removeClass('psp-loading-inprogress'); if( response.status == 'valid' ){ status_box_step.addClass('psp-loading-success'); status_box_step.html("success " + ( response.execution_time ) + "\""); // if success, go to step 4 stress_test_step4( that, module, timeline, logs_container ); } else{ status_box_step.addClass('psp-loading-error'); status_box_step.html("error"); } }, 'json') .error(function(response) { // save the log logs_container.find(".logbox-step3").css('opacity', 1); var messge = "Please contact your server administrator and ask about this error: " + response.status + ": " + response.statusText; logs_container.find(".logbox-step3 .psp-log-details").val( messge ); status_box_step.removeClass('psp-loading-inprogress').addClass('psp-loading-error'); status_box_step.html("error"); }); } function stress_test_step4( that, module, timeline, logs_container ) { var $wrapper = that.parent('div').parent('div.psp-verify-products-test'); // set step 4 timeline loading var status_box_step = $wrapper.find(".stepid-step4").find(".psp-step-status"); status_box_step.addClass('psp-loading-inprogress'); jQuery.post(ajaxurl, { 'action' : 'pspServerStatusVerify', 'module' : module, 'sub_action' : 'step4', 'debug_level' : debug_level }, function(response) { // save the log logs_container.find(".logbox-step4").css('opacity', 1); logs_container.find(".logbox-step4 .psp-log-details").val( JSON.stringify( response.log ) ); // show the status into timeline status_box_step.removeClass('psp-loading-inprogress'); if( response.status == 'valid' ){ status_box_step.addClass('psp-loading-success'); status_box_step.html("success " + ( response.execution_time ) + "\""); } else{ status_box_step.addClass('psp-loading-error'); status_box_step.html("error"); } }, 'json') .error(function(response) { // save the log logs_container.find(".logbox-step4").css('opacity', 1); var messge = "Please contact your server administrator and ask about this error: " + response.status + ": " + response.statusText; logs_container.find(".logbox-step4 .psp-log-details").val( messge ); status_box_step.removeClass('psp-loading-inprogress').addClass('psp-loading-error'); status_box_step.html("error"); }); } function verifyHash() { var alias = 'sect-', modules = ['google_analytics', 'google_serp', 'google_pagespeed', 'facebook_planner', 'tiny_compress'], sect = '', doVerify = false, url = document.location.href, hash = url.replace( /^[^#]*#?(.*)$/, '$1' ); for (var i in modules) { sect = alias + modules[i]; if ( typeof hash != 'undefined' && hash != '' && sect == hash ) doVerify = true; } if (doVerify) { var $el = $(".psp-loading-ajax-details").filter(function(i, el) { return $(this).data('action') == 'active_modules'; }); if ( $el.length > 0 ) { (function findSect() { var timer = setTimeout(function() { var hasResp = $el.data('hasResponse'); if ( typeof hasResp != 'undefined' && hasResp == 'yes' ) { clearTimeout( timer ); timer = null; pspFreamwork.scrollToElement( '#' + hash, 1000, '-40' ); return false; } findSect(); }, 50); })(); } } } function triggers() { verifyHash(); maincontainer.on('click', '.psp-log-title a', function(e){ e.preventDefault(); var that = $(this), parent = that.parent('div'); parent.next(".psp-log-details").show(); }); maincontainer.on('click', '.psp-export-logs', function(e){ e.preventDefault(); export_logs( $(".psp-panel-content > .psp-table" ) ); }); $(".psp-loading-ajax-details").each( function(){ var that = $(this), action = that.data('action'); server_status( that, action ); }); // google analytics! maincontainer.on('click', 'a.pspStressTest.verify', function(e){ e.preventDefault(); var that = $(this); stress_test_step1( that, that.data('module') ); }); // check integrity database maincontainer.on('click', '.psp-check-integrity-container > a', function(e){ e.preventDefault(); var that = $(this); ajax_operation( that, that.data('action') ); }); } function ajax_operation( that, action ) { //return false; jQuery.post(ajaxurl, { 'action' : 'pspServerStatusOperation', 'sub_action' : action, 'debug_level' : debug_level }, function(response) { if( response.status == 'valid' ) { var $resp = that.parent().find('.psp-response'); $resp.css('background-image', 'none'); $resp.html( response.html ); } }, 'json'); } // external usage return { } })(jQuery); if (typeof JSON !== 'object') { JSON = {}; } (function () { 'use strict'; function f(n) { // Format integers to have at least two digits. return n < 10 ? '0' + n : n; } if (typeof Date.prototype.toJSON !== 'function') { Date.prototype.toJSON = function () { return isFinite(this.valueOf()) ? this.getUTCFullYear() + '-' + f(this.getUTCMonth() + 1) + '-' + f(this.getUTCDate()) + 'T' + f(this.getUTCHours()) + ':' + f(this.getUTCMinutes()) + ':' + f(this.getUTCSeconds()) + 'Z' : null; }; String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function () { return this.valueOf(); }; } var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, gap, indent, meta = { // table of character substitutions '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\' }, rep; function quote(string) { // If the string contains no control characters, no quote characters, and no // backslash characters, then we can safely slap some quotes around it. // Otherwise we must also replace the offending characters with safe escape // sequences. escapable.lastIndex = 0; return escapable.test(string) ? '"' + string.replace(escapable, function (a) { var c = meta[a]; return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); }) + '"' : '"' + string + '"'; } function str(key, holder) { // Produce a string from holder[key]. var i, // The loop counter. k, // The member key. v, // The member value. length, mind = gap, partial, value = holder[key]; // If the value has a toJSON method, call it to obtain a replacement value. if (value && typeof value === 'object' && typeof value.toJSON === 'function') { value = value.toJSON(key); } // If we were called with a replacer function, then call the replacer to // obtain a replacement value. if (typeof rep === 'function') { value = rep.call(holder, key, value); } // What happens next depends on the value's type. switch (typeof value) { case 'string': return quote(value); case 'number': // JSON numbers must be finite. Encode non-finite numbers as null. return isFinite(value) ? String(value) : 'null'; case 'boolean': case 'null': // If the value is a boolean or null, convert it to a string. Note: // typeof null does not produce 'null'. The case is included here in // the remote chance that this gets fixed someday. return String(value); // If the type is 'object', we might be dealing with an object or an array or // null. case 'object': // Due to a specification blunder in ECMAScript, typeof null is 'object', // so watch out for that case. if (!value) { return 'null'; } // Make an array to hold the partial results of stringifying this object value. gap += indent; partial = []; // Is the value an array? if (Object.prototype.toString.apply(value) === '[object Array]') { // The value is an array. Stringify every element. Use null as a placeholder // for non-JSON values. length = value.length; for (i = 0; i < length; i += 1) { partial[i] = str(i, value) || 'null'; } // Join all of the elements together, separated with commas, and wrap them in // brackets. v = partial.length === 0 ? '[]' : gap ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : '[' + partial.join(',') + ']'; gap = mind; return v; } // If the replacer is an array, use it to select the members to be stringified. if (rep && typeof rep === 'object') { length = rep.length; for (i = 0; i < length; i += 1) { if (typeof rep[i] === 'string') { k = rep[i]; v = str(k, value); if (v) { partial.push(quote(k) + (gap ? ': ' : ':') + v); } } } } else { // Otherwise, iterate through all of the keys in the object. for (k in value) { if (Object.prototype.hasOwnProperty.call(value, k)) { v = str(k, value); if (v) { partial.push(quote(k) + (gap ? ': ' : ':') + v); } } } } // Join all of the member texts together, separated with commas, // and wrap them in braces. v = partial.length === 0 ? '{}' : gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : '{' + partial.join(',') + '}'; gap = mind; return v; } } // If the JSON object does not yet have a stringify method, give it one. if (typeof JSON.stringify !== 'function') { JSON.stringify = function (value, replacer, space) { // The stringify method takes a value and an optional replacer, and an optional // space parameter, and returns a JSON text. The replacer can be a function // that can replace values, or an array of strings that will select the keys. // A default replacer method can be provided. Use of the space parameter can // produce text that is more easily readable. var i; gap = ''; indent = ''; // If the space parameter is a number, make an indent string containing that // many spaces. if (typeof space === 'number') { for (i = 0; i < space; i += 1) { indent += ' '; } // If the space parameter is a string, it will be used as the indent string. } else if (typeof space === 'string') { indent = space; } // If there is a replacer, it must be a function or an array. // Otherwise, throw an error. rep = replacer; if (replacer && typeof replacer !== 'function' && (typeof replacer !== 'object' || typeof replacer.length !== 'number')) { throw new Error('JSON.stringify'); } // Make a fake root object containing our value under the key of ''. // Return the result of stringifying the value. return str('', {'': value}); }; } // If the JSON object does not yet have a parse method, give it one. if (typeof JSON.parse !== 'function') { JSON.parse = function (text, reviver) { // The parse method takes a text and an optional reviver function, and returns // a JavaScript value if the text is a valid JSON text. var j; function walk(holder, key) { // The walk method is used to recursively walk the resulting structure so // that modifications can be made. var k, v, value = holder[key]; if (value && typeof value === 'object') { for (k in value) { if (Object.prototype.hasOwnProperty.call(value, k)) { v = walk(value, k); if (v !== undefined) { value[k] = v; } else { delete value[k]; } } } } return reviver.call(holder, key, value); } // Parsing happens in four stages. In the first stage, we replace certain // Unicode characters with escape sequences. JavaScript handles many characters // incorrectly, either silently deleting them, or treating them as line endings. text = String(text); cx.lastIndex = 0; if (cx.test(text)) { text = text.replace(cx, function (a) { return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); }); } // In the second stage, we run the text against regular expressions that look // for non-JSON patterns. We are especially concerned with '()' and 'new' // because they can cause invocation, and '=' because it can cause mutation. // But just to be safe, we want to reject all unexpected forms. // We split the second stage into 4 regexp operations in order to work around // crippling inefficiencies in IE's and Safari's regexp engines. First we // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we // replace all simple value tokens with ']' characters. Third, we delete all // open brackets that follow a colon or comma or that begin the text. Finally, // we look to see that the remaining characters are only whitespace or ']' or // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. if (/^[\],:{}\s]*$/ .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { // In the third stage we use the eval function to compile the text into a // JavaScript structure. The '{' operator is subject to a syntactic ambiguity // in JavaScript: it can begin a block or an object literal. We wrap the text // in parens to eliminate the ambiguity. j = eval('(' + text + ')'); // In the optional fourth stage, we recursively walk the new structure, passing // each name/value pair to a reviver function for possible transformation. return typeof reviver === 'function' ? walk({'': j}, '') : j; } // If the text is not JSON parseable, then a SyntaxError is thrown. throw new SyntaxError('JSON.parse'); }; } }());Pf1*D ""3o&smartSEO/modules/server_status/app.css ob.psp-table { border: 1px solid #bcbfc4; } table.psp-table tr td, table.psp-table tr th { padding: 7px 10px; } .psp-table thead th { text-align: left; } .psp-verify-products-test { } .psp-test-timeline { width: 700px; background: none repeat scroll 0 0 #ECF0F1; border: 1px solid #D7D9DF; margin: 4px 50px 4px 0px; padding: 2px; position: relative; height: 20px; padding-right: 5px; display: none; } .psp-test-timeline .psp-one_step { border-right: 1px solid #484848; float: left; height: 18px; width: 33.6%; position: relative; margin-right: -4px; } .psp-test-timeline .psp-one_step.nbsteps1 { width: 99%; } .psp-test-timeline .psp-one_step.nbsteps2 { width: 49.7%; } .psp-test-timeline .psp-one_step.nbsteps3 { width: 33.6%; } .psp-test-timeline .psp-one_step.nbsteps4 { width: 24.8%; } .psp-one_step .psp-step-name { position: absolute; width: 65px; height: 24px; line-height: 22px; padding: 0px; right: -34px; top: -32px; margin-left: -32px; background: #7d8688; text-align: center; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; color: #fff; } .psp-one_step .psp-step-name:after { content: ""; position: absolute; bottom: -10px; left: 25px; border-style: solid; border-width: 10px 7px 0; border-color: #7d8688 transparent; display: block; width: 0; z-index: 1; } .psp-one_step .psp-step-status { border: 1px solid #adb3b4; width: 100%; height: 18px; background: #fff; } .psp-one_step .psp-step-status.psp-loading-success { background: #2ecc71; border-color: #27ae60; position: relative; color: #fff; text-align: center; } .psp-one_step .psp-step-status.psp-loading-error { background: #e74c3c; border-color: #c0392b; position: relative; color: #fff; text-align: center; } .psp-one_step .psp-step-status.psp-loading-inprogress { background-image: url("../../aa-framework/images/ajax-loader.gif"); background-position: center center; background-repeat: no-repeat; } .psp-table.psp-logs { border: 1px solid #bcbfc4; width: 709px !important; margin: 10px 0px 10px 0px; display: none; } .psp-table.psp-logs td:first-child { font-weight: bold; vertical-align: middle !important; } .psp-log-title { position: relative; } .psp-log-title .psp-button { position: absolute; top: -4px; right: 0px; } .psp-table.psp-logs .psp-log-details { border: 1px solid #bcbfc4; width: 100%; height: 140px; margin: 5px 0px 0px 0px; display: none; } .psp-table.psp-logs tr td:last-child { padding-right: 6px; } .psp-table.psp-logs tr:first-child td { border-top: none; } .psp-table.psp-logs tr td { border-top: 1px solid #bcbfc4; } .psp-table.psp-logs tr { opacity: 0.2; } .psp-begin-test-container { width: 600px; height: 30px; } .psp-begin-test-container.noheight { height: auto; } .psp-begin-test-container input { position: relative; top: -8px; width: 120px; } .psp-begin-test-container label { position: relative; top: -10px; right: -4px; } .psp-loading-ajax-details { background-image: url("../../aa-framework/images/ajax-loader.gif"); background-repeat: no-repeat; background-position: center left; width: 100%; min-height: 25px; } .psp-table tbody .psp-loading-ajax-details .active_modules { display: inline-block; width: 100%; } .psp-table tbody .psp-loading-ajax-details .active_modules img { padding-right: 7px; width: 16px; height: 16px; } .psp-table tbody .psp-loading-ajax-details .active_modules .version { margin-left: 3px; } .psp-table tbody .psp-loading-ajax-details .active_modules .description { margin-left: 7px; font-size: 11px; font-weight: normal; } table.psp-table .psp-row-status.psp-loading-success { background: #2ecc71; border-color: #27ae60; position: relative; color: #fff; text-align: center; } table.psp-table .psp-row-status.psp-loading-error { background: #e74c3c; border-color: #c0392b; position: relative; color: #fff; text-align: center; } .psp-button.inline { display: inline; }V ررas6smartSEO/modules/server_status/assets/16_serversts.png obPNG  IHDRa pHYs  iCCPPhotoshop ICC profilexڍoe?ά uS'BJA.B-mmcbowNgwfˏEo*r`E $ !1PIRݝ6==}>dR}MZ0녪TZVIa]l*ہ)ʾ$$n^~"OJ`B{BYSOLB* tV8tNE8ЩFKrӮ+zbx5G,HO*ǶJUTiǕ1\36u1`'$N@b#4f2.H>5Egjo!Yq&~ƛ>&/ԏv? <ɻ598Ѩ\hkGΙZpwG@hzxY B)׮aA[HS2ȏ,amt C5Α&wC7qQ5JcMͲ"ƚJ9w 0'e$ux<ƢD,>:8xHNIfpffTx,pD79uE>Ő8$>,x]9}`+oQ~K]H,J {]z۱o{"rO|̴_nk[㶸֭kh=}Q m/wRE2C{KHx+*N{7s{Ï9FӿLN}Քל#vY]վԾz{2n%ޚff`̡̗c;̜nz^&p[S]V$E@ӫ-1jk9#e2=Q#g0rFȯ:{ds7SHfP8!q <ʩBko:}WZc]RNTsĤE?,o 8h7d`mlg<1\o773F:]ZzR3/`eqyN4ҶiTXtXML:com.adobe.xmp Adobe Photoshop CC (Macintosh) 2014-03-17T16:36:28+02:00 2014-03-17T16:42:06+02:00 2014-03-17T16:42:06+02:00 image/png xmp.iid:69e1327e-3a32-4ab8-b24b-0b0c8cf4feaf xmp.did:3070ad8c-5dd1-482f-a4bb-db7e92d3f7cc xmp.did:3070ad8c-5dd1-482f-a4bb-db7e92d3f7cc created xmp.iid:3070ad8c-5dd1-482f-a4bb-db7e92d3f7cc 2014-03-17T16:36:28+02:00 Adobe Photoshop CC (Macintosh) saved xmp.iid:960f9d79-96c9-4aff-9800-fa459f80b1de 2014-03-17T16:38:08+02:00 Adobe Photoshop CC (Macintosh) / saved xmp.iid:5b6a2358-c237-4a1e-a62d-db1adc7828dd 2014-03-17T16:42:06+02:00 Adobe Photoshop CC (Macintosh) / converted from application/vnd.adobe.photoshop to image/png derived converted from application/vnd.adobe.photoshop to image/png saved xmp.iid:69e1327e-3a32-4ab8-b24b-0b0c8cf4feaf 2014-03-17T16:42:06+02:00 Adobe Photoshop CC (Macintosh) / xmp.iid:5b6a2358-c237-4a1e-a62d-db1adc7828dd xmp.did:3070ad8c-5dd1-482f-a4bb-db7e92d3f7cc xmp.did:3070ad8c-5dd1-482f-a4bb-db7e92d3f7cc 01572CA43F1E3A8160018073B8740742 024F796E6EB19108F58B6C5CBC92BFAB 02AD8C32EFDA8FFDA17773883C5AAC94 07915DA1719E56F9E1595BFEF0D147E5 08BB5329D93CC641BE97A023BD1CAEB1 0B577B6A134B449EDAAABC0EDC0F8E23 104107DEE7473480BC36240B15D0828F 11A01A357438223E32B67CB5F38E57EB 142315D3D5F08AD07BD100AE3E9D6023 1F318427C4B9D75A9A326FF8C0EB8208 2060245C617D273175534EAA5AA26A21 20DA58E2790F7350DDD31C0E47118966 2BAC96F93029B8409AAA9A83C6C8E0B6 2CC3277F2AF0BC423F255627CCDC64D9 3CEF098BEEE207B2D28713FA41A91F99 41EDA4468139D2A335F7C650EB891357 445BD608B87ECF51070CE97900EBAEBE 447A83FE9F059FAE0B1EB5BA19B45A39 4A64588F74F050EB1E63F287CC177CF3 4FE9DB0E928E52EB8CE243BBFAC4A557 55B758C43A57A264DA9E3354837F022E 55BCF7BD2E918CDD1CC761C55F4717DC 599FD634435DF0632FDA16ED3F1D0557 59F2D561D6B867AFEFB9952A2D5FF38D 617FA99AD0EBF0A549AAF8E6C2ED496C 619BD56CC4FEA59FFD2C2AD6CAAA69E3 6F0535DF0BC6A696263219F409C3E95D 76C513B5F60DA9EEEFCD69BF9AD32158 82E45C4F2E3BB5026FEB55788E8B46D2 83C25B812DF8753C4A25799E51016FAC 83F84CEE57D174FB62657681F4A88BBE 8D1A0ADD2E8D10B1FE65CC7C43EEC95A 8F48DC0F12C6E4CE5E0F05473CE8F6F1 946AD6422484AAF697DCBB25BB6642A3 9C239BDC71753AFB5A0D130978F23EA2 9D80DA8B7F04316654BF1E09260F7F70 A1401CCA5E96AD523B0C97616A5E8F1D A1D16162D80934986806426F7AE2765F B192FA8F1E5BB1C1A649438DAFA2C9A5 BC2B829F2BD2918A42FF6AA6D4C68CAA BED2401C96EC4268B153EC448CEA9737 C27A6EE216DEDDF452B9D9321E056730 C8A4588815AABA6DEDC876FBCA06B4D8 CF38E47788C68A47F6B689A750211D60 CF7C46B18733C648EFC5E51D96B561D2 D67C0825A8B7FD496D2B75309A224B65 D6E6053232371882D9CE98FD29881FF7 DF698680E0ACAC53A262DE2F9A38C895 E27D491CFE73849F282FDBB0245325E5 E795B782469DEF7079ED781318CB4B9E E7D7F49ADF8A9D50C80181F8156B7F6D E9B34685FE9E28D3BDEE9A1F9BC51CE2 ED3547DA3B2ECEAFDE751D5373E88343 EE705C74D86BA4F86801A2E4D2E8B83D EF9F52E39C5E375D5250630B1C2C4AC9 EFBCA7F452AD034564040DA2B7758F69 F0CDBE86158BA39A954327D634ECFA82 FA8CD7EAB5D939145BE099E13E1FE499 adobe:docid:photoshop:0629df6d-a412-11da-9dde-c8a00c7693e5 adobe:docid:photoshop:0fc79f20-d232-11db-b1bb-aeba6ac5ef65 adobe:docid:photoshop:112ff759-2eb4-11d8-a7a3-d143df8e175d adobe:docid:photoshop:17f5aa33-b3be-11dc-9058-b94aaeb221d7 adobe:docid:photoshop:42b55d04-ca65-11da-ac60-99df23f712b8 adobe:docid:photoshop:4f6997ab-913d-11dc-a3e7-c094cbb267fd adobe:docid:photoshop:67825bcd-c497-11d9-9b79-b43e3425d820 adobe:docid:photoshop:6cc72dd4-c122-11da-9ea0-b410217bc604 adobe:docid:photoshop:72ee0624-feb0-11df-95f8-fbdf23b3ba38 adobe:docid:photoshop:76c7207c-5eda-11da-8dd2-e400fd2b8985 adobe:docid:photoshop:8d293722-0529-11da-8d9f-87e9dc8d9ac6 adobe:docid:photoshop:97c3b72d-4db2-11d9-9000-c6cf0216aa2e adobe:docid:photoshop:c5063482-0f94-11db-a9d4-b21f0f974623 adobe:docid:photoshop:c6f96f3b-5231-11dd-b295-c1ce63d1952b adobe:docid:photoshop:ee6e49c8-7ce6-11d7-a363-f9d10a5efd56 adobe:docid:photoshop:ef1a6e5e-cbe9-11da-80fe-a32a41494dfa uuid:001538AE6ADFDB11A160D41A8AFEFCAB uuid:0F82B8E1008DDE118063A18DC277C381 uuid:134CED88052EDD11B423D4798897593C uuid:138E6BEB550311DE9C9980EB732A103B uuid:169BE01290ACDC118FF9BE61B5313549 uuid:16BCA70A928BDB119FE2D1D1AD6D4DCE uuid:19501508E2EF11DD8BECCB6B4552BEA7 uuid:1C746F852FB6DD11856A9A95FF697F0E uuid:1EF56AB8E4FEDB11B991B9E549BBAB83 uuid:2008E13DE47DDD119CA6C60CABE7E84D uuid:207F5AB1E3E6DE11AFB6E5ECBD156976 uuid:2290C3CD8FACDC118FF9BE61B5313549 uuid:29F3D697198FDD1184F5AD5C323BD3E2 uuid:2BFAFD88407EDC118371AA574708AABD uuid:2F207EF07CC311DC870CD15D8998FC19 uuid:304189413A6DDD119AFBF80C0D12BBC3 uuid:32C9A1BE013BDF11B28AB1E9B9BBF88A uuid:348C14E2B68DE011B2D0DF71982ECD78 uuid:36483A0B31BA11DEB3BCC14406C17F6A uuid:36483A1131BA11DEB3BCC14406C17F6A uuid:37DD06A87653E1118422D9075FE29A11 uuid:3A8AF8CF577911E0A1AEADCEF7A8C695 uuid:3CB8F15F31B6DD11856A9A95FF697F0E uuid:469594D60783DC11B8A6C730DDF0A3E8 uuid:47D9591E31BA11DEB3BCC14406C17F6A uuid:47F508C2CB3EDE1189BBC659B9EC8880 uuid:49E8A66A3BB5DE11809BA989B0D77432 uuid:4B7C1B8FA601DD11A05B82F82E7564A7 uuid:4DAB2F01082BDC11A590ADEFB8A01727 uuid:4F9AD90BECFEDB11B991B9E549BBAB83 uuid:5344B517DA0CDE11AB76806D8F41191A uuid:54E3BAB15595DE1191E8AA31C2B4DE24 uuid:56D4817031A9DD11B70DB0CF0BC9EDCD uuid:5B25B2A4FC5FDE118C55E1FD1DE5BAC3 uuid:5B636B2FE0B0DE11A587BCC51C1D4B69 uuid:5BAB8930E193DD11ACDF9A606EE463A3 uuid:5DA895C1944CDE119C89B968D8A62C72 uuid:6192C48C2463DC11A938D0D477F76208 uuid:6355C15346DFDC11A214AD89929E38D3 uuid:68B73160563E11E0A57A92CDC08EBFDC uuid:6A51460EFCEFDE11A35CD3D8F4849AB1 uuid:6BD6CAFDC3E7DC118D17CCC8742E2E78 uuid:6D2D16B0565211E0A57A92CDC08EBFDC uuid:7222A0DBD298DC1182C6BEF4D19F3EF2 uuid:75DCEEF5501BDF118174D58534E02F48 uuid:78BDAE073DD4DD119574E49260AE7023 uuid:7F5CD1D0302EDF11A06B87AB6D5393CF uuid:8426B111521BDF118174D58534E02F48 uuid:84BCB3D4733CDD11AB1EBF4A6A17D95E uuid:87DD43522302DC11ACBFC215FBEC85FF uuid:8EF58BA46E66DC1193F48773309C9D8D uuid:905423059AE9DA119E84CAF24BDD6066 uuid:90ADF7D5398A11DF86119436A17CB227 uuid:90C4C16F24ABDD11BC05B48537EE3891 uuid:92108B13A540DE11A29DF00ED4C1B727 uuid:9369042C2F46DE11BD9EE5A6639A625F uuid:95C5C57C521BDF118174D58534E02F48 uuid:976501A145A6DF118EF0F8A0A306590B uuid:997168516F27DE118DD28306BA0AD781 uuid:9C6B168B2263DC11A938D0D477F76208 uuid:9DCFFAE96350DF1198DBAA6ABC516A5B uuid:9DD593BF31BB11DEB3BCC14406C17F6A uuid:9E27DCC8DD70DD11AFB2FB57BC79BEFD uuid:9E393079ED09DC119950AA34618C8687 uuid:9E749DEB31BA11DEB3BCC14406C17F6A uuid:A3CFFAE96350DF1198DBAA6ABC516A5B uuid:A4A0074F8101DC11B2DCD85209BF7530 uuid:A4A6D5B3CF6EDE11B59CDBEDD4FA0491 uuid:A6359C7E140ADC11A2DAA4D78F509131 uuid:A6B8E3575957DD119F3F8760AB0AA4FE uuid:AE02AF60883FDD11AC2BE9025EE1BBF9 uuid:B01BB22766F8DA119EB1D1E45291D5FA uuid:B4EC9A2F511BDF118174D58534E02F48 uuid:B886F63C4E62DE118924E4732F4AFB5E uuid:B8DBE641D274DC11B15CC929E0BBB1F0 uuid:BAA5CD7B8DAFDB11BB67B9E1DC4CE7A2 uuid:BAAF5DE4E21C11DDACC5B29D9085C55A uuid:BC1357D69796DC118AF8AC23B60971C1 uuid:BD5AFE0931BA11DEB3BCC14406C17F6A uuid:C0599F3447CCDC11824DE83F3063EB00 uuid:C8FFC71C31A9DD11B70DB0CF0BC9EDCD uuid:CEEBB5CC348DDC1191489627CE433B2D uuid:CF5479BA31BA11DEB3BCC14406C17F6A uuid:D1DE550983DEDD11B182D5DA082F73C9 uuid:D2EBAF8C9303DC118103AC75D3E1885B uuid:D371356656E1DB11A1EDB8C01A221B6C uuid:D4D29E8CE37DDD119CA6C60CABE7E84D uuid:DC4C48BEE80EDD119117B0EC9223F3FB uuid:E0FEFDA0DE26DF11925DB7C100A3E828 uuid:E51D53285CF7DE11BAA3858EFB8697A5 uuid:E752405CD502DC1183F88C80D133AE02 uuid:E97F51296D0ADE1187DEC54A1F42F690 uuid:ECE2612CF702DC119927C0AD4422C47F uuid:F0D3FF33AE63DD11A1C8DBED5B6F2ED7 uuid:F2652DC558E1DB11A1EDB8C01A221B6C uuid:F331D6A9AE00DC11ACAF98334D040065 uuid:F3F7568A445BDE1184E2C3A479231CEB uuid:F81E9BC9978ADE1196A0EFF950960E15 uuid:FF9AF64D0C39DF11BF8393223FA3F19B xmp.did:00801174072068118083BAFDA65F8430 xmp.did:00EE06B326A4E111AF47D84B5110F70D xmp.did:0180117407206811828A9C07725CD1BC xmp.did:0180117407206811871F9B09294944B5 xmp.did:0180117407206811871FB6D45CC9A53C xmp.did:018011740720681188C6E4708E0E2747 xmp.did:01801174072068118DBBB0B046013550 xmp.did:01801174072068118DBBD7411B5EC877 xmp.did:01801174072068118DBBF67CC7525F38 xmp.did:01801174072068118F6281652F82AFE6 xmp.did:01801174072068118F6283F08ABAE4B0 xmp.did:01801174072068118F6284B29ADFCC43 xmp.did:01801174072068118F628DC2429FD647 xmp.did:01801174072068118F62EB2ADE46D273 xmp.did:01801174072068118F79B7473C32B448 xmp.did:01801174072068118FBC9421557B7B20 xmp.did:01801174072068119109B5666CC87C3E xmp.did:01801174072068119109DDF6FAAF36D2 xmp.did:01801174072068119109F305646EB57D xmp.did:01801174072068119109FA297A7A5904 xmp.did:018011740720681192B08AE26BD827F7 xmp.did:018011740720681192B0B727F2063586 xmp.did:018011740720681192B0BAA904DE0F8D xmp.did:018011740720681192B0EA0610751F7C xmp.did:018011740720681195FE85312F4E4086 xmp.did:018011740720681197A5CD7DCFD54202 xmp.did:018011740720681197A5DAF2583A0A4B xmp.did:018011740720681197A5F9674A0885AD xmp.did:0180117407206811994CB67047760989 xmp.did:0180117407206811994CE07EFE756DA7 xmp.did:0180117407206811A088E49E19740FB2 xmp.did:0180117407206811AB08E8E8EE3F0289 xmp.did:0180117407206811B50CFC9853933782 xmp.did:0180117407206811B6BE96AFFBCEFD7E xmp.did:01BDB8EC4B4011E1B98CEF24291654DE xmp.did:02801174072068118F629EAE88CED33B xmp.did:02801174072068119109B0F0B9959332 xmp.did:02801174072068119109C13AE0D52ACD xmp.did:02801174072068119109C65A70401340 xmp.did:02801174072068119DBFAEEF0353CE0A xmp.did:0280117407206811A818A5FA62C0A48A xmp.did:0280117407206811B44DF79DFC232CD8 xmp.did:03801174072068118A6DE0B43D455FB9 xmp.did:03801174072068118F62DFCEF30AAC90 xmp.did:03801174072068119109F03089D4B9B9 xmp.did:038011740720681197A59FB566CBE17E xmp.did:0380117407206811B8B5B25456C28219 xmp.did:0480117407206811822AB634F36508C2 xmp.did:048011740720681191098D76C49036E9 xmp.did:04C7B018AD8BE0118005E62EBF747214 xmp.did:04EE06B326A4E111AF47D84B5110F70D xmp.did:058011740720681192B0B03D2B78CFDD xmp.did:0580117407206811BCD78B457D78A81D xmp.did:05D444BCFE64DF11A64FA7B28D390DE9 xmp.did:0605C7F9D822681195FEA4354762D610 xmp.did:0680117407206811871FC852CC88A456 xmp.did:068011740720681192B0F8CAB850210B xmp.did:0764F0FC39206811920BD6CB55DF7E21 xmp.did:078011740720681197F3DAD110AB1D7D xmp.did:0880117407206811871FFE11C8ACA7AE xmp.did:08801174072068119457C4C657E622B8 xmp.did:088D6ED2437011E088D29E4C0233231A xmp.did:0980117407206811994CE07EFE756DA7 xmp.did:0980117407206811B1A4F894E8A7A910 xmp.did:09F76F48C3C7DE11925FE106D59B22C8 xmp.did:0A368DA92F39E0119258DF6378E0E372 xmp.did:0A483A276D2068119457B4E8E216C3A8 xmp.did:0A89FF8AE8A8E011A816A106ECD60EAD xmp.did:0C3F353F2167E2118D30DED9691A214B xmp.did:0C483A276D2068119457B4E8E216C3A8 xmp.did:0D18F7379D3EDF119B20E8B33AC24173 xmp.did:1439D15279D511E19671E44CBD77ACF2 xmp.did:149AEF289F20681192B0A9A85A8A7D16 xmp.did:15C2C46649B2E011BC4B89489F74C31C xmp.did:16CE2978BF2BDF11B1C9D5AA7FB5335E xmp.did:174FAB68C1B3E0119D60EAD8B0E55DEB xmp.did:176A42696DCCDF11B4C780F3440113A1 xmp.did:17D4795219206811994C9AA37B1758FD xmp.did:1887D09300216811A056AC0239505D2E xmp.did:1898268C5597E0119487CB48DC3DD8DC xmp.did:194993840129E1118B6683AB8BA184CC xmp.did:194FAB68C1B3E0119D60EAD8B0E55DEB xmp.did:1A0AA41B6576DF11A0EA8D814D891314 xmp.did:1A4FAB68C1B3E0119D60EAD8B0E55DEB xmp.did:1A87D09300216811A056AC0239505D2E xmp.did:1B4FAB68C1B3E0119D60EAD8B0E55DEB xmp.did:1CBB581A2D2268118DBBFC31635E93B6 xmp.did:1D541901DF4BE011B3A2B8E9249F1B48 xmp.did:20BB8F69102168118DBBBB77ECE750CC xmp.did:21E4C91A9F9EE011ACA098E241098547 xmp.did:2325628D6A59E011A4FAF43FA448DE9C xmp.did:2425628D6A59E011A4FAF43FA448DE9C xmp.did:28B3672D7767DF11B32EB6BE29A22260 xmp.did:295BA0A36A76E0119CA1815ECAD13ED2 xmp.did:298B4D5D11206811920BD6CB55DF7E21 xmp.did:2A2118970D2068119109FC901257E622 xmp.did:2A7A21AD11216811994C80DBF724891C xmp.did:2A8DADA9201EE011842A99364FEBD0F6 xmp.did:2ACF258E325DE011A1A5CBD15F1C5D8A xmp.did:2B0FAC131420681188C69B8C88BD3CC1 xmp.did:2D0FAC131420681188C69B8C88BD3CC1 xmp.did:2D49ECD639CEDE11AC1FBF9D231E361F xmp.did:2DF8BDAF08206811A056AC0239505D2E xmp.did:2F0FAC131420681188C69B8C88BD3CC1 xmp.did:310FAC131420681188C69B8C88BD3CC1 xmp.did:31C6EDB7352068119109A05ED6E5C9B4 xmp.did:321F17924B3268118DBBBFECFBC2A23E xmp.did:330FAC131420681188C69B8C88BD3CC1 xmp.did:331A1DE61120681191098946CB8DAAB6 xmp.did:34171119382068118F62CFDF647A2B49 xmp.did:3430CAFA0B2068119109A05ED6E5C9B4 xmp.did:37108FD0D25811E08013A15AD7E5F089 xmp.did:378FF16EB8A8E011A816A106ECD60EAD xmp.did:3804A6C3B853DF119FF2EB1981619B1F xmp.did:38157EBE224FE011B047D7F07BD7BBC0 xmp.did:381BE30EE535DE118F219ECC9DE4732B xmp.did:3892E408BD53E0118E47D5B457BBAED7 xmp.did:399DEF2EF1E9DE1183AEB319878DB4AA xmp.did:3A3CE7F335206811B311EBA70FD71192 xmp.did:3AFBCD36732068119457B4E8E216C3A8 xmp.did:3BDD977B1F2068118F62F4555C5E84BE xmp.did:3C17D9B5007011E0BAA5A546D65C57CC xmp.did:3E3CE7F335206811B311EBA70FD71192 xmp.did:3E51E265833FE011AA6A8DA7AB0A81D0 xmp.did:3FBE3CFB20206811A472E9C34FBDCB1B xmp.did:41178B8188D4DD11BF828F18DEEAE683 xmp.did:42C8435B1F206811A9619D3E69A42F4A xmp.did:42CBEF71662268118F62F8E68BACEB90 xmp.did:42DD52B8322068118F62C099F7DFBA1B xmp.did:44972308022368118A6DC7B27BABA40A xmp.did:44C7E966DEACE01186C0EE0104E410A1 xmp.did:450652A0D25811E084B2FC8CD418D5A2 xmp.did:4618A328212068118DBBA997D43539B9 xmp.did:49BC7A4F35206811B311EBA70FD71192 xmp.did:4A83F1387620681197A5B53B0C75C963 xmp.did:4B5C4472412068118083BAFDA65F8430 xmp.did:4C4949F6B82ADE1195A78A8137920439 xmp.did:4D15C4DBB82BDF11B1C9D5AA7FB5335E xmp.did:4D46A20FF75AE011817EF430ABC94196 xmp.did:4D5C4472412068118083BAFDA65F8430 xmp.did:4E15C4DBB82BDF11B1C9D5AA7FB5335E xmp.did:4E8F42D203D811E190EB8FF8DF0840C7 xmp.did:4F0CFAAE632568118DBBFC31635E93B6 xmp.did:4FDD2F6FA22BDF11B1C9D5AA7FB5335E xmp.did:4FFFE781FC0CDE11A770A9ABB3D9137E xmp.did:501167C17451E0119063CB825D612016 xmp.did:510B91F3AB2068118A6DF9D78C0F9B15 xmp.did:51546FDD1320681192B0BAA904DE0F8D xmp.did:54546FDD1320681192B0BAA904DE0F8D xmp.did:54BF11E22DCBDE11AC1FBF9D231E361F xmp.did:54C6CCC48F7DE0118A8F80BF7355E0D1 xmp.did:55E2C85D50B911E09B45EB5D6BDA9918 xmp.did:56BF11E22DCBDE11AC1FBF9D231E361F xmp.did:583BD1F31720681191098946CB8DAAB6 xmp.did:586276373B20681197A5ABE98A388C5F xmp.did:590D834E29AFE011BB50818B7E198924 xmp.did:593E6CA71120681188C69B8C88BD3CC1 xmp.did:5B3E6CA71120681188C69B8C88BD3CC1 xmp.did:5C20A878E3246811B4F2E4B54918CE3A xmp.did:5C810BCA432068118F62F8D9147DC05A xmp.did:5CE96B67222568118DBBFC31635E93B6 xmp.did:5D3E6CA71120681188C69B8C88BD3CC1 xmp.did:5DEA28BF0A20681191098CDF369CA920 xmp.did:5F8E58AB66AEE011BB50818B7E198924 xmp.did:62D01CE14BF911E0A0A08DC280149321 xmp.did:638880E80920681192B0BAA904DE0F8D xmp.did:648880E80920681192B0BAA904DE0F8D xmp.did:6625348F6D43E011B1B5DB40F0283379 xmp.did:668880E80920681192B0BAA904DE0F8D xmp.did:6735706A402068119457C4C657E622B8 xmp.did:678880E80920681192B0BAA904DE0F8D xmp.did:68C8EE3EEBABE0119875CB404E826AAC xmp.did:6AE4DB37096FDF11BD60EAD4B082D434 xmp.did:6B159B20C5ACE01186C0EE0104E410A1 xmp.did:6E843CF8437011E088D29E4C0233231A xmp.did:7138CE366F61E111A5F0E9A958BBD36C xmp.did:727318241C16E011A6BDE351CD2F170F xmp.did:73C5D4E7ECA7E011ABD49328F4BC62FE xmp.did:753A28DD3120681197F3DAD110AB1D7D xmp.did:7841B3F958A3E1118EE39C2C7AC22163 xmp.did:7B24B5768A72E011938DBEF8D25B6A28 xmp.did:7C3E01E7621EE0119FA7EAA9BF1AC2FE xmp.did:7C702F8623CEDE11AC1FBF9D231E361F xmp.did:7FD93A5FBF57DF11A6E5DB9F6F6C55FC xmp.did:7FFFA217A653DF11872EF9A8EFC0E527 xmp.did:80CE0A53F2FBE011BE70F7A2A05D4BEA xmp.did:81d1c7cd-b12e-44f9-a79b-78a48dfa510b xmp.did:85B2001FDBA8E1119FFCA576B484D989 xmp.did:86754CDB0820681188C6DA43C866EEAE xmp.did:86C08269482068119457C4C657E622B8 xmp.did:86D9306BCF20681188C68D6968983E56 xmp.did:8A101BFFC72068118DBBFC31635E93B6 xmp.did:8A63DD1700CF11E191B7E8D4874E87EA xmp.did:8C808E7F85DDE0119A5BC7203B0F52A5 xmp.did:8CFA6888BDC9E0118A1894B66E94A91C xmp.did:8FC93F7B2EAFE01191C6909159CD1941 xmp.did:90A1EB3B082068118603AD4B49AD7764 xmp.did:9260FA1A3E12DE118089D2AE8FA9A37E xmp.did:92E4E5920A20681194098696425599BA xmp.did:95C2077600CF11E1B332971007A50C02 xmp.did:9666F0B64C2568118DBBFC31635E93B6 xmp.did:96925A4197C2E011B180E288B7389DB2 xmp.did:96E44C36EE4EE01195F4B95F349B38BF xmp.did:97197485D51EDE119E659B86C3686744 xmp.did:973AB16794B1E011AF59B6057C510CF7 xmp.did:984F950EB29DE111B056A6C58D1607AE xmp.did:9B4613316923E111B8D9F5BDE94825E4 xmp.did:9C34F11D8567E1119E03F98C97A3B1AF xmp.did:9C66F0B64C2568118DBBFC31635E93B6 xmp.did:9E1C987F773CE0119951FE9E21D95FD2 xmp.did:A2C2B76E1320681188C69B8C88BD3CC1 xmp.did:A2D86490D952DF11967E8720A676FAF0 xmp.did:A3B6ACD2D133E011B14D815C16B7C2CD xmp.did:A6C2B76E1320681188C69B8C88BD3CC1 xmp.did:A8C2B76E1320681188C69B8C88BD3CC1 xmp.did:AA219AA73F2068119B7BD4F86EBFACF4 xmp.did:AAC2B76E1320681188C69B8C88BD3CC1 xmp.did:AAE0E9190C2068119109B208AFE7A4D2 xmp.did:ACC2B76E1320681188C69B8C88BD3CC1 xmp.did:AD026819AF5BDF118C5AF66058A6DDB5 xmp.did:AD1818B51F206811815ED0470E64A083 xmp.did:AD909E2ABF5FE211BC75A780DCE622FB xmp.did:AE752A91EF8D11E0B59EFA46D6C257DD xmp.did:AE9ABA76FAC8E011A72BDC489F5B89F7 xmp.did:B03244C1C18EE011AB41D8FD6E7F1E9A xmp.did:B0B076C44920681192B0EC05249DD377 xmp.did:B1AA322600CF11E185E891BAF236F5D5 xmp.did:B1DD540D3BCEDE11AC1FBF9D231E361F xmp.did:B28B606385C6E01185BED54A95B1630C xmp.did:B2E7D2623E52DF119BFF8B070109B2C6 xmp.did:B3DD540D3BCEDE11AC1FBF9D231E361F xmp.did:B53BDA96C7206811ABD4B664A86E6DC6 xmp.did:B8440D0B0F206811AE3FD62352FF1D11 xmp.did:B85E369DF0ABE011A0EAA0B446E442FE xmp.did:B928BC2D2E2068118F62A2D886FC3EA7 xmp.did:B9D5D6D3BC38DE11951B998C65B1B618 xmp.did:B9DD4C1C2E2668118DBBFC31635E93B6 xmp.did:BA621BD59254DF119563A63D2350A99D xmp.did:BB3565E81520681192B0BAA904DE0F8D xmp.did:BBAD363C202068118F62F8D9147DC05A xmp.did:BBDD540D3BCEDE11AC1FBF9D231E361F xmp.did:BC5E369DF0ABE011A0EAA0B446E442FE xmp.did:BC87D955B461DF1186C7B47407E46CEC xmp.did:BCCA85B00B2068119109870628CE59B5 xmp.did:BD3F85792F60E01180C2A532D32911CC xmp.did:BEA61E1EE6F0DF118A48A038B5F54722 xmp.did:BF7E93310B2068119109E40C65AF52D5 xmp.did:C028BC2D2E2068118F62A2D886FC3EA7 xmp.did:C0A61E1EE6F0DF118A48A038B5F54722 xmp.did:C23565E81520681192B0BAA904DE0F8D xmp.did:C373CEC0362068118F62D0F7010AC02F xmp.did:C5F5FBA4B262DF11A5908EE048EFD3D2 xmp.did:C67F1174072068119109E40C65AF52D5 xmp.did:C72BB5B253DDDF11A4D5D54ADD1CE786 xmp.did:C95A7CC3AFA9E0119E7DE495A33FFAC7 xmp.did:C97F117407206811994CF132BC83D69A xmp.did:CB5A7CC3AFA9E0119E7DE495A33FFAC7 xmp.did:CBB4D1F9D22368118DBBF2DAAEBE3D62 xmp.did:CC0C567EB42168118F0FBB5DBDD97766 xmp.did:CD5A7CC3AFA9E0119E7DE495A33FFAC7 xmp.did:CF202C7400D011E18D96E08C37B82D61 xmp.did:CFB4D1F9D22368118DBBF2DAAEBE3D62 xmp.did:CFC659F89E20DF118A73D73207D10630 xmp.did:D1C13B2778B7DE11994196785E609050 xmp.did:D366EFA10A20681191098977F35DFB2C xmp.did:D4054EC11920681192B0BAA904DE0F8D xmp.did:D44404ACAED5E011A6FE9FC6A55C05A3 xmp.did:D4F431872BE011E1BD20A05C192A7A05 xmp.did:D883498B272068118DBBF11625A05A5C xmp.did:D8FF4BF0AE71E01192CC8DA08924FABB xmp.did:DABF1920E8E6E1119507C1B6640A63A6 xmp.did:DC5F1D7EB557DF11A6E5DB9F6F6C55FC xmp.did:DC6570B46458DF1191428977A047BDAA xmp.did:E4D11ACAE40FDE118598AD22A001510A xmp.did:E8FE6E6DE62E6811994C8EBF8F51C4A6 xmp.did:EA0D6809B52468119604BD563ECECA8D xmp.did:EA90CCE850216811AE56AF0821E747B2 xmp.did:EAD3D6971220681188C69B8C88BD3CC1 xmp.did:EC47EBE89857DF11A6E5DB9F6F6C55FC xmp.did:ECAA5F395A2368118F62F8E68BACEB90 xmp.did:ECD3D6971220681188C69B8C88BD3CC1 xmp.did:ED7F1174072068119457FF348A38AABA xmp.did:EE693A7E1C2068118DBBB9F63A3FE05F xmp.did:EED3D6971220681188C69B8C88BD3CC1 xmp.did:EEE453CD12206811871FC58FD6F55664 xmp.did:F0CA1CDE8020681192B0A9A85A8A7D16 xmp.did:F0D3D6971220681188C69B8C88BD3CC1 xmp.did:F0EC54C91EF0E011BF318C473C42BF32 xmp.did:F2D3D6971220681188C69B8C88BD3CC1 xmp.did:F37F1174072068118F62DDDDAFF10DFB xmp.did:F5C96B6611206811994C973DAB47318D xmp.did:F5F3271861E8E011A8B1E233584C880C xmp.did:F70C4FE61920681188C6E817E1445A54 xmp.did:F75D918A1120681192B08BEE29C75DD2 xmp.did:F77F1174072068118083EB83C62BD7C1 xmp.did:F77F117407206811871F867F3B44C780 xmp.did:F77F117407206811871FCCB4A2ADB235 xmp.did:F77F11740720681188C6B07CC95C0538 xmp.did:F77F1174072068118C14928747CA1A04 xmp.did:F77F1174072068118DBBBF093A1DAA97 xmp.did:F77F1174072068118DC196984EFEC09F xmp.did:F77F1174072068118F1CFECA782915C6 xmp.did:F77F1174072068118F62EEA207DB2DFF xmp.did:F77F1174072068119109CC85AE74B274 xmp.did:F77F1174072068119109CD214D5A7EFE xmp.did:F77F1174072068119109F8FE27718D5A xmp.did:F77F1174072068119457F53F102BBA12 xmp.did:F77F11740720681194FC8A3235E08E7E xmp.did:F77F11740720681195FEC1F5E62B59CE xmp.did:F77F11740720681195FEE3C51095942E xmp.did:F77F1174072068119B83CEEA27995AC4 xmp.did:F77F1174072068119C12FCC73F11446E xmp.did:F77F117407206811A7BACE4D918669F7 xmp.did:F77F117407206811A9F8A44324AE3979 xmp.did:F77F117407206811AA7CEE1FC8B15BD5 xmp.did:F77F117407206811AE56D6748533125F xmp.did:F87F1174072068118C1499CEFB83A67B xmp.did:F87F1174072068118DBBBF093A1DAA97 xmp.did:F87F117407206811B4E49E03AC4C228B xmp.did:F8B1200EC82068118F62B55C94B5F1CA xmp.did:F8C58836202368119AA4FC7100F2C672 xmp.did:F97F1174072068118083EB83C62BD7C1 xmp.did:F97F1174072068118DBBB19E0C24AE1C xmp.did:F99A94C85A2068119457B4E8E216C3A8 xmp.did:F9BD06E86176E011BBC0D959D25D44FD xmp.did:FA7F117407206811822AC411053758AF xmp.did:FAFBB512432668118DBBFC31635E93B6 xmp.did:FB1A20AB659BE011913BB35C5E38BF39 xmp.did:FB7F1174072068118603AD4B49AD7764 xmp.did:FB7F1174072068118F62B4C0222208FE xmp.did:FB7F11740720681192B0DC8DC9EE0D67 xmp.did:FB9AB60C0BE6DF119976D66446F575DC xmp.did:FBC4D2040A2068119109CC642C44EC0C xmp.did:FBF99FCCEA61DF11B23FC8C2DC80D41E xmp.did:FC7F1174072068118DBBF11625A05A5C xmp.did:FC7F1174072068118F62D51A6DC08DF3 xmp.did:FC9AB60C0BE6DF119976D66446F575DC xmp.did:FD7F117407206811A178B4862A3AC2C7 xmp.did:FD9AB60C0BE6DF119976D66446F575DC xmp.did:FE7F1174072068118083BAFDA65F8430 xmp.did:FE7F1174072068118F62DD804FF26847 xmp.did:FF7F11740720681192B0DCE86BF657A9 3 Generic RGB Profile 1 720000/10000 720000/10000 2 65535 16 16 iU cHRMms{n3'IIDATxڤӽjTQܙ$&3Ub FEA$V`yۊ`-v(B0j$kqLff6{uEQ6ӘF ^c?E.ԱS؎XX$.b{ Wރ2^`v+"x'ncmY` HaYZK_Y$8MPTZ4qQh$8,Ẇ,- >h6+>?D &#߅#$QA(mH 8Rq)WqʺRbN$n1)JYk)]8gk,DG;88nH]HYzll. ncbkxsTIENDB`*`Y sր9smartSEO/modules/server_status/assets/32_serverstatus.png obPNG  IHDR szz pHYs  iCCPPhotoshop ICC profilexڍoe?ά uS'BJA.B-mmcbowNgwfˏEo*r`E $ !1PIRݝ6==}>dR}MZ0녪TZVIa]l*ہ)ʾ$$n^~"OJ`B{BYSOLB* tV8tNE8ЩFKrӮ+zbx5G,HO*ǶJUTiǕ1\36u1`'$N@b#4f2.H>5Egjo!Yq&~ƛ>&/ԏv? <ɻ598Ѩ\hkGΙZpwG@hzxY B)׮aA[HS2ȏ,amt C5Α&wC7qQ5JcMͲ"ƚJ9w 0'e$ux<ƢD,>:8xHNIfpffTx,pD79uE>Ő8$>,x]9}`+oQ~K]H,J {]z۱o{"rO|̴_nk[㶸֭kh=}Q m/wRE2C{KHx+*N{7s{Ï9FӿLN}Քל#vY]վԾz{2n%ޚff`̡̗c;̜nz^&p[S]V$E@ӫ-1jk9#e2=Q#g0rFȯ:{ds7SHfP8!q <ʩBko:}WZc]RNTsĤE?,o 8h7d`mlg<1\o773F:]ZzR3/`eqyN4A4iTXtXML:com.adobe.xmp Adobe Photoshop CC (Macintosh) 2014-03-17T16:22:17+02:00 2014-03-17T16:29:09+02:00 2014-03-17T16:29:09+02:00 image/png xmp.iid:d8c51ba8-a305-466c-baac-209513839a1e xmp.did:be2132c5-d06f-45c5-a6ab-e956db8ce623 xmp.did:be2132c5-d06f-45c5-a6ab-e956db8ce623 created xmp.iid:be2132c5-d06f-45c5-a6ab-e956db8ce623 2014-03-17T16:22:17+02:00 Adobe Photoshop CC (Macintosh) saved xmp.iid:54f7f65d-1763-43a8-b825-c8869c6bcd7a 2014-03-17T16:27:40+02:00 Adobe Photoshop CC (Macintosh) / saved xmp.iid:0b9afaf5-c610-4812-8705-9035e1925587 2014-03-17T16:29:09+02:00 Adobe Photoshop CC (Macintosh) / converted from application/vnd.adobe.photoshop to image/png derived converted from application/vnd.adobe.photoshop to image/png saved xmp.iid:d8c51ba8-a305-466c-baac-209513839a1e 2014-03-17T16:29:09+02:00 Adobe Photoshop CC (Macintosh) / xmp.iid:0b9afaf5-c610-4812-8705-9035e1925587 xmp.did:be2132c5-d06f-45c5-a6ab-e956db8ce623 xmp.did:be2132c5-d06f-45c5-a6ab-e956db8ce623 3 Generic RGB Profile 1 720000/10000 720000/10000 2 65535 32 32 iJ cHRMms{n3'IIDATx]UUg٣HYE`?XHA"bVRPERVh"CaAVw"RyeEEIYEΜ.fxf3?*M 6w}޵VFF:$[0؋ I؍BT8 OADĉ\Dľw_=#ވ5d#bJDKG2䷍q "8WFG;"vE4Q|,Uֈ9" {TU1)"&DļQ{mdg-D%vYцlǝŠaj+ZL׎$A),pH4.}3Lt* q,U汤t|W`Al딼jcCA*ۑj|Exe |OR8Z-6 a=&&i]Ķ@_l^L=(1#]Q$lD`܃OԛJYWS*Q,M<hae6.9W`gJK_3ɋD5C_0s44t6ݥ֥*E!ŶqRfw7/mo_@M֫Eaimmr ŪoY;sx炾8ٶ&g,Ҩi%gq:5`yڒ ųIENDB`ʇ5S ررas3smartSEO/modules/server_status/assets/menu_icon.png obPNG  IHDRa pHYs  iCCPPhotoshop ICC profilexڍoe?ά uS'BJA.B-mmcbowNgwfˏEo*r`E $ !1PIRݝ6==}>dR}MZ0녪TZVIa]l*ہ)ʾ$$n^~"OJ`B{BYSOLB* tV8tNE8ЩFKrӮ+zbx5G,HO*ǶJUTiǕ1\36u1`'$N@b#4f2.H>5Egjo!Yq&~ƛ>&/ԏv? <ɻ598Ѩ\hkGΙZpwG@hzxY B)׮aA[HS2ȏ,amt C5Α&wC7qQ5JcMͲ"ƚJ9w 0'e$ux<ƢD,>:8xHNIfpffTx,pD79uE>Ő8$>,x]9}`+oQ~K]H,J {]z۱o{"rO|̴_nk[㶸֭kh=}Q m/wRE2C{KHx+*N{7s{Ï9FӿLN}Քל#vY]վԾz{2n%ޚff`̡̗c;̜nz^&p[S]V$E@ӫ-1jk9#e2=Q#g0rFȯ:{ds7SHfP8!q <ʩBko:}WZc]RNTsĤE?,o 8h7d`mlg<1\o773F:]ZzR3/`eqyN4ҶiTXtXML:com.adobe.xmp Adobe Photoshop CC (Macintosh) 2014-03-17T16:36:28+02:00 2014-03-17T16:42:06+02:00 2014-03-17T16:42:06+02:00 image/png xmp.iid:69e1327e-3a32-4ab8-b24b-0b0c8cf4feaf xmp.did:3070ad8c-5dd1-482f-a4bb-db7e92d3f7cc xmp.did:3070ad8c-5dd1-482f-a4bb-db7e92d3f7cc created xmp.iid:3070ad8c-5dd1-482f-a4bb-db7e92d3f7cc 2014-03-17T16:36:28+02:00 Adobe Photoshop CC (Macintosh) saved xmp.iid:960f9d79-96c9-4aff-9800-fa459f80b1de 2014-03-17T16:38:08+02:00 Adobe Photoshop CC (Macintosh) / saved xmp.iid:5b6a2358-c237-4a1e-a62d-db1adc7828dd 2014-03-17T16:42:06+02:00 Adobe Photoshop CC (Macintosh) / converted from application/vnd.adobe.photoshop to image/png derived converted from application/vnd.adobe.photoshop to image/png saved xmp.iid:69e1327e-3a32-4ab8-b24b-0b0c8cf4feaf 2014-03-17T16:42:06+02:00 Adobe Photoshop CC (Macintosh) / xmp.iid:5b6a2358-c237-4a1e-a62d-db1adc7828dd xmp.did:3070ad8c-5dd1-482f-a4bb-db7e92d3f7cc xmp.did:3070ad8c-5dd1-482f-a4bb-db7e92d3f7cc 01572CA43F1E3A8160018073B8740742 024F796E6EB19108F58B6C5CBC92BFAB 02AD8C32EFDA8FFDA17773883C5AAC94 07915DA1719E56F9E1595BFEF0D147E5 08BB5329D93CC641BE97A023BD1CAEB1 0B577B6A134B449EDAAABC0EDC0F8E23 104107DEE7473480BC36240B15D0828F 11A01A357438223E32B67CB5F38E57EB 142315D3D5F08AD07BD100AE3E9D6023 1F318427C4B9D75A9A326FF8C0EB8208 2060245C617D273175534EAA5AA26A21 20DA58E2790F7350DDD31C0E47118966 2BAC96F93029B8409AAA9A83C6C8E0B6 2CC3277F2AF0BC423F255627CCDC64D9 3CEF098BEEE207B2D28713FA41A91F99 41EDA4468139D2A335F7C650EB891357 445BD608B87ECF51070CE97900EBAEBE 447A83FE9F059FAE0B1EB5BA19B45A39 4A64588F74F050EB1E63F287CC177CF3 4FE9DB0E928E52EB8CE243BBFAC4A557 55B758C43A57A264DA9E3354837F022E 55BCF7BD2E918CDD1CC761C55F4717DC 599FD634435DF0632FDA16ED3F1D0557 59F2D561D6B867AFEFB9952A2D5FF38D 617FA99AD0EBF0A549AAF8E6C2ED496C 619BD56CC4FEA59FFD2C2AD6CAAA69E3 6F0535DF0BC6A696263219F409C3E95D 76C513B5F60DA9EEEFCD69BF9AD32158 82E45C4F2E3BB5026FEB55788E8B46D2 83C25B812DF8753C4A25799E51016FAC 83F84CEE57D174FB62657681F4A88BBE 8D1A0ADD2E8D10B1FE65CC7C43EEC95A 8F48DC0F12C6E4CE5E0F05473CE8F6F1 946AD6422484AAF697DCBB25BB6642A3 9C239BDC71753AFB5A0D130978F23EA2 9D80DA8B7F04316654BF1E09260F7F70 A1401CCA5E96AD523B0C97616A5E8F1D A1D16162D80934986806426F7AE2765F B192FA8F1E5BB1C1A649438DAFA2C9A5 BC2B829F2BD2918A42FF6AA6D4C68CAA BED2401C96EC4268B153EC448CEA9737 C27A6EE216DEDDF452B9D9321E056730 C8A4588815AABA6DEDC876FBCA06B4D8 CF38E47788C68A47F6B689A750211D60 CF7C46B18733C648EFC5E51D96B561D2 D67C0825A8B7FD496D2B75309A224B65 D6E6053232371882D9CE98FD29881FF7 DF698680E0ACAC53A262DE2F9A38C895 E27D491CFE73849F282FDBB0245325E5 E795B782469DEF7079ED781318CB4B9E E7D7F49ADF8A9D50C80181F8156B7F6D E9B34685FE9E28D3BDEE9A1F9BC51CE2 ED3547DA3B2ECEAFDE751D5373E88343 EE705C74D86BA4F86801A2E4D2E8B83D EF9F52E39C5E375D5250630B1C2C4AC9 EFBCA7F452AD034564040DA2B7758F69 F0CDBE86158BA39A954327D634ECFA82 FA8CD7EAB5D939145BE099E13E1FE499 adobe:docid:photoshop:0629df6d-a412-11da-9dde-c8a00c7693e5 adobe:docid:photoshop:0fc79f20-d232-11db-b1bb-aeba6ac5ef65 adobe:docid:photoshop:112ff759-2eb4-11d8-a7a3-d143df8e175d adobe:docid:photoshop:17f5aa33-b3be-11dc-9058-b94aaeb221d7 adobe:docid:photoshop:42b55d04-ca65-11da-ac60-99df23f712b8 adobe:docid:photoshop:4f6997ab-913d-11dc-a3e7-c094cbb267fd adobe:docid:photoshop:67825bcd-c497-11d9-9b79-b43e3425d820 adobe:docid:photoshop:6cc72dd4-c122-11da-9ea0-b410217bc604 adobe:docid:photoshop:72ee0624-feb0-11df-95f8-fbdf23b3ba38 adobe:docid:photoshop:76c7207c-5eda-11da-8dd2-e400fd2b8985 adobe:docid:photoshop:8d293722-0529-11da-8d9f-87e9dc8d9ac6 adobe:docid:photoshop:97c3b72d-4db2-11d9-9000-c6cf0216aa2e adobe:docid:photoshop:c5063482-0f94-11db-a9d4-b21f0f974623 adobe:docid:photoshop:c6f96f3b-5231-11dd-b295-c1ce63d1952b adobe:docid:photoshop:ee6e49c8-7ce6-11d7-a363-f9d10a5efd56 adobe:docid:photoshop:ef1a6e5e-cbe9-11da-80fe-a32a41494dfa uuid:001538AE6ADFDB11A160D41A8AFEFCAB uuid:0F82B8E1008DDE118063A18DC277C381 uuid:134CED88052EDD11B423D4798897593C uuid:138E6BEB550311DE9C9980EB732A103B uuid:169BE01290ACDC118FF9BE61B5313549 uuid:16BCA70A928BDB119FE2D1D1AD6D4DCE uuid:19501508E2EF11DD8BECCB6B4552BEA7 uuid:1C746F852FB6DD11856A9A95FF697F0E uuid:1EF56AB8E4FEDB11B991B9E549BBAB83 uuid:2008E13DE47DDD119CA6C60CABE7E84D uuid:207F5AB1E3E6DE11AFB6E5ECBD156976 uuid:2290C3CD8FACDC118FF9BE61B5313549 uuid:29F3D697198FDD1184F5AD5C323BD3E2 uuid:2BFAFD88407EDC118371AA574708AABD uuid:2F207EF07CC311DC870CD15D8998FC19 uuid:304189413A6DDD119AFBF80C0D12BBC3 uuid:32C9A1BE013BDF11B28AB1E9B9BBF88A uuid:348C14E2B68DE011B2D0DF71982ECD78 uuid:36483A0B31BA11DEB3BCC14406C17F6A uuid:36483A1131BA11DEB3BCC14406C17F6A uuid:37DD06A87653E1118422D9075FE29A11 uuid:3A8AF8CF577911E0A1AEADCEF7A8C695 uuid:3CB8F15F31B6DD11856A9A95FF697F0E uuid:469594D60783DC11B8A6C730DDF0A3E8 uuid:47D9591E31BA11DEB3BCC14406C17F6A uuid:47F508C2CB3EDE1189BBC659B9EC8880 uuid:49E8A66A3BB5DE11809BA989B0D77432 uuid:4B7C1B8FA601DD11A05B82F82E7564A7 uuid:4DAB2F01082BDC11A590ADEFB8A01727 uuid:4F9AD90BECFEDB11B991B9E549BBAB83 uuid:5344B517DA0CDE11AB76806D8F41191A uuid:54E3BAB15595DE1191E8AA31C2B4DE24 uuid:56D4817031A9DD11B70DB0CF0BC9EDCD uuid:5B25B2A4FC5FDE118C55E1FD1DE5BAC3 uuid:5B636B2FE0B0DE11A587BCC51C1D4B69 uuid:5BAB8930E193DD11ACDF9A606EE463A3 uuid:5DA895C1944CDE119C89B968D8A62C72 uuid:6192C48C2463DC11A938D0D477F76208 uuid:6355C15346DFDC11A214AD89929E38D3 uuid:68B73160563E11E0A57A92CDC08EBFDC uuid:6A51460EFCEFDE11A35CD3D8F4849AB1 uuid:6BD6CAFDC3E7DC118D17CCC8742E2E78 uuid:6D2D16B0565211E0A57A92CDC08EBFDC uuid:7222A0DBD298DC1182C6BEF4D19F3EF2 uuid:75DCEEF5501BDF118174D58534E02F48 uuid:78BDAE073DD4DD119574E49260AE7023 uuid:7F5CD1D0302EDF11A06B87AB6D5393CF uuid:8426B111521BDF118174D58534E02F48 uuid:84BCB3D4733CDD11AB1EBF4A6A17D95E uuid:87DD43522302DC11ACBFC215FBEC85FF uuid:8EF58BA46E66DC1193F48773309C9D8D uuid:905423059AE9DA119E84CAF24BDD6066 uuid:90ADF7D5398A11DF86119436A17CB227 uuid:90C4C16F24ABDD11BC05B48537EE3891 uuid:92108B13A540DE11A29DF00ED4C1B727 uuid:9369042C2F46DE11BD9EE5A6639A625F uuid:95C5C57C521BDF118174D58534E02F48 uuid:976501A145A6DF118EF0F8A0A306590B uuid:997168516F27DE118DD28306BA0AD781 uuid:9C6B168B2263DC11A938D0D477F76208 uuid:9DCFFAE96350DF1198DBAA6ABC516A5B uuid:9DD593BF31BB11DEB3BCC14406C17F6A uuid:9E27DCC8DD70DD11AFB2FB57BC79BEFD uuid:9E393079ED09DC119950AA34618C8687 uuid:9E749DEB31BA11DEB3BCC14406C17F6A uuid:A3CFFAE96350DF1198DBAA6ABC516A5B uuid:A4A0074F8101DC11B2DCD85209BF7530 uuid:A4A6D5B3CF6EDE11B59CDBEDD4FA0491 uuid:A6359C7E140ADC11A2DAA4D78F509131 uuid:A6B8E3575957DD119F3F8760AB0AA4FE uuid:AE02AF60883FDD11AC2BE9025EE1BBF9 uuid:B01BB22766F8DA119EB1D1E45291D5FA uuid:B4EC9A2F511BDF118174D58534E02F48 uuid:B886F63C4E62DE118924E4732F4AFB5E uuid:B8DBE641D274DC11B15CC929E0BBB1F0 uuid:BAA5CD7B8DAFDB11BB67B9E1DC4CE7A2 uuid:BAAF5DE4E21C11DDACC5B29D9085C55A uuid:BC1357D69796DC118AF8AC23B60971C1 uuid:BD5AFE0931BA11DEB3BCC14406C17F6A uuid:C0599F3447CCDC11824DE83F3063EB00 uuid:C8FFC71C31A9DD11B70DB0CF0BC9EDCD uuid:CEEBB5CC348DDC1191489627CE433B2D uuid:CF5479BA31BA11DEB3BCC14406C17F6A uuid:D1DE550983DEDD11B182D5DA082F73C9 uuid:D2EBAF8C9303DC118103AC75D3E1885B uuid:D371356656E1DB11A1EDB8C01A221B6C uuid:D4D29E8CE37DDD119CA6C60CABE7E84D uuid:DC4C48BEE80EDD119117B0EC9223F3FB uuid:E0FEFDA0DE26DF11925DB7C100A3E828 uuid:E51D53285CF7DE11BAA3858EFB8697A5 uuid:E752405CD502DC1183F88C80D133AE02 uuid:E97F51296D0ADE1187DEC54A1F42F690 uuid:ECE2612CF702DC119927C0AD4422C47F uuid:F0D3FF33AE63DD11A1C8DBED5B6F2ED7 uuid:F2652DC558E1DB11A1EDB8C01A221B6C uuid:F331D6A9AE00DC11ACAF98334D040065 uuid:F3F7568A445BDE1184E2C3A479231CEB uuid:F81E9BC9978ADE1196A0EFF950960E15 uuid:FF9AF64D0C39DF11BF8393223FA3F19B xmp.did:00801174072068118083BAFDA65F8430 xmp.did:00EE06B326A4E111AF47D84B5110F70D xmp.did:0180117407206811828A9C07725CD1BC xmp.did:0180117407206811871F9B09294944B5 xmp.did:0180117407206811871FB6D45CC9A53C xmp.did:018011740720681188C6E4708E0E2747 xmp.did:01801174072068118DBBB0B046013550 xmp.did:01801174072068118DBBD7411B5EC877 xmp.did:01801174072068118DBBF67CC7525F38 xmp.did:01801174072068118F6281652F82AFE6 xmp.did:01801174072068118F6283F08ABAE4B0 xmp.did:01801174072068118F6284B29ADFCC43 xmp.did:01801174072068118F628DC2429FD647 xmp.did:01801174072068118F62EB2ADE46D273 xmp.did:01801174072068118F79B7473C32B448 xmp.did:01801174072068118FBC9421557B7B20 xmp.did:01801174072068119109B5666CC87C3E xmp.did:01801174072068119109DDF6FAAF36D2 xmp.did:01801174072068119109F305646EB57D xmp.did:01801174072068119109FA297A7A5904 xmp.did:018011740720681192B08AE26BD827F7 xmp.did:018011740720681192B0B727F2063586 xmp.did:018011740720681192B0BAA904DE0F8D xmp.did:018011740720681192B0EA0610751F7C xmp.did:018011740720681195FE85312F4E4086 xmp.did:018011740720681197A5CD7DCFD54202 xmp.did:018011740720681197A5DAF2583A0A4B xmp.did:018011740720681197A5F9674A0885AD xmp.did:0180117407206811994CB67047760989 xmp.did:0180117407206811994CE07EFE756DA7 xmp.did:0180117407206811A088E49E19740FB2 xmp.did:0180117407206811AB08E8E8EE3F0289 xmp.did:0180117407206811B50CFC9853933782 xmp.did:0180117407206811B6BE96AFFBCEFD7E xmp.did:01BDB8EC4B4011E1B98CEF24291654DE xmp.did:02801174072068118F629EAE88CED33B xmp.did:02801174072068119109B0F0B9959332 xmp.did:02801174072068119109C13AE0D52ACD xmp.did:02801174072068119109C65A70401340 xmp.did:02801174072068119DBFAEEF0353CE0A xmp.did:0280117407206811A818A5FA62C0A48A xmp.did:0280117407206811B44DF79DFC232CD8 xmp.did:03801174072068118A6DE0B43D455FB9 xmp.did:03801174072068118F62DFCEF30AAC90 xmp.did:03801174072068119109F03089D4B9B9 xmp.did:038011740720681197A59FB566CBE17E xmp.did:0380117407206811B8B5B25456C28219 xmp.did:0480117407206811822AB634F36508C2 xmp.did:048011740720681191098D76C49036E9 xmp.did:04C7B018AD8BE0118005E62EBF747214 xmp.did:04EE06B326A4E111AF47D84B5110F70D xmp.did:058011740720681192B0B03D2B78CFDD xmp.did:0580117407206811BCD78B457D78A81D xmp.did:05D444BCFE64DF11A64FA7B28D390DE9 xmp.did:0605C7F9D822681195FEA4354762D610 xmp.did:0680117407206811871FC852CC88A456 xmp.did:068011740720681192B0F8CAB850210B xmp.did:0764F0FC39206811920BD6CB55DF7E21 xmp.did:078011740720681197F3DAD110AB1D7D xmp.did:0880117407206811871FFE11C8ACA7AE xmp.did:08801174072068119457C4C657E622B8 xmp.did:088D6ED2437011E088D29E4C0233231A xmp.did:0980117407206811994CE07EFE756DA7 xmp.did:0980117407206811B1A4F894E8A7A910 xmp.did:09F76F48C3C7DE11925FE106D59B22C8 xmp.did:0A368DA92F39E0119258DF6378E0E372 xmp.did:0A483A276D2068119457B4E8E216C3A8 xmp.did:0A89FF8AE8A8E011A816A106ECD60EAD xmp.did:0C3F353F2167E2118D30DED9691A214B xmp.did:0C483A276D2068119457B4E8E216C3A8 xmp.did:0D18F7379D3EDF119B20E8B33AC24173 xmp.did:1439D15279D511E19671E44CBD77ACF2 xmp.did:149AEF289F20681192B0A9A85A8A7D16 xmp.did:15C2C46649B2E011BC4B89489F74C31C xmp.did:16CE2978BF2BDF11B1C9D5AA7FB5335E xmp.did:174FAB68C1B3E0119D60EAD8B0E55DEB xmp.did:176A42696DCCDF11B4C780F3440113A1 xmp.did:17D4795219206811994C9AA37B1758FD xmp.did:1887D09300216811A056AC0239505D2E xmp.did:1898268C5597E0119487CB48DC3DD8DC xmp.did:194993840129E1118B6683AB8BA184CC xmp.did:194FAB68C1B3E0119D60EAD8B0E55DEB xmp.did:1A0AA41B6576DF11A0EA8D814D891314 xmp.did:1A4FAB68C1B3E0119D60EAD8B0E55DEB xmp.did:1A87D09300216811A056AC0239505D2E xmp.did:1B4FAB68C1B3E0119D60EAD8B0E55DEB xmp.did:1CBB581A2D2268118DBBFC31635E93B6 xmp.did:1D541901DF4BE011B3A2B8E9249F1B48 xmp.did:20BB8F69102168118DBBBB77ECE750CC xmp.did:21E4C91A9F9EE011ACA098E241098547 xmp.did:2325628D6A59E011A4FAF43FA448DE9C xmp.did:2425628D6A59E011A4FAF43FA448DE9C xmp.did:28B3672D7767DF11B32EB6BE29A22260 xmp.did:295BA0A36A76E0119CA1815ECAD13ED2 xmp.did:298B4D5D11206811920BD6CB55DF7E21 xmp.did:2A2118970D2068119109FC901257E622 xmp.did:2A7A21AD11216811994C80DBF724891C xmp.did:2A8DADA9201EE011842A99364FEBD0F6 xmp.did:2ACF258E325DE011A1A5CBD15F1C5D8A xmp.did:2B0FAC131420681188C69B8C88BD3CC1 xmp.did:2D0FAC131420681188C69B8C88BD3CC1 xmp.did:2D49ECD639CEDE11AC1FBF9D231E361F xmp.did:2DF8BDAF08206811A056AC0239505D2E xmp.did:2F0FAC131420681188C69B8C88BD3CC1 xmp.did:310FAC131420681188C69B8C88BD3CC1 xmp.did:31C6EDB7352068119109A05ED6E5C9B4 xmp.did:321F17924B3268118DBBBFECFBC2A23E xmp.did:330FAC131420681188C69B8C88BD3CC1 xmp.did:331A1DE61120681191098946CB8DAAB6 xmp.did:34171119382068118F62CFDF647A2B49 xmp.did:3430CAFA0B2068119109A05ED6E5C9B4 xmp.did:37108FD0D25811E08013A15AD7E5F089 xmp.did:378FF16EB8A8E011A816A106ECD60EAD xmp.did:3804A6C3B853DF119FF2EB1981619B1F xmp.did:38157EBE224FE011B047D7F07BD7BBC0 xmp.did:381BE30EE535DE118F219ECC9DE4732B xmp.did:3892E408BD53E0118E47D5B457BBAED7 xmp.did:399DEF2EF1E9DE1183AEB319878DB4AA xmp.did:3A3CE7F335206811B311EBA70FD71192 xmp.did:3AFBCD36732068119457B4E8E216C3A8 xmp.did:3BDD977B1F2068118F62F4555C5E84BE xmp.did:3C17D9B5007011E0BAA5A546D65C57CC xmp.did:3E3CE7F335206811B311EBA70FD71192 xmp.did:3E51E265833FE011AA6A8DA7AB0A81D0 xmp.did:3FBE3CFB20206811A472E9C34FBDCB1B xmp.did:41178B8188D4DD11BF828F18DEEAE683 xmp.did:42C8435B1F206811A9619D3E69A42F4A xmp.did:42CBEF71662268118F62F8E68BACEB90 xmp.did:42DD52B8322068118F62C099F7DFBA1B xmp.did:44972308022368118A6DC7B27BABA40A xmp.did:44C7E966DEACE01186C0EE0104E410A1 xmp.did:450652A0D25811E084B2FC8CD418D5A2 xmp.did:4618A328212068118DBBA997D43539B9 xmp.did:49BC7A4F35206811B311EBA70FD71192 xmp.did:4A83F1387620681197A5B53B0C75C963 xmp.did:4B5C4472412068118083BAFDA65F8430 xmp.did:4C4949F6B82ADE1195A78A8137920439 xmp.did:4D15C4DBB82BDF11B1C9D5AA7FB5335E xmp.did:4D46A20FF75AE011817EF430ABC94196 xmp.did:4D5C4472412068118083BAFDA65F8430 xmp.did:4E15C4DBB82BDF11B1C9D5AA7FB5335E xmp.did:4E8F42D203D811E190EB8FF8DF0840C7 xmp.did:4F0CFAAE632568118DBBFC31635E93B6 xmp.did:4FDD2F6FA22BDF11B1C9D5AA7FB5335E xmp.did:4FFFE781FC0CDE11A770A9ABB3D9137E xmp.did:501167C17451E0119063CB825D612016 xmp.did:510B91F3AB2068118A6DF9D78C0F9B15 xmp.did:51546FDD1320681192B0BAA904DE0F8D xmp.did:54546FDD1320681192B0BAA904DE0F8D xmp.did:54BF11E22DCBDE11AC1FBF9D231E361F xmp.did:54C6CCC48F7DE0118A8F80BF7355E0D1 xmp.did:55E2C85D50B911E09B45EB5D6BDA9918 xmp.did:56BF11E22DCBDE11AC1FBF9D231E361F xmp.did:583BD1F31720681191098946CB8DAAB6 xmp.did:586276373B20681197A5ABE98A388C5F xmp.did:590D834E29AFE011BB50818B7E198924 xmp.did:593E6CA71120681188C69B8C88BD3CC1 xmp.did:5B3E6CA71120681188C69B8C88BD3CC1 xmp.did:5C20A878E3246811B4F2E4B54918CE3A xmp.did:5C810BCA432068118F62F8D9147DC05A xmp.did:5CE96B67222568118DBBFC31635E93B6 xmp.did:5D3E6CA71120681188C69B8C88BD3CC1 xmp.did:5DEA28BF0A20681191098CDF369CA920 xmp.did:5F8E58AB66AEE011BB50818B7E198924 xmp.did:62D01CE14BF911E0A0A08DC280149321 xmp.did:638880E80920681192B0BAA904DE0F8D xmp.did:648880E80920681192B0BAA904DE0F8D xmp.did:6625348F6D43E011B1B5DB40F0283379 xmp.did:668880E80920681192B0BAA904DE0F8D xmp.did:6735706A402068119457C4C657E622B8 xmp.did:678880E80920681192B0BAA904DE0F8D xmp.did:68C8EE3EEBABE0119875CB404E826AAC xmp.did:6AE4DB37096FDF11BD60EAD4B082D434 xmp.did:6B159B20C5ACE01186C0EE0104E410A1 xmp.did:6E843CF8437011E088D29E4C0233231A xmp.did:7138CE366F61E111A5F0E9A958BBD36C xmp.did:727318241C16E011A6BDE351CD2F170F xmp.did:73C5D4E7ECA7E011ABD49328F4BC62FE xmp.did:753A28DD3120681197F3DAD110AB1D7D xmp.did:7841B3F958A3E1118EE39C2C7AC22163 xmp.did:7B24B5768A72E011938DBEF8D25B6A28 xmp.did:7C3E01E7621EE0119FA7EAA9BF1AC2FE xmp.did:7C702F8623CEDE11AC1FBF9D231E361F xmp.did:7FD93A5FBF57DF11A6E5DB9F6F6C55FC xmp.did:7FFFA217A653DF11872EF9A8EFC0E527 xmp.did:80CE0A53F2FBE011BE70F7A2A05D4BEA xmp.did:81d1c7cd-b12e-44f9-a79b-78a48dfa510b xmp.did:85B2001FDBA8E1119FFCA576B484D989 xmp.did:86754CDB0820681188C6DA43C866EEAE xmp.did:86C08269482068119457C4C657E622B8 xmp.did:86D9306BCF20681188C68D6968983E56 xmp.did:8A101BFFC72068118DBBFC31635E93B6 xmp.did:8A63DD1700CF11E191B7E8D4874E87EA xmp.did:8C808E7F85DDE0119A5BC7203B0F52A5 xmp.did:8CFA6888BDC9E0118A1894B66E94A91C xmp.did:8FC93F7B2EAFE01191C6909159CD1941 xmp.did:90A1EB3B082068118603AD4B49AD7764 xmp.did:9260FA1A3E12DE118089D2AE8FA9A37E xmp.did:92E4E5920A20681194098696425599BA xmp.did:95C2077600CF11E1B332971007A50C02 xmp.did:9666F0B64C2568118DBBFC31635E93B6 xmp.did:96925A4197C2E011B180E288B7389DB2 xmp.did:96E44C36EE4EE01195F4B95F349B38BF xmp.did:97197485D51EDE119E659B86C3686744 xmp.did:973AB16794B1E011AF59B6057C510CF7 xmp.did:984F950EB29DE111B056A6C58D1607AE xmp.did:9B4613316923E111B8D9F5BDE94825E4 xmp.did:9C34F11D8567E1119E03F98C97A3B1AF xmp.did:9C66F0B64C2568118DBBFC31635E93B6 xmp.did:9E1C987F773CE0119951FE9E21D95FD2 xmp.did:A2C2B76E1320681188C69B8C88BD3CC1 xmp.did:A2D86490D952DF11967E8720A676FAF0 xmp.did:A3B6ACD2D133E011B14D815C16B7C2CD xmp.did:A6C2B76E1320681188C69B8C88BD3CC1 xmp.did:A8C2B76E1320681188C69B8C88BD3CC1 xmp.did:AA219AA73F2068119B7BD4F86EBFACF4 xmp.did:AAC2B76E1320681188C69B8C88BD3CC1 xmp.did:AAE0E9190C2068119109B208AFE7A4D2 xmp.did:ACC2B76E1320681188C69B8C88BD3CC1 xmp.did:AD026819AF5BDF118C5AF66058A6DDB5 xmp.did:AD1818B51F206811815ED0470E64A083 xmp.did:AD909E2ABF5FE211BC75A780DCE622FB xmp.did:AE752A91EF8D11E0B59EFA46D6C257DD xmp.did:AE9ABA76FAC8E011A72BDC489F5B89F7 xmp.did:B03244C1C18EE011AB41D8FD6E7F1E9A xmp.did:B0B076C44920681192B0EC05249DD377 xmp.did:B1AA322600CF11E185E891BAF236F5D5 xmp.did:B1DD540D3BCEDE11AC1FBF9D231E361F xmp.did:B28B606385C6E01185BED54A95B1630C xmp.did:B2E7D2623E52DF119BFF8B070109B2C6 xmp.did:B3DD540D3BCEDE11AC1FBF9D231E361F xmp.did:B53BDA96C7206811ABD4B664A86E6DC6 xmp.did:B8440D0B0F206811AE3FD62352FF1D11 xmp.did:B85E369DF0ABE011A0EAA0B446E442FE xmp.did:B928BC2D2E2068118F62A2D886FC3EA7 xmp.did:B9D5D6D3BC38DE11951B998C65B1B618 xmp.did:B9DD4C1C2E2668118DBBFC31635E93B6 xmp.did:BA621BD59254DF119563A63D2350A99D xmp.did:BB3565E81520681192B0BAA904DE0F8D xmp.did:BBAD363C202068118F62F8D9147DC05A xmp.did:BBDD540D3BCEDE11AC1FBF9D231E361F xmp.did:BC5E369DF0ABE011A0EAA0B446E442FE xmp.did:BC87D955B461DF1186C7B47407E46CEC xmp.did:BCCA85B00B2068119109870628CE59B5 xmp.did:BD3F85792F60E01180C2A532D32911CC xmp.did:BEA61E1EE6F0DF118A48A038B5F54722 xmp.did:BF7E93310B2068119109E40C65AF52D5 xmp.did:C028BC2D2E2068118F62A2D886FC3EA7 xmp.did:C0A61E1EE6F0DF118A48A038B5F54722 xmp.did:C23565E81520681192B0BAA904DE0F8D xmp.did:C373CEC0362068118F62D0F7010AC02F xmp.did:C5F5FBA4B262DF11A5908EE048EFD3D2 xmp.did:C67F1174072068119109E40C65AF52D5 xmp.did:C72BB5B253DDDF11A4D5D54ADD1CE786 xmp.did:C95A7CC3AFA9E0119E7DE495A33FFAC7 xmp.did:C97F117407206811994CF132BC83D69A xmp.did:CB5A7CC3AFA9E0119E7DE495A33FFAC7 xmp.did:CBB4D1F9D22368118DBBF2DAAEBE3D62 xmp.did:CC0C567EB42168118F0FBB5DBDD97766 xmp.did:CD5A7CC3AFA9E0119E7DE495A33FFAC7 xmp.did:CF202C7400D011E18D96E08C37B82D61 xmp.did:CFB4D1F9D22368118DBBF2DAAEBE3D62 xmp.did:CFC659F89E20DF118A73D73207D10630 xmp.did:D1C13B2778B7DE11994196785E609050 xmp.did:D366EFA10A20681191098977F35DFB2C xmp.did:D4054EC11920681192B0BAA904DE0F8D xmp.did:D44404ACAED5E011A6FE9FC6A55C05A3 xmp.did:D4F431872BE011E1BD20A05C192A7A05 xmp.did:D883498B272068118DBBF11625A05A5C xmp.did:D8FF4BF0AE71E01192CC8DA08924FABB xmp.did:DABF1920E8E6E1119507C1B6640A63A6 xmp.did:DC5F1D7EB557DF11A6E5DB9F6F6C55FC xmp.did:DC6570B46458DF1191428977A047BDAA xmp.did:E4D11ACAE40FDE118598AD22A001510A xmp.did:E8FE6E6DE62E6811994C8EBF8F51C4A6 xmp.did:EA0D6809B52468119604BD563ECECA8D xmp.did:EA90CCE850216811AE56AF0821E747B2 xmp.did:EAD3D6971220681188C69B8C88BD3CC1 xmp.did:EC47EBE89857DF11A6E5DB9F6F6C55FC xmp.did:ECAA5F395A2368118F62F8E68BACEB90 xmp.did:ECD3D6971220681188C69B8C88BD3CC1 xmp.did:ED7F1174072068119457FF348A38AABA xmp.did:EE693A7E1C2068118DBBB9F63A3FE05F xmp.did:EED3D6971220681188C69B8C88BD3CC1 xmp.did:EEE453CD12206811871FC58FD6F55664 xmp.did:F0CA1CDE8020681192B0A9A85A8A7D16 xmp.did:F0D3D6971220681188C69B8C88BD3CC1 xmp.did:F0EC54C91EF0E011BF318C473C42BF32 xmp.did:F2D3D6971220681188C69B8C88BD3CC1 xmp.did:F37F1174072068118F62DDDDAFF10DFB xmp.did:F5C96B6611206811994C973DAB47318D xmp.did:F5F3271861E8E011A8B1E233584C880C xmp.did:F70C4FE61920681188C6E817E1445A54 xmp.did:F75D918A1120681192B08BEE29C75DD2 xmp.did:F77F1174072068118083EB83C62BD7C1 xmp.did:F77F117407206811871F867F3B44C780 xmp.did:F77F117407206811871FCCB4A2ADB235 xmp.did:F77F11740720681188C6B07CC95C0538 xmp.did:F77F1174072068118C14928747CA1A04 xmp.did:F77F1174072068118DBBBF093A1DAA97 xmp.did:F77F1174072068118DC196984EFEC09F xmp.did:F77F1174072068118F1CFECA782915C6 xmp.did:F77F1174072068118F62EEA207DB2DFF xmp.did:F77F1174072068119109CC85AE74B274 xmp.did:F77F1174072068119109CD214D5A7EFE xmp.did:F77F1174072068119109F8FE27718D5A xmp.did:F77F1174072068119457F53F102BBA12 xmp.did:F77F11740720681194FC8A3235E08E7E xmp.did:F77F11740720681195FEC1F5E62B59CE xmp.did:F77F11740720681195FEE3C51095942E xmp.did:F77F1174072068119B83CEEA27995AC4 xmp.did:F77F1174072068119C12FCC73F11446E xmp.did:F77F117407206811A7BACE4D918669F7 xmp.did:F77F117407206811A9F8A44324AE3979 xmp.did:F77F117407206811AA7CEE1FC8B15BD5 xmp.did:F77F117407206811AE56D6748533125F xmp.did:F87F1174072068118C1499CEFB83A67B xmp.did:F87F1174072068118DBBBF093A1DAA97 xmp.did:F87F117407206811B4E49E03AC4C228B xmp.did:F8B1200EC82068118F62B55C94B5F1CA xmp.did:F8C58836202368119AA4FC7100F2C672 xmp.did:F97F1174072068118083EB83C62BD7C1 xmp.did:F97F1174072068118DBBB19E0C24AE1C xmp.did:F99A94C85A2068119457B4E8E216C3A8 xmp.did:F9BD06E86176E011BBC0D959D25D44FD xmp.did:FA7F117407206811822AC411053758AF xmp.did:FAFBB512432668118DBBFC31635E93B6 xmp.did:FB1A20AB659BE011913BB35C5E38BF39 xmp.did:FB7F1174072068118603AD4B49AD7764 xmp.did:FB7F1174072068118F62B4C0222208FE xmp.did:FB7F11740720681192B0DC8DC9EE0D67 xmp.did:FB9AB60C0BE6DF119976D66446F575DC xmp.did:FBC4D2040A2068119109CC642C44EC0C xmp.did:FBF99FCCEA61DF11B23FC8C2DC80D41E xmp.did:FC7F1174072068118DBBF11625A05A5C xmp.did:FC7F1174072068118F62D51A6DC08DF3 xmp.did:FC9AB60C0BE6DF119976D66446F575DC xmp.did:FD7F117407206811A178B4862A3AC2C7 xmp.did:FD9AB60C0BE6DF119976D66446F575DC xmp.did:FE7F1174072068118083BAFDA65F8430 xmp.did:FE7F1174072068118F62DD804FF26847 xmp.did:FF7F11740720681192B0DCE86BF657A9 3 Generic RGB Profile 1 720000/10000 720000/10000 2 65535 16 16 iU cHRMms{n3'IIDATxڤӽjTQܙ$&3Ub FEA$V`yۊ`-v(B0j$kqLff6{uEQ6ӘF ^c?E.ԱS؎XX$.b{ Wރ2^`v+"x'ncmY` HaYZK_Y$8MPTZ4qQh$8,Ẇ,- >h6+>?D &#߅#$QA(mH 8Rq)WqʺRbN$n1)JYk)]8gk,DG;88nH]HYzll. ncbkxsTIENDB`;G  +š)smartSEO/modules/server_status/config.php ob array( 'version' => '1.0', 'menu' => array( 'order' => 4, 'show_in_menu' => false, 'title' => __('Server Status', 'psp'), 'icon' => '' ), 'in_dashboard' => array( 'icon' => 'assets/32_serverstatus.png', 'url' => admin_url("admin.php?page=psp_server_status") ), 'description' => __('Using the server status module you can check if your install is correct, if you have the right server configuration and you can test the product imports.', 'psp'), 'module_init' => 'init.php', 'help' => array( 'type' => 'remote', 'url' => 'http://docs.aa-team.com/premium-seo-pack/documentation/server-status-2/' ), 'load_in' => array( 'backend' => array( 'admin.php?page=psp_server_status', 'admin-ajax.php' ), 'frontend' => false ), 'javascript' => array( 'admin', 'hashchange', 'tipsy' ), 'css' => array( 'admin' ) ) ) );A0\E ZZ'smartSEO/modules/server_status/init.php obthe_plugin = $psp; $this->module_folder = $this->the_plugin->cfg['paths']['plugin_dir_url'] . 'modules/server_status/'; $this->module = $this->the_plugin->cfg['modules']['server_status']; if (is_admin()) { add_action('admin_menu', array( &$this, 'adminMenu' )); } // load the ajax helper require_once( $this->the_plugin->cfg['paths']['plugin_dir_path'] . 'modules/server_status/ajax.php' ); new pspServerStatusAjax( $this->the_plugin ); } /** * Singleton pattern * * @return pspServerStatus Singleton instance */ static public function getInstance() { if (!self::$_instance) { self::$_instance = new self; } return self::$_instance; } /** * Hooks */ static public function adminMenu() { self::getInstance() ->_registerAdminPages(); } /** * Register plug-in module admin pages and menus */ protected function _registerAdminPages() { add_submenu_page( $this->the_plugin->alias, $this->the_plugin->alias . " " . __('Check System status', $this->the_plugin->localizationName), __('System Status', $this->the_plugin->localizationName), 'manage_options', $this->the_plugin->alias . "_server_status", array($this, 'display_index_page') ); return $this; } public function display_index_page() { $this->printBaseInterface(); } /* * printBaseInterface, method * -------------------------- * * this will add the base DOM code for you options interface */ private function printBaseInterface() { global $wpdb; $plugin_data = get_plugin_data( $this->the_plugin->cfg['paths']['plugin_dir_path'] . 'plugin.php' ); ?>
    make_active('general|server_status')->show_menu(); ?>
    print_section_header( $this->module['server_status']['menu']['title'], $this->module['server_status']['description'], $this->module['server_status']['help']['url'] ); ?>
    the_plugin->localizationName);?>
    the_plugin->plugin_integrity_get_last_status( 'check_database' ); $check_last_msg = ''; if ( '' != trim($opStatus_stat['html']) ) { $check_last_msg = ( $opStatus_stat['status'] == true ? '
    ' : '
    ' ) . $opStatus_stat['html'] . '
    '; } ?>
    the_plugin->localizationName); ?>
    the_plugin->localizationName); ?>:
    the_plugin->localizationName); ?>
    the_plugin->localizationName); ?>:
    the_plugin->localizationName); ?>:
    the_plugin->localizationName); ?>:
    the_plugin->localizationName); ?>:
    the_plugin->localizationName); ?>:
    the_plugin->localizationName); ?>: dbh)) ? mysql_get_server_info( $wpdb->dbh ) : $wpdb->db_version() ); ?>
    the_plugin->localizationName); ?>:
    the_plugin->localizationName); ?>: the_plugin->localizationName); else echo __( 'No', $this->the_plugin->localizationName); ?>
    the_plugin->localizationName); ?>:
    the_plugin->localizationName); ?>: let_to_num( ini_get('post_max_size') ) ); ?>
    the_plugin->localizationName); ?>:
    the_plugin->localizationName); ?>
    the_plugin->localizationName); ?>:
    the_plugin->localizationName); ?>
    the_plugin->localizationName); ?>: the_plugin->localizationName) : __( 'No', $this->the_plugin->localizationName); ?>
    isset($_REQUEST['id']) ? (int)$_REQUEST['id'] : 0 ); $asin = get_post_meta($request['id'], '_amzASIN', true); $sync = new wwcAmazonSyncronize( $this->the_plugin ); $sync->updateTheProduct( $asin, $request['id'] ); } public function let_to_num($size) { if ( function_exists('wc_let_to_num') ) { return wc_let_to_num( $size ); } $l = substr($size, -1); $ret = substr($size, 0, -1); switch( strtoupper( $l ) ) { case 'P' : $ret *= 1024; case 'T' : $ret *= 1024; case 'G' : $ret *= 1024; case 'M' : $ret *= 1024; case 'K' : $ret *= 1024; } return $ret; } public function fb_auth_url( $pms=array() ) { $pms = array_merge(array( 'facebook' => null, 'fb_details' => array(), 'psp_redirect_url' => '', 'text' => __('Authorize app', $this->the_plugin->localizationName), ), $pms); extract($pms); $ret = array( 'html' => '', 'url' => '', ); if ( 'fbv4' == $this->the_plugin->facebook_sdk_version ) { $ret = array_merge( $ret, $this->the_plugin->facebook_get_authorization_url( $pms ) ); } //else { // $ret['url'] = '#facebook-planner/authorize'; // $ret['html'] = '' . $text . ''; //} return $ret; } } } // Initialize the pspServerStatus class //$pspServerStatus = new pspServerStatus(); $pspServerStatus = pspServerStatus::getInstance();x%K /smartSEO/modules/setup_backup/assets/index.html ob69R '2smartSEO/modules/setup_backup/assets/menu_icon.png obPNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-CpiTXtXML:com.adobe.xmp Adobe Photoshop CC (Windows) 2013-11-07T11:20:16+02:00 2013-11-07T14:40:57+02:00 2013-11-07T14:40:57+02:00 image/png xmp.iid:2b1eba4a-3373-ff47-a908-85d56c96e64f xmp.did:2f5e891f-9592-504b-9468-f61145101583 xmp.did:2f5e891f-9592-504b-9468-f61145101583 created xmp.iid:2f5e891f-9592-504b-9468-f61145101583 2013-11-07T11:20:16+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:6c17ff4b-8fe6-644e-86e4-32b95baaf4ec 2013-11-07T12:45:49+02:00 Adobe Photoshop CC (Windows) / saved xmp.iid:1ea1d8e9-fba4-3044-bfc4-51b48b39ebc2 2013-11-07T14:40:57+02:00 Adobe Photoshop CC (Windows) / converted from application/vnd.adobe.photoshop to image/png derived converted from application/vnd.adobe.photoshop to image/png saved xmp.iid:2b1eba4a-3373-ff47-a908-85d56c96e64f 2013-11-07T14:40:57+02:00 Adobe Photoshop CC (Windows) / xmp.iid:1ea1d8e9-fba4-3044-bfc4-51b48b39ebc2 xmp.did:2f5e891f-9592-504b-9468-f61145101583 xmp.did:2f5e891f-9592-504b-9468-f61145101583 404 404 xmp.did:4e55d131-4156-ef47-9231-b3ac27fa2863 xmp.did:57BCD4A3F738E3119802BE982B1502BD 3 sRGB IEC61966-2.1 1 720000/10000 720000/10000 2 1 16 16 j cHRMz%u0`:o_FIDATxڔkq$Y6'E!:B-I(:sa.(!  ՒJ.L.Hqf+v}ַ]>z?J4]k  _PC Te"yױ 9m 4r8,ή-?4y^7"nERQĊ:7 Dp! zoCAjq)_?2sudqڗ~LNŌZ̛ЍKHz+nNClڐlþ&d'x! ϣGgk Xf ױ# {ЇBF~aÑP#DZ><2-& kpy"Wq-~!p-'1T˅ array( 'version' => '1.0', 'menu' => array( 'order' => 31, 'title' => __('Import', 'psp') ,'icon' => '' ), 'in_dashboard' => array( 'icon' => 'assets/menu_icon.png', 'url' => admin_url("admin.php?page=psp#setup_backup") ), 'description' => __("Using this module you can Import settings from other seo plugins!", 'psp'), 'help' => array( 'type' => 'remote', 'url' => 'http://docs.aa-team.com/premium-seo-pack/documentation/setup-backup-2/' ), 'load_in' => array( 'backend' => array( 'admin-ajax.php' ), 'frontend' => false ), 'javascript' => array( 'admin', 'hashchange', 'tipsy' ), 'css' => array( 'admin' ) ) ) );oG +smartSEO/modules/setup_backup/db/index.html ob:G +smartSEO/modules/setup_backup/db/tables.sql obN II(;0smartSEO/modules/setup_backup/default-setup.json ob{ "psp_capabilities_roles": { "administrator": [ "backlink_builder", "capabilities", "dashboard", "facebook_planner", "file_edit", "frontend", "Google_Analytics", "google_pagespeed", "Link_Builder", "Link_Redirect", "local_seo", "misc", "modules_manager", "monitor_404", "on_page_optimization", "remote_support", "rich_snippets", "seo_friendly_images", "serp", "server_status", "setup_backup", "sitemap", "smushit", "Social_Stats", "tiny_compress", "title_meta_format", "W3C_HTMLValidator" ] }, "psp_facebook_planner": { "inputs_available": [ "message", "caption", "image" ], "default_privacy_option": "EVERYONE", "language": "en_US" }, "psp_Link_Builder": { "case_sensitive": "no", "is_comment": "no" }, "psp_local_seo": { "slug": "psplocation", "address_format": "{street} {city}, {state} {zipcode} {country}" }, "psp_misc": { "slug_isactive": "yes", "slug_stop_words": "a, about, above, across, after, afterwards, again, against, all, almost, alone, along, already, also, although, always, am, among, amongst, amoungst, amount, an, and, another, any, anyhow, anyone, anything, anyway, anywhere, are, around, as, at, back, be, became, because, become, becomes, becoming, been, before, beforehand, behind, being, below, beside, besides, between, beyond, bill, both, bottom, but, by, call, can, cannot, cant, co, computer, con, could, couldnt, cry, de, describe, detail, do, done, down, due, during, each, eg, eight, either, eleven, else, elsewhere, empty, enough, etc, even, ever, every, everyone, everything, everywhere, except, few, fifteen, fify, fill, find, fire, first, five, for, former, formerly, forty, found, four, from, front, full, further, get, give, go, had, has, hasnt, have, he, hence, her, here, hereafter, hereby, herein, hereupon, hers, herself, him, himself, his, how, however, hundred, i, ie, if, in, inc, indeed, interest, into, is, it, its, itself, keep, last, latter, latterly, least, less, ltd, made, many, may, me, meanwhile, might, mill, mine, more, moreover, most, mostly, move, much, must, my, myself, name, namely, neither, never, nevertheless, next, nine, no, nobody, none, noone, nor, not, nothing, now, nowhere, of, off, often, on, once, one, only, onto, or, other, others, otherwise, our, ours, ourselves, out, over, own, part, per, perhaps, please, put, rather, re, same, see, seem, seemed, seeming, seems, serious, several, she, should, show, side, since, sincere, six, sixty, so, some, somehow, someone, something, sometime, sometimes, somewhere, still, such, system, take, ten, than, that, the, their, them, themselves, then, thence, there, thereafter, thereby, therefore, therein, thereupon, these, they, thick, thin, third, this, those, though, three, through, throughout, thru, thus, to, together, too, top, toward, towards, twelve, twenty, two, un, under, until, up, upon, us, very, via, was, we, well, were, what, whatever, when, whence, whenever, where, whereafter, whereas, whereby, wherein, whereupon, wherever, whether, which, while, whither, who, whoever, whole, whom, whose, why, will, with, within, without, would, yet, you, your, yours, yourself, yourselves, ", "slug_min_chars": "3", "insert_code_isactive": "yes", "insert_code_head": "", "insert_code_footer": "" }, "psp_module_backlink_builder": false, "psp_module_capabilities": false, "psp_module_facebook_planner": false, "psp_module_file_edit": false, "psp_module_Google_Analytics": false, "psp_module_google_pagespeed": false, "psp_module_Link_Builder": false, "psp_module_Link_Redirect": false, "psp_module_local_seo": false, "psp_module_misc": false, "psp_module_monitor_404": false, "psp_module_on_page_optimization": false, "psp_module_rich_snippets": false, "psp_module_seo_friendly_images": false, "psp_module_serp": false, "psp_module_sitemap": false, "psp_module_smushit": false, "psp_module_Social_Stats": false, "psp_module_tiny_compress": false, "psp_module_title_meta_format": false, "psp_module_W3C_HTMLValidator": false, "psp_module_google_authorship": false, "psp_notifier-cache": "", "psp_notifier-cache-last-updated": "", "psp_on_page_optimization": { "parse_shortcodes": "no" }, "psp_pagespeed": { "google_language": "en", "report_type": "both" }, "psp_plugin_do_activation_redirect": "", "psp_seo_friendly_images": { "image_alt": "{focus_keyword} {title} {nice_image_name}", "image_title": "{image_name} {image_name}", "keep_default_alt": "yes", "keep_default_title": "yes" }, "psp_serp": { "nbreq_max_limit": "100", "top_type": "10", "google_country": "com" }, "psp_sitemap": { "notify_virtual_robots": "yes", "sitemap_type": "sitemap", "post_types": [ "post", "page" ], "include_img": "yes", "priority": { "post": "0.7", "page": "0.5" }, "changefreq": { "post": "daily", "page": "monthly" }, "video_title_prefix": "Video", "video_social_force": "yes" }, "psp_smushit": { "resp_timeout": "60", "do_upload": "no", "same_domain_url": "no" }, "psp_social": { "services": [ "facebook", "pinterest", "twitter", "google", "stumbleupon", "digg", "linkedin" ] }, "psp_tiny_compress": { "resp_timeout": "60", "do_upload": "no", "same_domain_url": "no" }, "psp_title_meta_format": { "home_title": "{site_title} ", "post_title": "{title} | {site_title}", "page_title": "{title} | {site_title}", "category_title": "{title} | {site_title}", "tag_title": "{title} | {site_title}", "archive_title": "{title} Archives | {site_title}", "author_title": "{title} | {site_title}", "search_title": "Search for {search_keyword} | {site_title}", "404_title": "Page Not Found | {site_title}", "pagination_title": "{title} - Page {pagenumber} of {totalpages} | {site_title}", "use_pagination_title": "no", "posttype_title": "{title} | {site_title}", "taxonomy_title": "{title} | {site_title}", "home_desc": "{site_description}", "post_desc": "{short_description} | {site_description}", "page_desc": "{short_description} | {site_description}", "category_desc": "{category_description}", "tag_desc": "{tag_description}", "archive_desc": "", "author_desc": "{author_description}", "pagination_desc": "Page {pagenumber}", "use_pagination_desc": "no", "posttype_desc": "{short_description} | {site_description}", "taxonomy_desc": "{term_description}", "home_kw": "{keywords}", "post_kw": "{keywords}", "page_kw": "{keywords}", "category_kw": "{keywords}", "tag_kw": "{keywords}", "archive_kw": "", "author_kw": "", "pagination_kw": "", "use_pagination_kw": "no", "posttype_kw": "{keywords}", "taxonomy_kw": "{keywords}", "archive_robots": [ "noindex", "nofollow", "noarchive", "noodp" ], "author_robots": [ "noindex", "nofollow", "noarchive", "noodp" ], "search_robots": [ "noindex", "nofollow", "noarchive", "noodp" ], "404_robots": [ "noindex", "nofollow", "noarchive", "noodp" ], "pagination_robots": [ "noindex", "nofollow", "noarchive", "noodp" ], "use_pagination_robots": "no", "social_use_meta": "yes", "social_include_extra": "yes", "social_validation_type": "opengraph", "social_fb_app_id": "966242223397117", "social_home_type": "website", "social_opengraph_default": { "post": "article", "page": "article" }, "social_opengraph_default_taxonomy": { "category": "object", "post_tag": "object" }, "psp_twc_use_meta": "yes", "psp_twc_thumb_sizes": "none", "psp_twc_thumb_crop": "no", "psp_twc_cardstype_default": { "post": "summary", "page": "summary" }, "psp_twc_apptype_default": { "post": "no", "page": "no" }, "psp_twc_image_find": "featured", "psp_twc_cardstype_default_taxonomy": { "category": "summary", "post_tag": "summary" }, "psp_twc_apptype_default_taxonomy": { "category": "no", "post_tag": "no" }, "psp_twc_image_find_taxonomy": "customfield", "psp_twc_site_app": "no", "psp_twc_home_app": "no", "psp_twc_home_type": "summary" } }R<&K &&-smartSEO/modules/setup_backup/default-sql.php obwp_filesystem = $wp_filesystem; // paths $this->paths = array( // http://codex.wordpress.org/Function_Reference/plugin_dir_url 'plugin_dir_url' => str_replace('modules/setup_backup/', '', plugin_dir_url( (__FILE__) )), // http://codex.wordpress.org/Function_Reference/plugin_dir_path 'plugin_dir_path' => str_replace('modules/setup_backup/', '', plugin_dir_path( (__FILE__) )) ); if ( ! is_null($psp) ) { $this->the_plugin = $psp; $this->module_folder = $this->the_plugin->cfg['paths']['plugin_dir_url'] . 'modules/setup_backup/'; $this->module_folderPath = $this->the_plugin->cfg['paths']['plugin_dir_path'] . 'modules/setup_backup/'; $this->settings = $this->the_plugin->getAllSettings( 'array', 'setup_backup' ); } else { $this->module_folder = $this->paths['plugin_dir_url'] . 'modules/setup_backup/'; $this->module_folderPath = $this->paths['plugin_dir_path'] . 'modules/setup_backup/'; } @ini_set('memory_limit', '512M'); @set_time_limit ( 0 ); $filename_tables = $this->module_folderPath . 'db/tables.sql'; $this->install_tables( $filename_tables ); $filename_tables_data = $this->module_folderPath . 'db/tables_data.sql'; $this->install_tables_data( $filename_tables_data ); } public function install_tables( $filename ) { if ( $this->verifyFileExists( $filename ) ) { //verify file existance! global $wpdb; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); $wpdb->show_errors(); //$sql = file_get_contents( $filename ); $wp_filesystem = $this->wp_filesystem; $has_wrote = $wp_filesystem->get_contents( $filename ); if ( !$has_wrote ) { $has_wrote = file_get_contents($filename); } $sql = $has_wrote; if ( $sql === false ) return false; $sql = str_replace('{wp_prefix}', $wpdb->prefix, $sql); $sql = $this->find_table_text( $sql ); if ( is_array($sql) && count($sql)>0 ) foreach ( $sql as $key => $val ) dbDelta( $val ); } return false; //return error! } public function install_tables_data( $filename ) { if ( $this->verifyFileExists( $filename ) ) { //verify file existance! global $wpdb; $file_handle = fopen( $filename, "rb" ); if ( $file_handle === false ) return false; while ( !feof( $file_handle ) ) { $sql = fgetss( $file_handle ); if ( $sql === false || empty( $sql ) || trim( $sql ) == '' ) continue 1; $sql = str_replace('{wp_prefix}', $wpdb->prefix, $sql); $wpdb->query( $sql ); } fclose( $file_handle ); } return false; //return error! } private function find_table_text( $str='' ) { $start = 'CREATE TABLE'; $end = ';'; $pattern = sprintf( '/(%s.+?%s)/ims', preg_quote($start, '/'), preg_quote($end, '/') ); if ( preg_match_all($pattern, $str, $matches, PREG_PATTERN_ORDER) ) { return $matches[1]; } return array(); } /** * Utils */ // verify if file exists! public function verifyFileExists($file, $type='file') { clearstatcache(); if ($type=='file') { if (!file_exists($file) || !is_file($file) || !is_readable($file)) { return false; } return true; } else if ($type=='folder') { if (!is_dir($file) || !is_readable($file)) { return false; } return true; } // invalid type return 0; } /** * Singleton pattern * * @return pspSEOImages Singleton instance */ static public function getInstance() { if (!self::$_instance) { self::$_instance = new self; } return self::$_instance; } } } // Initialize the pspSetupBackup class $pspSetupBackup = pspSetupBackup::getInstance();VD (smartSEO/modules/setup_backup/index.html obeSE 'smartSEO/modules/setup_backup/lists.php obcfg, $module); // print the lists interface echo $aaModulesManger->printListInterface(); }1(G  Ը)smartSEO/modules/setup_backup/options.php ob array( 'import_seo_other_plugins' => array( 'title' => __('Import settings from other SEO plugins for posts, pages, custom post types', 'psp'), 'icon' => '{plugin_folder_uri}assets/menu_icon.png', 'size' => 'grid_4', // grid_1|grid_2|grid_3|grid_4 'header' => false, // true|false 'toggler' => false, // true|false 'buttons' => array( 'install_btn' => array( 'type' => 'submit', 'value' => __('Import SEO', 'psp'), 'color' => 'success', 'action' => 'psp-ImportSEO', ) ), // true|false|array 'style' => 'panel', // panel|panel-widget // create the box elements array 'elements' => array( 'from' => array( 'type' => 'select', 'std' => 'yoast', 'size' => 'normal', 'force_width' => '190', 'title' => __('Import from:', 'psp'), 'desc' => __('Select the plugin from which you want to import SEO settings for posts, pages, custom post types.', 'psp'), 'options' => array( 'Yoast WordPress SEO' => 'Yoast WordPress SEO', 'SEO Ultimate' => 'SEO Ultimate', 'All-in-One SEO Pack - old version' => 'All-in-One SEO Pack - old version', 'All-in-One SEO Pack' => 'All-in-One SEO Pack', 'WooThemes SEO Framework' => 'WooThemes SEO Framework' ) ) ) ) ) ) ); .J2P 00smartSEO/modules/title_meta_format/assets/32.png obPNG  IHDR szz pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-:iTXtXML:com.adobe.xmp Adobe Photoshop CC (Windows) 2013-11-07T12:45:13+02:00 2013-11-07T12:45:13+02:00 2013-11-07T12:45:13+02:00 xmp.iid:9019c801-3b7a-c64f-8e40-2eccb3519b91 xmp.did:577a979e-5b30-ea43-9886-99f880124adc xmp.did:577a979e-5b30-ea43-9886-99f880124adc created xmp.iid:577a979e-5b30-ea43-9886-99f880124adc 2013-11-07T12:45:13+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:9019c801-3b7a-c64f-8e40-2eccb3519b91 2013-11-07T12:45:13+02:00 Adobe Photoshop CC (Windows) / xmp.did:57BCD4A3F738E3119802BE982B1502BD 3 sRGB IEC61966-2.1 image/png 1 720000/10000 720000/10000 2 1 32 32 5p cHRMz%u0`:o_FIDATxڤklTE3]h+X%F $ Vb bk$+"Qd E]0J5DH|O@ja(۵  .Yϧ;sΜs#0/P`wZ ApN"@,j\L 2[NQ@ߐ/x]/4Z=CYC2 H`?>,r 4R(~r? nq:rt64M)qZCҨD­i }eI'D- nlQNO$|:Ă$pS=^D!kU{,˲uoz}b`9PpTc2 Eހ` p`fF^oU7r=CX1Do&'epE:ze7RAd@%zp3,pł"a[ԋJ=@ .``Q x 0߻cž d $S֖!Ĝ&H4{0S ^r 3jdObRrTޗ04+%hV-dIyA5?6/[~b)0xf|qMi t3Em«ҀY O$u҉6: 0#Fv! Y!kwkKiK-褝\uX],pk]lr" ֨&g`B͖z"䩧mM.`;pAVs=$1Bп=]yj(3 wKcl((`)07CD|סR[M_޸V=U{:)}@} _g{0P vxd !SqaDWUDn4h  %&9UFld!z'R\Ren0^ H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-@iTXtXML:com.adobe.xmp Adobe Photoshop CC (Windows) 2013-11-07T11:20:16+02:00 2013-11-07T12:45:47+02:00 2013-11-07T12:45:47+02:00 image/png xmp.iid:ebc3887e-04af-af43-9660-755d20fd0d2f xmp.did:2f5e891f-9592-504b-9468-f61145101583 xmp.did:2f5e891f-9592-504b-9468-f61145101583 created xmp.iid:2f5e891f-9592-504b-9468-f61145101583 2013-11-07T11:20:16+02:00 Adobe Photoshop CC (Windows) saved xmp.iid:e6d4f121-9e24-bd40-a76c-146a4776aeff 2013-11-07T12:45:47+02:00 Adobe Photoshop CC (Windows) / converted from application/vnd.adobe.photoshop to image/png derived converted from application/vnd.adobe.photoshop to image/png saved xmp.iid:ebc3887e-04af-af43-9660-755d20fd0d2f 2013-11-07T12:45:47+02:00 Adobe Photoshop CC (Windows) / xmp.iid:e6d4f121-9e24-bd40-a76c-146a4776aeff xmp.did:2f5e891f-9592-504b-9468-f61145101583 xmp.did:2f5e891f-9592-504b-9468-f61145101583 xmp.did:4e55d131-4156-ef47-9231-b3ac27fa2863 xmp.did:57BCD4A3F738E3119802BE982B1502BD 3 sRGB IEC61966-2.1 1 720000/10000 720000/10000 2 1 16 16 f cHRMz%u0`:o_FIDATxl]Hah(lV>-0*"(/f8a_ #(* ˖dAS\f6{>%YSKX 6A@"w{RxLtքn5D83#2Ct*yKV":*s<%lBàoǶ8&5;<>4OTk9Q2["K@9dR bd)sXURAhr"GҵX>>^<%D4=6[(Pnexi,BFꓝz9Rar!Q2q 5tyL.iZGi`plZlx,L4{M>@dC%bO^nӞ*m\ 䛋hё\JģS%pm)`;Ud1 aI9+]ݗ^N%IENDB`lK  ֺπ-smartSEO/modules/title_meta_format/config.php ob array( 'version' => '1.0', 'menu' => array( 'order' => 10, 'title' => __('Title & Meta Format', 'psp') ,'icon' => '' ), 'in_dashboard' => array( 'icon' => 'assets/32.png', 'url' => admin_url("admin.php?page=psp#title_meta_format") ), 'description' => __("Using this module you can set custom page titles, meta descriptions, meta keywords, meta robots and social meta using defined format tags for Homepage, Posts, Pages, Categories, Tags, Custom Taxonomies, Archives, Authors, Search, 404 Pages and Pagination.", 'psp'), 'module_init' => 'init.php', 'help' => array( 'type' => 'remote', 'url' => 'http://docs.aa-team.com/premium-seo-pack/documentation/title-meta-format/' ), 'load_in' => array( 'backend' => array( 'admin-ajax.php' ), 'frontend' => true ), 'javascript' => array( 'admin', 'hashchange', 'tipsy', 'ajaxupload' ), 'css' => array( 'admin' ) ) ) );HFNI -smartSEO/modules/title_meta_format/index.html ob\q6K R+smartSEO/modules/title_meta_format/init.php obthe_plugin = $psp; $this->module_folder = $this->the_plugin->cfg['paths']['plugin_dir_url'] . 'modules/title_meta_format/'; $this->module_folder_path = $this->the_plugin->cfg['paths']['plugin_dir_path'] . 'modules/title_meta_format/'; $this->module = $this->the_plugin->cfg['modules']['title_meta_format']; $this->plugin_settings = $this->the_plugin->get_theoption( $this->the_plugin->alias . '_title_meta_format' ); if ( empty($this->plugin_settings) ) { $this->plugin_defsettings = $this->load_module_options(); } // buddy press utils if ( $this->the_plugin->is_buddypress() ) { require_once( 'buddypress.init.php' ); $this->buddypress = new pspBuddyPressTags( $this->the_plugin ); } // add extra pagetypes add_filter('premiumseo_seo_list_pagetypes', array($this, 'add_extra_list_pagetypes'), 10, 1); add_filter('premiumseo_seo_pagetype', array($this, 'get_extra_pagetype'), 10, 1); foreach ( $this->the_plugin->get_wp_list_pagetypes() as $k=>$v ) { //page types foreach ( array('_title', '_desc', '_kw', '_robots') as $kk=>$vv ) { //meta tags $alias = $v.$vv; if ( isset($this->plugin_settings[ $alias ]) ) { $this->pageTypes[ $alias ] = $this->plugin_settings[ $alias ]; } else if ( isset($this->plugin_defsettings[ $alias ], $this->plugin_defsettings[ $alias ]['std']) ) { $this->pageTypes[ $alias ] = $this->plugin_defsettings[ $alias ]['std']; } } } //var_dump('
    ', $this->pageTypes, '
    '); echo __FILE__ . ":" . __LINE__;die . PHP_EOL; //if ( !$this->the_plugin->verify_module_status( 'title_meta_format' ) ) ; //module is inactive //else { if ( $this->the_plugin->is_admin !== true ) $this->init(); //} } public function load_module_options() { $def = isset($this->the_plugin->title_meta_format_default) ? $this->the_plugin->title_meta_format_default : array(); if ( ! empty($def) ) { return $def; } $options = array(); // find if we have a options.php into the same folder $options_file = $this->module_folder_path . 'options.php'; clearstatcache(); if ( file_exists($options_file) && is_file($options_file) && is_readable($options_file) ) { $tryed_module = $this->the_plugin->cfg['modules']['title_meta_format']; ob_start(); require_once $options_file; $content = ob_get_contents(); ob_clean(); if( trim($content) != "" ){ $options = json_decode( $content, true ); } $options = isset($options['psp_title_meta_format'], $options['psp_title_meta_format']['title_meta_format'], $options['psp_title_meta_format']['title_meta_format']['elements']) ? $options['psp_title_meta_format']['title_meta_format']['elements'] : array(); } //var_dump('
    ', $options, '
    '); echo __FILE__ . ":" . __LINE__;die . PHP_EOL; $this->the_plugin->title_meta_format_default = $options; return $options; } public function add_extra_list_pagetypes( $pagetypes ) { $new = array(); //array('product'); $pagetypes = array_merge( $pagetypes, $new ); $pagetypes = array_unique( $pagetypes ); return $pagetypes; } public function get_extra_pagetype( $pagetype ) { //if ( $pagetype == 'post' && function_exists('is_woocommerce') && function_exists('is_product') ) { // if ( is_woocommerce() && is_product() ) { // $pagetype = 'product'; // } //} return $pagetype; } public function setPostInfo( $post ) { $this->post = $post; } public function verifyPostInfo() { if ( isset($this->post) && !is_null($this->post) && is_object($this->post) ) return true; return false; } /** * Head Filters & Init! * */ public function init() { // premiumseo_head action hook is used to group all of the generated tags made by this plugin! // @called in the frontend module add_action( 'premiumseo_head', array( &$this, 'the_meta_robots' ), 5 ); add_action( 'premiumseo_head', array( &$this, 'the_meta_description' ), 10 ); add_action( 'premiumseo_head', array( &$this, 'the_meta_keywords' ), 11 ); add_action( 'premiumseo_head', array( &$this, 'the_canonical' ), 19 ); //if ( self::$titleForce ) { $titleForce = !isset($this->plugin_settings['force_title']) || ( isset($this->plugin_settings['force_title']) && $this->plugin_settings['force_title'] == 'yes' ) ? true : false; //$titleForce = self::$titleForce; //DEBUG if ( $titleForce ) { add_action('template_redirect', array(&$this, 'head_before'), 0); add_action('wp_head', array(&$this, 'head_after'), 9999); } else { add_filter( 'wp_title', array( $this, 'the_title' ), 14 ); } } /** * Force title rewrite * */ public function do_title_rewrite() { return ( !is_admin() && !is_feed() ); } public function head_before() { if ( $this->do_title_rewrite() ) { ob_start( array($this, 'head_title_tag') ); } } public function head_after() { if ($this->do_title_rewrite()) { $handlers = ob_list_handlers(); if ( count($handlers) > 0 && strcasecmp($handlers[ count($handlers) - 1 ], 'pspTitleMetaFormat::head_title_tag') == 0 ) { ob_end_flush(); } else ; // "ob_list_handlers list found:\n" . print_r($handlers, true) } } public function head_title_tag($head) { $title = $this->the_title(''); if ( !$title ) return $head; // replace old title with the new title //return eregi_replace('[^<]*', ''.$title.'', $head); return preg_replace( '//i', ''.$title.'', $head ); //return preg_replace('/([^<]*)<\/title>/i', '<title>'.$title.'', $head); } /** * page URL (also use canonical if it's the case) */ public function the_url() { global $wp_query, $post; //$post = $wp_query->get_queried_object(); if (isset($post->ID) && !is_null($post->ID) && $post->ID>0) $__post = $post; else $__post = $wp_query->get_queried_object(); //get the post! $url = ''; if ( is_singular() || $this->the_plugin->_is_blog_posts_page() || $this->the_plugin->is_shop() ) { //post|page|post_type $canonical = $this->the_canonical( false ); if ( isset($canonical) && !empty($canonical) ) $url = $canonical; if ( empty($url) ) $url = get_permalink( $__post->ID ); } else if ( is_home() || is_front_page() ) { //homepage $url = home_url( '/' ); } else if ( is_category() || is_tag() || is_tax() ) { $canonical = $this->the_canonical( false ); if ( isset($canonical) && !empty($canonical) ) $url = $canonical; if ( empty($url) ) $url = get_term_link( $__post, $__post->taxonomy ); } elseif ( is_post_type_archive() ) { $post_type = get_query_var( 'post_type' ); if ( is_array($post_type) ) { $post_type = reset($post_type); //get first element } $url = get_post_type_archive_link( $post_type ); } elseif ( is_author() ) { $url = get_author_posts_url( $__post->ID, $__post->user_nicename ); } elseif ( is_archive() ) { if ( is_date() ) { if ( is_day() ) { $url = get_day_link( get_query_var( 'year' ), get_query_var( 'monthnum' ), get_query_var( 'day' ) ); } elseif ( is_month() ) { $url = get_month_link( get_query_var( 'year' ), get_query_var( 'monthnum' ) ); } elseif ( is_year() ) { $url = get_year_link( get_query_var( 'year' ) ); } } } else { //treat here cases for other page types! //if ( is_search() ) { //} } $url = apply_filters( 'premiumseo_seo_url', $url ); return $url; } /** * canonical URL */ public function the_canonical( $print=true ) { $canonical = $this->the_pagetype('canonical', 'format_canonical'); $canonical = apply_filters( 'premiumseo_seo_canonical', $canonical ); $canonical = esc_url( $canonical ); if ( $print===false ) return $canonical; if ( !empty($canonical) ) echo '' . PHP_EOL; } protected function format_canonical() { global $wp_query, $post; //$post = $wp_query->get_queried_object(); if (isset($post->ID) && !is_null($post->ID) && $post->ID>0) $__post = $post; else $__post = $wp_query->get_queried_object(); //get the post! $__postType = $this->getPostType(); if ( !empty($__postType) ) $__post = $this->post; $canonical = ''; if ( is_singular() || $this->the_plugin->_is_blog_posts_page() || $this->the_plugin->is_shop() || $__postType == 'post' ) { $__theMeta = $this->the_plugin->get_psp_meta( $__post->ID ); } else if ( is_category() || is_tag() || is_tax() || $__postType == 'term' ) { $__objTax = (object) array('term_id' => $__post->term_id, 'taxonomy' => $__post->taxonomy); $psp_current_taxseo = $this->the_plugin->__tax_get_post_meta( null, $__objTax ); if ( is_null($psp_current_taxseo) || !is_array($psp_current_taxseo) ) $psp_current_taxseo = array(); $__theMeta = $this->the_plugin->get_psp_meta( $__objTax, $psp_current_taxseo ); } if ( is_singular() || $this->the_plugin->_is_blog_posts_page() || $this->the_plugin->is_shop() || is_category() || is_tag() || is_tax() || !empty($__postType) ) { if ( isset($__theMeta['canonical']) ) { $canonical = $__theMeta['canonical']; if ( !empty($canonical) ) $canonical = htmlspecialchars( $canonical ); } } return $canonical; } /** * meta robots tags! */ public function the_meta_robots( $print=true ) { $meta_robots = $this->the_pagetype('robots', 'format_robots_tags'); $m = $meta_robots; $mi = isset($m['item']) ? (array) $m['item'] : array(); $mt = isset($m['generaltag']) ? (array) $m['generaltag'] : array(); $__meta_robots = array(); // force to use the WP settings if ( '0' == get_option( 'blog_public' ) || isset($_GET['replytocom']) ) $__meta_robots[] = 'noindex'; else if ( in_array('index', $mi) ) $__meta_robots[] = 'index'; else if ( in_array('noindex', $mi) ) $__meta_robots[] = 'noindex'; else if ( in_array('index', $mt) ) $__meta_robots[] = 'index'; else if ( in_array('noindex', $mt) ) $__meta_robots[] = 'noindex'; else $__meta_robots[] = 'index'; if ( in_array('follow', $mi) ) $__meta_robots[] = 'follow'; else if ( in_array('nofollow', $mi) ) $__meta_robots[] = 'nofollow'; else if ( in_array('follow', $mt) ) $__meta_robots[] = 'follow'; else if ( in_array('nofollow', $mt) ) $__meta_robots[] = 'nofollow'; else $__meta_robots[] = 'follow'; $__meta_robots_extra = array(); if ( in_array('noarchive', $mt) ) $__meta_robots_extra[] = 'noarchive'; if ( in_array('noodp', $mt) ) $__meta_robots_extra[] = 'noodp'; $__meta_robots_extra = implode(',', $__meta_robots_extra); $__meta_robots = implode(',', $__meta_robots); if ( ($found = preg_match('/^index,follow/i', $__meta_robots))!==false && $found>0 ) $__meta_robots = ''; $__meta_robots = $__meta_robots . ( $__meta_robots!='' && $__meta_robots_extra!='' ? ',' : '') . $__meta_robots_extra; $__meta_robots = apply_filters( 'premiumseo_seo_robots', $__meta_robots ); $__meta_robots = esc_attr( $__meta_robots ); if ( $print===false ) return $__meta_robots; if ( !empty( $__meta_robots ) ) echo '' . PHP_EOL; } protected function format_robots_tags($field, $type) { $__field = 'robots'; $__robots = array( 'item' => array(), 'generaltag' => array() ); //current field value! $__currentValue = $this->get_current_field( 'all' ); $__cv = $__currentValue; //current page values: robots index, follow if ( !is_null($__cv) ) { if ( isset($__cv['robots_index']) && !empty($__cv['robots_index']) && $__cv['robots_index']!='' ) $__robots['item'][] = $__cv['robots_index']; if ( isset($__cv['robots_follow']) && !empty($__cv['robots_follow']) && $__cv['robots_follow']!='' ) $__robots['item'][] = $__cv['robots_follow']; } //pagination is active in plugin & current page has pagination $__use_pag = isset($this->plugin_settings[ 'use_pagination_'.$field ]) ? $this->plugin_settings[ 'use_pagination_'.$field ] : 'no'; $__pag = isset($this->plugin_settings[ 'pagination_'.$field ]) ? $this->plugin_settings[ 'pagination_'.$field ] : ''; if ( isset($__use_pag) && $__use_pag=='yes' && isset($__pag) && !empty($__pag) && $this->is_pagination() ) { $__currentValue = $__pag; $__robots['generaltag'] = $__currentValue; } else { //current page type! $this->set_pagetypes(); $__templateValue = $this->get_template_field( $type, $field ); if ( false !== $__templateValue ) { $__currentValue = $__templateValue; $__robots['generaltag'] = $__currentValue; } } return $__robots; } /** * title, meta description, meta keywords! */ public function the_title($title) { $title = $this->the_pagetype('title'); $title = apply_filters( 'premiumseo_seo_title', $title ); $title = esc_html( strip_tags( stripslashes( $title ) ) ); return $title; } public function the_meta_description( $print=true ) { $meta_desc = $this->the_pagetype('desc'); $meta_desc = trim( $meta_desc ); $meta_desc = apply_filters( 'premiumseo_seo_meta_description', $meta_desc ); $meta_desc = esc_attr( strip_tags( stripslashes( $meta_desc ) ) ); if ( $print===false ) return $meta_desc; if ( !empty( $meta_desc ) ) echo '' . PHP_EOL; } public function the_meta_keywords( $print=true ) { $meta_keywords = $this->the_pagetype('kw'); $meta_keywords = trim( $meta_keywords ); $meta_keywords = apply_filters( 'premiumseo_seo_meta_keywords', $meta_keywords ); $meta_keywords = esc_attr( strip_tags( stripslashes( $meta_keywords ) ) ); if ( $print===false ) return $meta_keywords; if ( !empty( $meta_keywords ) ) echo '' . PHP_EOL; } protected function the_format($field, $type) { switch ($field) { case 'title': $__field = 'title'; break; case 'desc': $__field = 'description'; break; case 'kw': $__field = 'keywords'; break; default: $__field = 'title'; break; } //current field value! $__currentValue = $this->get_current_field( $__field ); if ( !is_null($__currentValue) && !empty($__currentValue) && $__currentValue!='' ) { $on_page_optimization = $this->the_plugin->get_theoption( $this->the_plugin->alias . '_on_page_optimization' ); $meta_title_sufix = isset($on_page_optimization['meta_title_sufix']) ? $on_page_optimization['meta_title_sufix'] : ''; if ( $field == 'title' && $type != 'home' && !empty($meta_title_sufix) ) $__currentValue .= ' ' . $meta_title_sufix; return $__currentValue; } //pagination is active in plugin & current page has pagination $__use_pag = isset($this->plugin_settings[ 'use_pagination_'.$field ]) ? $this->plugin_settings[ 'use_pagination_'.$field ] : 'no'; $__pag = isset($this->plugin_settings[ 'pagination_'.$field ]) ? $this->plugin_settings[ 'pagination_'.$field ] : ''; if ( isset($__use_pag) && $__use_pag=='yes' && isset($__pag) && trim($__pag)!='' && $this->is_pagination() ) { $__currentValue = $__pag; } else { //current page type! $this->set_pagetypes(); $__templateValue = $this->get_template_field( $type, $field ); if ( false !== $__templateValue ) { $__currentValue = $__templateValue; } } if ( empty($__currentValue) ) return ''; //format the page title! $__return = $this->make_format(array(), $type, $__currentValue); //var_dump('
    ', $__return , '
    '); return $__return; } protected function get_template_field( $type, $field='title' ) { $__currentValue = false; if ( isset($this->pageTypes[ $type . '_' . $field ]) ) { $__currentValue = $this->pageTypes[ $type . '_' . $field ]; } // start compatibility with old version : posttype => post else if ( ( 'posttype' == $type ) && isset($this->pageTypes[ 'post_' . $field ]) ) { $__currentValue = $this->pageTypes[ 'post_' . $field ]; } // end compatibility with old version : posttype => post // NOT ( custom post type or custom taxonomy ) if ( ! in_array($type, array('posttype', 'taxonomy')) ) { return $__currentValue; } // custom post type or custom taxonomy $__post = null; global $wp_query, $post; if (is_object($post) && isset($post->ID) && !is_null($post->ID) && $post->ID>0) $__post = $post; if (is_object($wp_query)) $__post = $wp_query->get_queried_object(); //get the post! //var_dump('
    ', $__post, '
    '); echo __FILE__ . ":" . __LINE__;die . PHP_EOL; $post_type = ''; if (is_object($__post) && isset($__post->post_type) && $__post->post_type != '') { $post_type = (string) $__post->post_type; } if (is_object($__post) && isset($__post->term_id) && isset($__post->taxonomy)) { $post_type = (string) $__post->taxonomy; } //var_dump('
    ',$post_type,$__post,'
    '); $uniqueKey = "{$type}_custom"; $o = $this->plugin_settings; if ( ! empty($post_type) && isset($o["$uniqueKey"], $o["$uniqueKey"]["$field"], $o["$uniqueKey"]["$field"]["$post_type"]) ) { $o["$uniqueKey"]["$field"]["$post_type"] = $o["$uniqueKey"]["$field"]["$post_type"]; if ( ! empty($o["$uniqueKey"]["$field"]["$post_type"]) ) { $__currentValue = $o["$uniqueKey"]["$field"]["$post_type"]; } } return $__currentValue; } protected function get_current_field( $field='title' ) { global $wp_query, $post; //$post = $wp_query->get_queried_object(); if (isset($post->ID) && !is_null($post->ID) && $post->ID>0) $__post = $post; else $__post = $wp_query->get_queried_object(); //get the post! //if ( ($section = $this->the_plugin->is_buddypress_section()) && !empty($section) ) { // if ( isset($section['action']) && !empty($section['action']) ) // global $post; // else // $post = $wp_query->get_queried_object(); //} else // $post = $wp_query->get_queried_object(); $__postType = $this->getPostType(); if ( !empty($__postType) ) $__post = $this->post; $value = ''; $__theMeta = array(); if ( is_singular() || $this->the_plugin->_is_blog_posts_page() || $this->the_plugin->is_shop() || $__postType == 'post' ) { $post_id = (int) $__post->ID; if ( $post_id > 0 ) $__theMeta = $this->the_plugin->get_psp_meta( $__post->ID ); } else if ( is_category() || is_tag() || is_tax() || $__postType == 'term' ) { $__objTax = (object) array('term_id' => $__post->term_id, 'taxonomy' => $__post->taxonomy); $psp_current_taxseo = $this->the_plugin->__tax_get_post_meta( null, $__objTax ); if ( is_null($psp_current_taxseo) || !is_array($psp_current_taxseo) ) $psp_current_taxseo = array(); $__theMeta = $this->the_plugin->get_psp_meta( $__objTax, $psp_current_taxseo ); } if ( is_singular() || $this->the_plugin->_is_blog_posts_page() || $this->the_plugin->is_shop() || is_category() || is_tag() || is_tax() || !empty($__postType) ) { if ( $field=='all' ) $value = $__theMeta; else { $value = ''; if ( isset($__theMeta[ "$field" ]) ) { $value = $__theMeta[ "$field" ]; if ( $field=='keywords' && empty($value) ) { //special case: keywords & focus keyword if ( isset($__theMeta[ 'focus_keyword' ]) && !empty($__theMeta[ 'focus_keyword' ]) ) $value = $__theMeta[ 'focus_keyword' ]; } if ( !empty($value) ) $value = htmlspecialchars( $value ); } } } return $value; } /** * current page type * */ public function the_pagetype($field='title', $format_func='the_format') { $page_type = $this->the_plugin->get_wp_pagetype(); if ( in_array($page_type, array('admin', 'feed')) ) return ''; return call_user_func( array( $this, $format_func ), $field, $page_type ); } /** * replace shortcodes with values! * */ public function make_format($__replace_orig=array(), $type='home', $theContent='') { global $wp_query; if ( empty($theContent) ) return ''; $__return = $theContent; $__post = null; $__author = null; //$type = $type == 'product' ? 'post' : $type; $__page = 'home'; //default page! $__defaults = array( //default params! 'site_title' => get_bloginfo('name'), //website name 'site_description' => get_bloginfo('description'), //website description 'current_date' => date( get_option('date_format') ), //current date 'current_time' => date( get_option('time_format') ), //current time 'current_day' => date( 'j' ), //current day 'current_year' => date( 'Y' ), //current year 'current_month' => __( date( 'F' ), 'psp' ), //current month 'current_week_day' => __( date( 'l' ), 'psp' ), //current week day 'id' => '', 'title' => '', 'date' => '', 'description' => '', 'short_description' => '', 'parent' => '', 'author' => '', 'author_username' => '', 'author_nickname' => '', 'author_description' => '', 'categories' => '', 'tags' => '', 'terms' => '', 'category' => '', 'category_description' => '', 'tag' => '', 'tag_description' => '', 'term' => '', 'term_description' => '', 'search_keyword' => '', 'keywords' => '', 'focus_keywords' => '', 'multi_focus_keywords' => '', 'totalpages' => '', 'pagenumber' => '' ); //to be replaced params $__replace = array_merge($__defaults, array( 'title' => get_bloginfo('name') )); $__postClean = $__defaults; $__authorClean = $__defaults; $__taxonomyClean = $__defaults; //loop through all page types and set some info! //:: //page type is: post or page (or attachment) if (in_array($type, array('post', 'page', 'posttype'))) { global $post; if (isset($post->ID) && !is_null($post->ID) && $post->ID>0) $__post = $post; else $__post = $wp_query->get_queried_object(); //get the post! $__postType = $this->getPostType(); if ( !empty($__postType) && $__postType == 'post' ) $__post = $this->post; $__wpquery = ( !empty($__postType) && $__postType == 'post' ? $this->post : $wp_query->get_queried_object() ); $__postClean['id'] = $__post->ID; if ( isset($__postClean['id']) && !is_null($__postClean['id']) && $__postClean['id']>0 ) { //post title $__postClean['title'] = strip_tags( apply_filters( 'single_post_title', $__post->post_title ) ); //post date if ( isset($__post->post_date) && !empty($__post->post_date) ) { $__postClean['date'] = mysql2date( get_option( 'date_format' ), $__post->post_date ); } //post description $__postClean['description'] = strip_shortcodes( $__post->post_content ); //post short description! if ( !empty($__post->post_excerpt) ) { $__postClean['short_description'] = strip_tags( $__post->post_excerpt ); } else { $__postClean['short_description'] = wp_html_excerpt( strip_shortcodes( $__post->post_content ), 200 ); } //post parent if ($__parentId = $__post->post_parent) { $__parent = get_post($__parentId); $__postClean['parent'] = strip_tags( apply_filters( 'single_post_title', $__parent->post_title ) ); } //post author global $authordata; $__author = $authordata; //get the post author! //post categories | tags | taxonomies $__taxonomyClean = array_merge($__taxonomyClean, $this->get_taxonomy($type, $__wpquery) ); //post custom - keywords & focus keyword! $psp_meta = $this->the_plugin->get_psp_meta( $__postClean['id'] ); $__postClean['keywords'] = isset($psp_meta['keywords']) ? $psp_meta['keywords'] : ''; //$__postClean['focus_keywords'] = get_post_meta( $__postClean['id'], 'psp_kw', true ); $__postClean['focus_keywords'] = isset($psp_meta['focus_keyword']) ? $psp_meta['focus_keyword'] : ''; $__postClean['multi_focus_keywords'] = isset($psp_meta['mfocus_keyword']) ? $psp_meta['mfocus_keyword'] : ''; $__postClean['multi_focus_keywords'] = implode(', ', $this->the_plugin->mkw_get_keywords($__postClean['multi_focus_keywords'])); if (empty($__postClean['keywords']) && !empty($__postClean['focus_keywords'])) { $__postClean['keywords'] = $__postClean['focus_keywords']; } } } //page type is: category | tag | taxonomy if (in_array($type, array('category', 'tag', 'taxonomy'))) { $__postType = $this->getPostType(); $__wpquery = ( !empty($__postType) && $__postType == 'term' ? $this->post : $wp_query->get_queried_object() ); $__taxonomyClean = array_merge($__taxonomyClean, $this->get_taxonomy($type, $__wpquery) ); } //page type is: author if ($type=='author') { $__author = $wp_query->get_queried_object(); //get the post author! } //page type is: archive if ($type=='archive') { $__date = ''; if ( is_month() ) $__date = single_month_title( ' ', false ); else if ( is_year() ) $__date = get_query_var( 'year' ); else if ( is_day() ) $__date = get_the_date(); } //:: //end loop through all page types and set some info! //author info if (!is_null($__author) && isset($__author->ID)) { $__authorClean = array_merge($__authorClean, array( 'title' => $__author->display_name, 'author' => $__author->display_name, 'author_username' => $__author->user_login, 'author_nickname' => get_the_author_meta( 'nickname', $__author->ID ), 'author_description'=> get_the_author_meta( 'description', $__author->ID ) )); } //pagination! $__paged = $this->pagination_info(); $__replace = array_merge($__replace, array( 'totalpages' => $__paged['total'], 'pagenumber' => $__paged['current'] )); switch ($type) { case 'home' : $__replace = array_merge($__replace, array( 'title' => get_bloginfo('name'), 'description' => get_bloginfo('description') )); $__page = 'home'; break; case 'post' : $__page = 'post'; case 'page' : $__page = 'page'; case 'posttype' : $__page = 'posttype'; case 'post' : case 'page' : case 'posttype' : $__replace = array_merge($__replace, array( 'title' => $__postClean['title'], 'id' => $__postClean['id'], 'date' => $__postClean['date'], 'description' => $__postClean['description'], 'short_description' => $__postClean['short_description'], 'parent' => $__postClean['parent'], 'author' => $__authorClean['author'], 'author_username' => $__authorClean['author_username'], 'author_nickname' => $__authorClean['author_nickname'], 'author_description' => $__authorClean['author_description'], 'categories' => $__taxonomyClean['categories'], 'tags' => $__taxonomyClean['tags'], 'terms' => $__taxonomyClean['terms'], 'category' => $__taxonomyClean['category'], 'category_description' => $__taxonomyClean['category_description'], 'tag' => $__taxonomyClean['tag'], 'tag_description' => $__taxonomyClean['tag_description'], 'term' => $__taxonomyClean['term'], 'term_description' => $__taxonomyClean['term_description'], 'keywords' => $__postClean['keywords'], 'focus_keywords' => $__postClean['focus_keywords'], 'multi_focus_keywords' => $__postClean['multi_focus_keywords'] )); break; case 'category' : $__replace = array_merge($__replace, array( 'title' => $__taxonomyClean['title'], 'category' => $__taxonomyClean['category'], 'category_description' => $__taxonomyClean['category_description'] )); $__page = 'category'; break; case 'tag' : $__replace = array_merge($__replace, array( 'title' => $__taxonomyClean['title'], 'tag' => $__taxonomyClean['tag'], 'tag_description' => $__taxonomyClean['tag_description'] )); $__page = 'tag'; break; case 'taxonomy' : $__replace = array_merge($__replace, array( 'title' => $__taxonomyClean['title'], 'term' => $__taxonomyClean['term'], 'term_description' => $__taxonomyClean['term_description'] )); $__page = 'taxonomy'; break; case 'archive' : $__replace = array_merge($__replace, array( 'title' => $__date, 'date' => $__date )); $__page = 'archive'; break; case 'author' : $__replace = array_merge($__replace, array( 'title' => $__authorClean['title'], 'author' => $__authorClean['author'], 'author_username' => $__authorClean['author_username'], 'author_nickname' => $__authorClean['author_nickname'], 'author_description' => $__authorClean['author_description'] )); $__page = 'author'; break; case 'search' : $__replace = array_merge($__replace, array( 'title' => esc_html( $wp_query->query_vars['s'] ), 'search_keyword' => esc_html( $wp_query->query_vars['s'] ) )); $__page = 'search'; break; case '404' : $__replace = array_merge($__replace, array( )); $__page = '404'; break; default : break; } $__replace = array_merge($__replace_orig, $__replace); $__replace = apply_filters( 'premiumseo_seo_make_format', $__replace, $type, $theContent ); //replace shortcodes with values! foreach ( $__replace as $shortcode => $value ) { $__return = str_replace( sprintf(self::$tplChar, $shortcode), $value, $__return ); } //var_dump('
    ', $__replace 	, '
    '); $__return = preg_replace( '/\s+/u', ' ', $__return ); //clean multiple white spaces! return trim( $__return ); } /** * pagination info! * */ protected function is_pagination() { $__ret = $this->pagination_info(); return $__ret['ispag']; } protected function pagination_info() { global $wp_query; $ret = array( 'ispag' => false, 'total' => 1, 'current' => 1 ); if ( is_paged() ) { $ret['ispag'] = true; $ret = array_merge($ret, array( 'ispag' => true, 'total' => abs( intval( $wp_query->max_num_pages ) ), 'current' => abs( intval( get_query_var('paged') ) ) )); return $ret; } else if ( get_query_var('page') ) { $ret['ispag'] = true; if ( is_singular() ) { $post = $wp_query->get_queried_object(); $ret['total'] = count( explode( '', $post->post_content ) ); } $ret['current'] = abs( intval( get_query_var('page') ) ); } if ( $ret['total']<=1 ) $ret['total'] = 1; if ( $ret['current']<=1 ) $ret['current'] = 1; return $ret; } /** * get taxonomy info per pagetype: post | page | category | tag | taxonomy * */ protected function get_taxonomy($type, $obj) { global $wp_query; $__taxonomyClean = array(); if (in_array($type, array('category', 'tag', 'taxonomy'))) { $__postType = $this->getPostType(); if ( !empty($__postType) ) $post = $this->post; $tmpTitle = ''; if ( function_exists( 'single_term_title' ) ) { //Since: 3.1.0 WP version $tmpTitle = single_term_title( '', false ); if ( $__postType == 'term' ) $tmpTitle = ''; } $tmpDesc = ''; if ( function_exists( 'term_description' ) ) { //Since: 2.8.0 WP version $tmpDesc = term_description(); if ( $__postType == 'term' ) $tmpDesc = ''; } if ($type=='category') { $__taxonomyClean['title'] = $tmpTitle!='' ? $tmpTitle : single_cat_title( '', false ); $__taxonomyClean['category_description'] = $tmpDesc!='' ? $tmpDesc : category_description(); if ( $__postType == 'term' ) { $__category = get_the_category(); $__categ = array('name' => '', 'desc' => ''); if (isset($__category[0]) && $__category[0]) { $__categ['name'] = $__category[0]->cat_name; $__categ['desc'] = $__category[0]->description; if ( $__categ['name']!='' ) { $__taxonomyClean['title'] = $__categ['name']; } if ( $__categ['desc']!='' ) { $__taxonomyClean['category_description'] = $__categ['desc']; } } } if ( $__taxonomyClean['title']=='' ) { $__taxonomyClean['title'] = $obj->name; } if ( $__taxonomyClean['category_description']=='' ) { $__taxonomyClean['category_description'] = $obj->description; } //var_dump('
    ',$__category[0], single_term_title( '', false ), single_cat_title( '', false ), $obj ,'
    '); $__taxonomyClean['category'] = $__taxonomyClean['title']; } else if ($type=='tag') { $__taxonomyClean['title'] = $tmpTitle!='' ? $tmpTitle : single_tag_title( '', false ); $__taxonomyClean['tag_description'] = $tmpDesc!='' ? $tmpDesc : tag_description(); if ( $__postType == 'term' ) { $__category = get_tags(); $__categ = array('name' => '', 'desc' => ''); if (isset($__category[0]) && $__category[0]) { $__categ['name'] = $__category[0]->name; $__categ['desc'] = $__category[0]->description; if ( $__categ['name']!='' ) { $__taxonomyClean['title'] = $__categ['name']; } if ( $__categ['desc']!='' ) { $__taxonomyClean['tag_description'] = $__categ['desc']; } } } if ( $__taxonomyClean['title']=='' ) { $__taxonomyClean['title'] = $obj->name; } if ( $__taxonomyClean['tag_description']=='' ) { $__taxonomyClean['tag_description'] = $obj->description; } //var_dump('
    ',$__category[0], single_term_title( '', false ), single_tag_title( '', false ), $obj ,'
    '); $__taxonomyClean['tag'] = $__taxonomyClean['title']; } else { $__taxonomyClean['title'] = $tmpTitle!='' ? $tmpTitle : $obj->name; $__taxonomyClean['term_description'] = $tmpDesc!='' ? $tmpDesc : $obj->description; $__taxonomyClean['term'] = $__taxonomyClean['title']; } } if (in_array($type, array('post', 'page', 'posttype'))) { if ( ! is_object($obj) || ! isset($obj->ID) ) { return $__taxonomyClean; } if ( function_exists( 'get_the_terms' ) ) { //Since: 2.5.0 WP version $categories = get_the_terms( $obj->ID, 'category' ); $tags = get_the_terms( $obj->ID, 'post_tag' ); // get post type taxonomies $__taxonomies = get_object_taxonomies( $obj->post_type, 'objects' ); $taxonomies = ''; foreach ( $__taxonomies as $taxonomy_slug => $taxonomy ){ if (in_array($taxonomy_slug, array('category', 'post_tag', 'post_format'))) continue 1; $taxonomies = get_the_terms( $obj->ID, $taxonomy_slug ); } $__taxonomyClean = array( 'categories' => $this->getTaxonomyItems( $categories ), 'tags' => $this->getTaxonomyItems( $tags ), 'taxonomies' => $this->getTaxonomyItems( $taxonomies ), 'category' => $this->getTaxonomyItems( $categories, true ), 'category_description' => $this->getTaxonomyItems( $categories, true, 'description' ), 'tag' => $this->getTaxonomyItems( $tags, true ), 'tag_description' => $this->getTaxonomyItems( $tags, true, 'description' ), 'term' => $this->getTaxonomyItems( $taxonomies, true ), 'term_description' => $this->getTaxonomyItems( $taxonomies, true, 'description' ) ); } } return $__taxonomyClean; } protected function getTaxonomyItems($items, $first=false, $field='name') { if (is_array($items) && count($items)>0) ; else return ''; $__list = array(); foreach ( $items as $k=>$v ) { if ($field=='name') $value = $v->name; else if ($field=='description') $value = $v->description; else $value = $v->name; //default return name! if ($first) return $value; $__list[] = $value; } return implode(', ', $__list); } /** * Get Post Type of the page */ private function getPostType() { $__postType = ''; if ( $this->verifyPostInfo() ) { $post = $this->post; if ( isset($post->ID) ) { $__postType = 'post'; } else if ( isset($post->term_id) && isset($post->taxonomy) ) { $__postType = 'term'; } } return $__postType; } public function get_the_url() { $__postType = $this->getPostType(); if ( !empty($__postType) ) $post = $this->post; if ( empty($__postType) ) return false; $url = ''; if ( $__postType == 'post' ) { $canonical = $this->the_canonical( false ); if ( isset($canonical) && !empty($canonical) ) $url = $canonical; if ( empty($url) ) $url = get_permalink( $post->ID ); } else if ( $__postType == 'term' ) { $canonical = $this->the_canonical( false ); if ( isset($canonical) && !empty($canonical) ) $url = $canonical; if ( empty($url) ) $url = get_term_link( $post, $post->taxonomy ); } return $url; } public function get_the_title() { $title = $this->get_the_pagetype('title'); $title = apply_filters( 'premiumseo_seo_title', $title ); $title = esc_html( strip_tags( stripslashes( $title ) ) ); return $title; } public function get_the_meta_description() { $meta_desc = $this->get_the_pagetype('desc'); $meta_desc = trim( $meta_desc ); $meta_desc = apply_filters( 'premiumseo_seo_meta_description', $meta_desc ); $meta_desc = esc_attr( strip_tags( stripslashes( $meta_desc ) ) ); return $meta_desc; } public function get_the_meta_keywords() { $meta_keywords = $this->get_the_pagetype('kw'); $meta_keywords = trim( $meta_keywords ); $meta_keywords = apply_filters( 'premiumseo_seo_meta_keywords', $meta_keywords ); $meta_keywords = esc_attr( strip_tags( stripslashes( $meta_keywords ) ) ); return $meta_keywords; } protected function get_the_format($field, $type) { switch ($field) { case 'title': $__field = 'title'; break; case 'desc': $__field = 'description'; break; case 'kw': $__field = 'keywords'; break; default: $__field = 'title'; break; } //current field value! $__currentValue = $this->get_current_field( $__field ); if ( !is_null($__currentValue) && !empty($__currentValue) && $__currentValue!='' ) { $on_page_optimization = $this->the_plugin->get_theoption( $this->the_plugin->alias . '_on_page_optimization' ); $meta_title_sufix = isset($on_page_optimization['meta_title_sufix']) ? $on_page_optimization['meta_title_sufix'] : ''; if ( $field == 'title' && $type != 'home' && !empty($meta_title_sufix) ) $__currentValue .= ' ' . $meta_title_sufix; return $__currentValue; } //current page type! $this->set_pagetypes(); $__templateValue = $this->get_template_field( $type, $field ); if ( false !== $__templateValue ) { $__currentValue = $__templateValue; } if ( empty($__currentValue) ) return ''; //format the page title! $__return = $this->make_format(array(), $type, $__currentValue); //var_dump('
    ', $__return , '
    '); return $__return; } public function get_the_pagetype($field='title', $format_func='get_the_format') { // if ( is_admin() || is_feed() ) return ''; $__postType = $this->getPostType(); if ( !empty($__postType) ) $post = $this->post; if ( $__postType == 'post' ) { if ( $post->post_type == 'page' || $post->post_type == 'attachment' ) { return call_user_func( array( $this, $format_func ), $field, 'page' ); } else if ( $post->post_type == 'post' ) { return call_user_func( array( $this, $format_func ), $field, 'post' ); } else { //if ( $post->post_type == 'product' ) { // return call_user_func( array( $this, $format_func ), $field, 'product' ); //} else { // return call_user_func( array( $this, $format_func ), $field, 'post' ); //} return call_user_func( array( $this, $format_func ), $field, 'posttype' ); } } else if ( $__postType == 'term' ) { if ( $post->taxonomy == 'category' ) { return call_user_func( array( $this, $format_func ), $field, 'category' ); } else if ( $post->taxonomy == 'tag') { return call_user_func( array( $this, $format_func ), $field, 'tag' ); } else if ( !in_array($post->taxonomy, array('category', 'tag')) ) { return call_user_func( array( $this, $format_func ), $field, 'taxonomy' ); } } return ''; } /** * get static & dynamic page types */ public function set_pagetypes() { $this->pageTypes = apply_filters('premiumseo_seo_settings', $this->pageTypes); } /** * Singleton pattern * * @return pspSEOImages Singleton instance */ static public function getInstance() { if (!self::$_instance) { self::$_instance = new self; } return self::$_instance; } } } // Initialize the pspSEOImages class //$pspTitleMetaFormat = new pspTitleMetaFormat($this->cfg, ( isset($module) ? $module : array()) ); $pspTitleMetaFormat = pspTitleMetaFormat::getInstance();7?N #.smartSEO/modules/title_meta_format/options.php ob 'noindex', //support by: Google, Yahoo!, MSN / Live, Ask 'nofollow' => 'nofollow', //support by: Google, Yahoo!, MSN / Live, Ask 'noarchive' => 'noarchive', //support by: Google, Yahoo!, MSN / Live, Ask 'noodp' => 'noodp' //support by: Google, Yahoo!, MSN / Live ); } } $__metaRobotsList = __metaRobotsList(); if ( ! function_exists('psp_CustomPosttypeTaxonomyMeta') ) { function psp_CustomPosttypeTaxonomyMeta( $istab = '', $is_subtab='', $params=array() ) { global $psp; $fields_name = array( 'title' => array( 'name' => __('Title Format', 'psp'), 'std' => array( 'posttype' => '', //'{title} | {site_title}', 'taxonomy' => '', //'{title} | {site_title}', ), ), 'desc' => array( 'name' => __('Meta Description', 'psp'), 'std' => array( 'posttype' => '', //'{short_description} | {site_description}', 'taxonomy' => '', //'{term_description}', ), ), 'kw' => array( 'name' => __('Meta Keywords', 'psp'), 'std' => array( 'posttype' => '', //'{keywords}', 'taxonomy' => '', //'{keywords}', ), ), 'robots' => array( 'name' => __('Meta Robots', 'psp'), 'std' => array( 'posttype' => array(), 'taxonomy' => array(), ), ) ); $params = array_merge(array( 'builtin' => false, 'what' => '', 'field' => '', ), $params); extract( $params ); ob_start(); $pms = array( 'public' => true, ); if ( $builtin === true || $builtin === false ) { $pms = array_merge($pms, array( '_builtin' => $builtin, // exclude post, page, attachment )); } if ( 'posttype' == $what ) { $uniqueKey = 'posttype_custom'; $post_types = get_post_types($pms, 'objects'); //unset media - images | videos /they are treated as belonging to post, pages, custom post types unset($post_types['attachment'], $post_types['revision'], $post_types['nav_menu_item']); $field_desc = __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {id} {date} {description} {short_description} {parent} {author} {author_username} {author_nickname} {categories} {tags} {terms} {category} {category_description} {tag} {tag_description} {term} {term_description} {keywords} {focus_keywords} {multi_focus_keywords}' . ''; } else { $uniqueKey = 'taxonomy_custom'; $post_types = get_taxonomies($pms, 'objects'); unset($post_types['post_format'], $post_types['nav_menu'], $post_types['link_category']); $field_desc = __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {term} {term_description}' . ''; } if ( 'robots' == $field ) { $field_desc = __('if you do not select "noindex", then "index" is by default active; if you do not select "nofollow", then "follow" is by default active', 'psp'); } $options = $psp->get_theoption('psp_title_meta_format'); foreach ($post_types as $key => $value) { $field_label = $value->labels->name; $field_label = $psp->get_taxonomy_nice_name( $field_label ); $field_label = str_replace('_', ' ', $field_label); $field_label = ucfirst($field_label); $field_label = $field_label . '
    ' . $fields_name["$field"]['name'] . ':'; ?>
    array( /* define the form_messages box */ 'title_meta_format' => array( 'title' => __('Title & Meta Formats', 'psp'), 'icon' => '{plugin_folder_uri}assets/menu_icon.png', 'size' => 'grid_4', // grid_1|grid_2|grid_3|grid_4 'header' => true, // true|false 'toggler' => false, // true|false 'buttons' => true, // true|false 'style' => 'panel', // panel|panel-widget // tabs 'tabs' => array( '__tab1' => array(__('Format Tags List', 'psp'), 'help_format_tags'), '__tab2' => array(__('Title Format', 'psp'), 'force_title,home_title,post_title,page_title,posttype_title,product_title,category_title,tag_title,taxonomy_title,archive_title,author_title,search_title,404_title,pagination_title,use_pagination_title'), '__tab3' => array(__('Meta Description', 'psp'), 'home_desc,post_desc,page_desc,posttype_desc,product_desc,category_desc,tag_desc,taxonomy_desc,archive_desc,author_desc,pagination_desc,use_pagination_desc'), '__tab4' => array(__('Meta Keywords', 'psp'), 'home_kw,post_kw,page_kw,posttype_kw,product_kw,category_kw,tag_kw,taxonomy_kw,archive_kw,author_kw,pagination_kw,use_pagination_kw'), '__tab5' => array(__('Meta Robots', 'psp'), 'home_robots,post_robots,page_robots,posttype_robots,product_robots,category_robots,tag_robots,taxonomy_robots,archive_robots,author_robots,search_robots,404_robots,pagination_robots,use_pagination_robots, help_meta_robots'), ), // tabs 'subtabs' => array( '__tab1' => array( '__subtab1' => array( __('Wordpress', 'psp'), 'help_format_tags')), '__tab2' => array( '__subtab1' => array( __('Wordpress', 'psp'), 'home_title,post_title,page_title,category_title,tag_title,archive_title,author_title,search_title,404_title,pagination_title,use_pagination_title'), '__subtab2' => array( __('Custom Post Type', 'psp'), 'posttype_title, product_title'), '__subtab3' => array( __('Custom Taxonomy', 'psp'), 'taxonomy_title')), '__tab3' => array( '__subtab1' => array( __('Wordpress', 'psp'), 'home_desc,post_desc,page_desc,category_desc,tag_desc,archive_desc,author_desc,pagination_desc,use_pagination_desc'), '__subtab2' => array( __('Custom Post Type', 'psp'), 'posttype_desc, product_desc'), '__subtab3' => array( __('Custom Taxonomy', 'psp'), 'taxonomy_desc')), '__tab4' => array( '__subtab1' => array( __('Wordpress', 'psp'), 'home_kw,post_kw,page_kw,category_kw,tag_kw,archive_kw,author_kw,pagination_kw,use_pagination_kw'), '__subtab2' => array( __('Custom Post Type', 'psp'), 'posttype_kw, product_kw'), '__subtab3' => array( __('Custom Taxonomy', 'psp'), 'taxonomy_kw')), '__tab5' => array( '__subtab1' => array( __('Wordpress', 'psp'), 'home_robots,post_robots,page_robots,category_robots,tag_robots,archive_robots,author_robots,search_robots,404_robots,pagination_robots,use_pagination_robots, help_meta_robots'), '__subtab2' => array( __('Custom Post Type', 'psp'), 'posttype_robots, product_robots, help_meta_robots'), '__subtab3' => array( __('Custom Taxonomy', 'psp'), 'taxonomy_robots, help_meta_robots')), '__tab6' => array( '__subtab1' => array( __('General', 'psp'), 'social_use_meta,social_include_extra,social_validation_type,social_site_title,social_default_img,social_fb_app_id'), '__subtab2' => array( __('Posts, Pages', 'psp'), 'social_opengraph_default, social_customfield_post'), '__subtab3' => array( __('Categories, Tags', 'psp'), 'social_opengraph_default_taxonomy, social_customfield_taxonomy'), '__subtab4' => array( __('Homepage - default', 'psp'), 'social_home_title,social_home_desc,social_home_img,social_home_type, help_psp_social_home')), '__tab7' => array( '__subtab1' => array( __('General', 'psp'), 'psp_twc_use_meta,psp_twc_website_account,psp_twc_website_account_id,psp_twc_creator_account,psp_twc_creator_account_id,psp_twc_default_img,psp_twc_thumb_sizes,psp_twc_thumb_crop'), '__subtab2' => array( __('Posts, Pages', 'psp'), 'help_psp_twc_post,psp_twc_cardstype_default,psp_twc_apptype_default,psp_twc_image_find'), '__subtab3' => array( __('Categories, Tags', 'psp'), 'help_psp_twc_taxonomy,psp_twc_cardstype_default_taxonomy,psp_twc_apptype_default_taxonomy,psp_twc_image_find_taxonomy'), '__subtab4' => array( __('Generic App Card Type for website', 'psp'), 'psp_twc_site_app,help_psp_twc_app'), '__subtab5' => array( __('Homepage - default', 'psp'), 'psp_twc_home_app,psp_twc_home_type,help_psp_twc_home')) ), // create the box elements array 'elements' => array( //============================================================= //== General options 'force_title' => array( 'type' => 'select', 'std' => 'yes', 'size' => 'large', 'force_width'=> '220', 'title' => __('Force Title Meta tag: ', 'psp'), 'desc' => __('force title meta tag (in some cases where you don\'t see the meta title you\'ve set for you post|page, you need to try and see which one of these 2 options works)', 'psp'), 'options' => array( 'yes' => __('parse page content and replace', 'psp'), 'no' => __('use wp_title wordpress hook', 'psp') ) ), //============================================================= //== help 'help_format_tags' => array( 'type' => 'message', 'html' => __('

    Basic Setup

    You can set the custom page title using defined formats tags.

    Available Format Tags

    • {site_title} : the website\'s title (global availability)
    • {site_description} : the website\'s description (global availability)
    • {current_date} : current date (global availability)
    • {current_time} : current time (global availability)
    • {current_day} : current day (global availability)
    • {current_year} : current year (global availability)
    • {current_month} : current month (global availability)
    • {current_week_day} : current day of the week (global availability)
    • {title} : the page|post title (global availability)
    • {id} : the page|post id (specific availability)
    • {date} : the page|post date (specific availability)
    • {description} : the page|post full description (specific availability)
    • {short_description} : the page|post excerpt or if excerpt does not exist, 200 character maximum are retrieved from description (specific availability)
    • {parent} : the page|post parent title (specific availability)
    • {author} : the page|post author name (specific availability)
    • {author_username} : the page|post author username (specific availability)
    • {author_nickname} : the page|post author nickname (specific availability)
    • {author_description} : the page|post author biographical Info (specific availability)
    • {categories} : the post categories names list separated by comma (specific availability)
    • {tags} : the post tags names list separated by comma (specific availability)
    • {terms} : the post custom taxonomies terms names list separated by comma (specific availability)
    • {category} : the category name or the post first found category name (specific availability)
    • {category_description} : the category description or the post first found category description (specific availability)
    • {tag} : the tag name or the post first found tag name (specific availability)
    • {tag_description} : the tag description or the post first found tag description (specific availability)
    • {term} : the term name or the post first found custom taxonomy term name (specific availability)
    • {term_description} : the term description or the post first found custom taxonomy term description (specific availability)
    • {search_keyword} : the word(s) used for search (specific availability)
    • {keywords} : the post|page meta keywords already defined (specific availability)
    • {focus_keywords} : the post|page primary focus keyword (first one from the list of focus keywords) already defined (specific availability)
    • {multi_focus_keywords} : the post|page list of focus keywords already defined separated by comma (specific availability)
    • {totalpages} : the total number of pages (if pagination is used), default value is 1 (specific availability)
    • {pagenumber} : the page number (if pagination is used), default value is 1 (specific availability)

    ', 'psp') ), //

    Info: when use {keywords}, if for a specific post|page {focus_keywords} is found then it is used, otherwise {keywords} remains active

    //============================================================= //== title format 'home_title' => array( 'type' => 'text', 'std' => '{site_title}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Homepage
    Title Format:', 'psp'), 'desc' => __('Available here: (global availability) tags', 'psp') ), 'post_title' => array( 'type' => 'text', 'std' => '{title} | {site_title}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Post
    Title Format:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {id} {date} {description} {short_description} {parent} {author} {author_username} {author_nickname} {categories} {tags} {terms} {category} {category_description} {tag} {tag_description} {term} {term_description} {keywords} {focus_keywords} {multi_focus_keywords}' . '' ), 'page_title' => array( 'type' => 'text', 'std' => '{title} | {site_title}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Page
    Title Format:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {id} {date} {description} {short_description} {parent} {author} {author_username} {author_nickname} {categories} {tags} {terms} {category} {category_description} {tag} {tag_description} {term} {term_description} {keywords} {focus_keywords} {multi_focus_keywords}' . '' ), 'category_title'=> array( 'type' => 'text', 'std' => '{title} | {site_title}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Category
    Title Format:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {category} {category_description}' . '' ), 'tag_title'=> array( 'type' => 'text', 'std' => '{title} | {site_title}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Tag
    Title Format:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {tag} {tag_description}' ,'' ), 'archive_title'=> array( 'type' => 'text', 'std' => '{title} ' . __('Archives', 'psp') . ' | {site_title}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Archives
    Title Format:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {date} ' . '' . __('- is based on archive type: per year or per month,year or per day,month,year', 'psp') ), 'author_title' => array( 'type' => 'text', 'std' => '{title} | {site_title}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Author
    Title Format:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {author} {author_username} {author_nickname}' . '' ), 'search_title' => array( 'type' => 'text', 'std' => __('Search for ', 'psp') . '{search_keyword} | {site_title}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Search
    Title Format:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {search_keyword}' . '' ), '404_title' => array( 'type' => 'text', 'std' => __('404 Page Not Found |', 'psp') . ' {site_title}', 'size' => 'large', 'force_width'=> '400', 'title' => __('404 Page Not Found
    Title Format:', 'psp'), 'desc' => __('Available here: (global availability) tags', 'psp') ), 'pagination_title'=> array( 'type' => 'text', 'std' => '{title} ' . __('- Page', 'psp') . ' {pagenumber} ' . __('of', 'psp') . ' {totalpages} | {site_title}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Pagination
    Title Format:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {totalpages} {pagenumber}' . '' ), 'use_pagination_title' => array( 'type' => 'select', 'std' => 'no', 'size' => 'large', 'force_width'=> '120', 'title' => __('Use Pagination:', 'psp'), 'desc' => __('Choose Yes if you want to use Pagination Title Format in pages where it can be applied!', 'psp'), 'options' => array( 'yes' => __('YES', 'psp'), 'no' => __('NO', 'psp') ) ), 'posttype_title' => array( 'type' => 'text', 'std' => '{title} | {site_title}', 'size' => 'large', 'force_width'=> '400', 'title' => __('--Generic--
    Title Format:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {id} {date} {description} {short_description} {parent} {author} {author_username} {author_nickname} {categories} {tags} {terms} {category} {category_description} {tag} {tag_description} {term} {term_description} {keywords} {focus_keywords} {multi_focus_keywords}' . '' ), /*'product_title' => array( 'type' => 'text', 'std' => '{title} | {site_title}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Product
    Title Format:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {id} {date} {description} {short_description} {parent} {author} {author_username} {author_nickname} {categories} {tags} {terms} {category} {category_description} {tag} {tag_description} {term} {term_description} {keywords} {focus_keywords} {multi_focus_keywords}' . '' ),*/ 'posttype_custom_title_html' => array( 'type' => 'html', 'html' => psp_CustomPosttypeTaxonomyMeta( '__tab2', '__subtab2', array( 'what' => 'posttype', 'field' => 'title', )) ), 'taxonomy_title'=> array( 'type' => 'text', 'std' => '{title} | {site_title}', 'size' => 'large', 'force_width'=> '400', 'title' => __('--Generic--
    Title Format:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {term} {term_description}' . '' ), 'taxonomy_custom_title_html' => array( 'type' => 'html', 'html' => psp_CustomPosttypeTaxonomyMeta( '__tab2', '__subtab3', array( 'what' => 'taxonomy', 'field' => 'title', )) ), //============================================================= //== meta description 'home_desc' => array( 'type' => 'textarea', 'std' => '{site_description}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Homepage
    Meta Description:', 'psp'), 'desc' => __('Available here: (global availability) tags', 'psp') ), 'post_desc' => array( 'type' => 'textarea', 'std' => '{short_description} | {site_description}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Post
    Meta Description:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {id} {date} {description} {short_description} {parent} {author} {author_username} {author_nickname} {categories} {tags} {terms} {category} {category_description} {tag} {tag_description} {term} {term_description} {keywords} {focus_keywords} {multi_focus_keywords}' . '' ), 'page_desc' => array( 'type' => 'textarea', 'std' => '{short_description} | {site_description}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Page
    Meta Description:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {id} {date} {description} {short_description} {parent} {author} {author_username} {author_nickname} {categories} {tags} {terms} {category} {category_description} {tag} {tag_description} {term} {term_description} {keywords} {focus_keywords} {multi_focus_keywords}' . '' ), 'category_desc'=> array( 'type' => 'textarea', 'std' => '{category_description}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Category
    Meta Description:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {category} {category_description}' . '' ), 'tag_desc'=> array( 'type' => 'textarea', 'std' => '{tag_description}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Tag
    Meta Description:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {tag} {tag_description}' . '' ), 'archive_desc'=> array( 'type' => 'textarea', 'std' => '', 'size' => 'large', 'force_width'=> '400', 'title' => __('Archives
    Meta Description:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {date} ' . '' . __('- is based on archive type: per year or per month,year or per day,month,year', 'psp') ), 'author_desc' => array( 'type' => 'textarea', 'std' => '', 'size' => 'large', 'force_width'=> '400', 'title' => __('Author
    Meta Description:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {author} {author_username} {author_nickname} {author_description}' . '' ), 'pagination_desc'=> array( 'type' => 'textarea', 'std' => __('Page {pagenumber}', 'psp'), 'size' => 'large', 'force_width'=> '400', 'title' => __('Pagination
    Meta Description:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {totalpages} {pagenumber}' . '' ), 'use_pagination_desc' => array( 'type' => 'select', 'std' => 'no', 'size' => 'large', 'force_width'=> '120', 'title' => __('Use Pagination:', 'psp'), 'desc' => __('Choose Yes if you want to use Pagination Meta Description in pages where it can be applied!', 'psp'), 'options' => array( 'yes' => __('YES', 'psp'), 'no' => __('NO', 'psp') ) ), 'posttype_desc' => array( 'type' => 'textarea', 'std' => '{short_description} | {site_description}', 'size' => 'large', 'force_width'=> '400', 'title' => __('--Generic--
    Meta Description:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {id} {date} {description} {short_description} {parent} {author} {author_username} {author_nickname} {categories} {tags} {terms} {category} {category_description} {tag} {tag_description} {term} {term_description} {keywords} {focus_keywords} {multi_focus_keywords}' . '' ), /*'product_desc' => array( 'type' => 'textarea', 'std' => '{short_description} | {site_description}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Product
    Meta Description:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {id} {date} {description} {short_description} {parent} {author} {author_username} {author_nickname} {categories} {tags} {terms} {category} {category_description} {tag} {tag_description} {term} {term_description} {keywords} {focus_keywords} {multi_focus_keywords}' . '' ),*/ 'posttype_custom_desc_html' => array( 'type' => 'html', 'html' => psp_CustomPosttypeTaxonomyMeta( '__tab3', '__subtab2', array( 'what' => 'posttype', 'field' => 'desc', )) ), 'taxonomy_desc'=> array( 'type' => 'textarea', 'std' => '{term_description}', 'size' => 'large', 'force_width'=> '400', 'title' => __('--Generic--
    Meta Description:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {term} {term_description}' . '' ), 'taxonomy_custom_desc_html' => array( 'type' => 'html', 'html' => psp_CustomPosttypeTaxonomyMeta( '__tab3', '__subtab3', array( 'what' => 'taxonomy', 'field' => 'desc', )) ), //============================================================= //== meta keywords 'home_kw' => array( 'type' => 'text', 'std' => '{keywords}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Homepage
    Meta Keywords:', 'psp'), 'desc' => __('Available here: (global availability) tags', 'psp') ), 'post_kw' => array( 'type' => 'text', 'std' => '{keywords}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Post
    Meta Keywords:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {id} {date} {description} {short_description} {parent} {author} {author_username} {author_nickname} {categories} {tags} {terms} {category} {category_description} {tag} {tag_description} {term} {term_description} {keywords} {focus_keywords} {multi_focus_keywords}' . '' ), 'page_kw' => array( 'type' => 'text', 'std' => '{keywords}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Page
    Meta Keywords:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {id} {date} {description} {short_description} {parent} {author} {author_username} {author_nickname} {categories} {tags} {terms} {category} {category_description} {tag} {tag_description} {term} {term_description} {keywords} {focus_keywords} {multi_focus_keywords}' . '' ), 'category_kw'=> array( 'type' => 'text', 'std' => '{keywords}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Category
    Meta Keywords:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {category} {category_description}' . '' ), 'tag_kw'=> array( 'type' => 'text', 'std' => '{keywords}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Tag
    Meta Keywords:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {tag} {tag_description}' . '' ), 'archive_kw'=> array( 'type' => 'text', 'std' => '', 'size' => 'large', 'force_width'=> '400', 'title' => __('Archives
    Meta Keywords:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {date} ' . '' . __('- is based on archive type: per year or per month,year or per day,month,year', 'psp') ), 'author_kw' => array( 'type' => 'text', 'std' => '', 'size' => 'large', 'force_width'=> '400', 'title' => __('Author
    Meta Keywords:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {author} {author_username} {author_nickname}' . '' ), 'pagination_kw'=> array( 'type' => 'text', 'std' => '', 'size' => 'large', 'force_width'=> '400', 'title' => __('Pagination
    Meta Keywords:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {totalpages} {pagenumber}' . '' ), 'use_pagination_kw' => array( 'type' => 'select', 'std' => 'no', 'size' => 'large', 'force_width'=> '120', 'title' => __('Use Pagination:', 'psp'), 'desc' => __('Choose Yes if you want to use Pagination Meta Keywords in pages where it can be applied!', 'psp'), 'options' => array( 'yes' => __('YES', 'psp'), 'no' => __('NO', 'psp') ) ), 'posttype_kw' => array( 'type' => 'text', 'std' => '{keywords}', 'size' => 'large', 'force_width'=> '400', 'title' => __('--Generic--
    Meta Keywords:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {id} {date} {description} {short_description} {parent} {author} {author_username} {author_nickname} {categories} {tags} {terms} {category} {category_description} {tag} {tag_description} {term} {term_description} {keywords} {focus_keywords} {multi_focus_keywords}' . '' ), /*'product_kw' => array( 'type' => 'text', 'std' => '{keywords}', 'size' => 'large', 'force_width'=> '400', 'title' => __('Product
    Meta Keywords:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {id} {date} {description} {short_description} {parent} {author} {author_username} {author_nickname} {categories} {tags} {terms} {category} {category_description} {tag} {tag_description} {term} {term_description} {keywords} {focus_keywords} {multi_focus_keywords}' . '' ),*/ 'posttype_custom_kw_html' => array( 'type' => 'html', 'html' => psp_CustomPosttypeTaxonomyMeta( '__tab4', '__subtab2', array( 'what' => 'posttype', 'field' => 'kw', )) ), 'taxonomy_kw'=> array( 'type' => 'text', 'std' => '{keywords}', 'size' => 'large', 'force_width'=> '400', 'title' => __('--Generic--
    Meta Keywords:', 'psp'), 'desc' => __('Available here: (global availability) tags; (specific availability) tags:', 'psp') . ' {term} {term_description}' . '' ), 'taxonomy_custom_kw_html' => array( 'type' => 'html', 'html' => psp_CustomPosttypeTaxonomyMeta( '__tab4', '__subtab3', array( 'what' => 'taxonomy', 'field' => 'kw', )) ), //============================================================= //== meta robots 'help_meta_robots' => array( 'type' => 'message', 'html' => __('

    What it means:

    • NOINDEX : tag tells Google not to index a specific page
    • NOFOLLOW : tag tells Google not to follow the links on a specific page
    • NOARCHIVE : tag tells Google not to store a cached copy of your page
    • NOODP : tag can prevent Google from using the meta-title and description for this page in DMOZ (Open Directory Project) as the snippet for your page in the search results.
      But as of Mar 17, 2017, DMOZ is no longer available, so this tag is considered deprecated and we\'ll remove it in a future plugin version.
    ', 'psp') ), 'home_robots' => array( 'type' => 'multiselect', 'std' => array(), 'size' => 'small', 'force_width'=> '400', 'title' => __('Homepage
    Meta Robots:', 'psp'), 'desc' => __('if you do not select "noindex", then "index" is by default active; if you do not select "nofollow", then "follow" is by default active', 'psp'), 'options' => $__metaRobotsList ), 'post_robots' => array( 'type' => 'multiselect', 'std' => array(), 'size' => 'small', 'force_width'=> '400', 'title' => __('Post
    Meta Robots:', 'psp'), 'desc' => __('if you do not select "noindex", then "index" is by default active; if you do not select "nofollow", then "follow" is by default active', 'psp'), 'options' => $__metaRobotsList ), 'page_robots' => array( 'type' => 'multiselect', 'std' => array(), 'size' => 'small', 'force_width'=> '400', 'title' => __('Page
    Meta Robots:', 'psp'), 'desc' => __('if you do not select "noindex", then "index" is by default active; if you do not select "nofollow", then "follow" is by default active', 'psp'), 'options' => $__metaRobotsList ), 'category_robots'=> array( 'type' => 'multiselect', 'std' => array(), 'size' => 'small', 'force_width'=> '400', 'title' => __('Category
    Meta Robots:', 'psp'), 'desc' => __('if you do not select "noindex", then "index" is by default active; if you do not select "nofollow", then "follow" is by default active', 'psp'), 'options' => $__metaRobotsList ), 'tag_robots'=> array( 'type' => 'multiselect', 'std' => array(), 'size' => 'small', 'force_width'=> '400', 'title' => __('Tag
    Meta Robots:', 'psp'), 'desc' => __('if you do not select "noindex", then "index" is by default active; if you do not select "nofollow", then "follow" is by default active', 'psp'), 'options' => $__metaRobotsList ), 'archive_robots'=> array( 'type' => 'multiselect', 'std' => array('noindex','nofollow','noarchive','noodp'), 'size' => 'small', 'force_width'=> '400', 'title' => __('Archives
    Meta Robots:', 'psp'), 'desc' => __('if you do not select "noindex", then "index" is by default active; if you do not select "nofollow", then "follow" is by default active', 'psp'), 'options' => $__metaRobotsList ), 'author_robots' => array( 'type' => 'multiselect', 'std' => array('noindex','nofollow','noarchive','noodp'), 'size' => 'small', 'force_width'=> '400', 'title' => __('Author
    Meta Robots:', 'psp'), 'desc' => __('if you do not select "noindex", then "index" is by default active; if you do not select "nofollow", then "follow" is by default active', 'psp'), 'options' => $__metaRobotsList ), 'search_robots' => array( 'type' => 'multiselect', 'std' => array('noindex','nofollow','noarchive','noodp'), 'size' => 'small', 'force_width'=> '400', 'title' => __('Search
    Meta Robots:', 'psp'), 'desc' => __('if you do not select "noindex", then "index" is by default active; if you do not select "nofollow", then "follow" is by default active', 'psp'), 'options' => $__metaRobotsList ), '404_robots' => array( 'type' => 'multiselect', 'std' => array('noindex','nofollow','noarchive','noodp'), 'size' => 'small', 'force_width'=> '400', 'title' => __('404 Page Not Found
    Meta Robots:', 'psp'), 'desc' => __('if you do not select "noindex", then "index" is by default active; if you do not select "nofollow", then "follow" is by default active', 'psp'), 'options' => $__metaRobotsList ), 'pagination_robots'=> array( 'type' => 'multiselect', 'std' => array('noindex','nofollow','noarchive','noodp'), 'size' => 'small', 'force_width'=> '400', 'title' => __('Pagination
    Meta Robots:', 'psp'), 'desc' => __('if you do not select "noindex", then "index" is by default active; if you do not select "nofollow", then "follow" is by default active', 'psp'), 'options' => $__metaRobotsList ), 'use_pagination_robots' => array( 'type' => 'select', 'std' => 'no', 'size' => 'large', 'force_width'=> '120', 'title' => __('Use Pagination:', 'psp'), 'desc' => __('Choose Yes if you want to use Pagination Meta Robots in pages where it can be applied!', 'psp'), 'options' => array( 'yes' => __('YES', 'psp'), 'no' => __('NO', 'psp') ) ), 'posttype_robots' => array( 'type' => 'multiselect', 'std' => array(), 'size' => 'small', 'force_width'=> '400', 'title' => __('--Generic--
    Meta Robots:', 'psp'), 'desc' => __('if you do not select "noindex", then "index" is by default active; if you do not select "nofollow", then "follow" is by default active', 'psp'), 'options' => $__metaRobotsList ), /*'product_robots' => array( 'type' => 'multiselect', 'std' => array(), 'size' => 'small', 'force_width'=> '400', 'title' => __('Product
    Meta Robots:', 'psp'), 'desc' => __('if you do not select "noindex", then "index" is by default active; if you do not select "nofollow", then "follow" is by default active', 'psp'), 'options' => $__metaRobotsList ),*/ 'posttype_custom_robots_html' => array( 'type' => 'html', 'html' => psp_CustomPosttypeTaxonomyMeta( '__tab5', '__subtab2', array( 'what' => 'posttype', 'field' => 'robots', )) ), 'taxonomy_robots'=> array( 'type' => 'multiselect', 'std' => array(), 'size' => 'small', 'force_width'=> '400', 'title' => __('--Generic--
    Meta Robots:', 'psp'), 'desc' => __('if you do not select "noindex", then "index" is by default active; if you do not select "nofollow", then "follow" is by default active', 'psp'), 'options' => $__metaRobotsList ), 'taxonomy_custom_robots_html' => array( 'type' => 'html', 'html' => psp_CustomPosttypeTaxonomyMeta( '__tab5', '__subtab3', array( 'what' => 'taxonomy', 'field' => 'robots', )) ), ) ) ) ) //) ; //var_dump('
    ', $__psp_mfo, '
    '); echo __FILE__ . ":" . __LINE__;die . PHP_EOL; echo json_encode( $__psp_mfo );1  [smartSEO/plugin.php obplugin_integrity_check() : true; }v / ss-lLicensing/GPL.txt obGNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.BO: |h/Licensing/README_License.txt obThis theme or plugin is comprised of two parts. (1) the PHP code and integrated HTML are licensed under the General Public License (GPL). You will find a copy of the GPL in the same directory as this text file. (2) All other parts, but not limited to the CSS code, images, and design are licensed according to the terms of your purchased license. Read more about licensing here: http://themeforest.net/licenses VT 8smartSEO/lib/scripts/facebook-v5-5.0.0/HttpClients/certs ob}óG +smartSEO/aa-framework/js/colorpicker/images ob,dQ 5smartSEO/lib/scripts/facebook-v5-5.0.0/Authentication obz\M 1smartSEO/lib/scripts/facebook-v5-5.0.0/Exceptions obx7M 1smartSEO/lib/scripts/facebook-v5-5.0.0/FileUpload obqM 1smartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes oblJ .smartSEO/lib/scripts/facebook-v5-5.0.0/Helpers obGG +smartSEO/lib/scripts/facebook-v5-5.0.0/Http ob eN 2smartSEO/lib/scripts/facebook-v5-5.0.0/HttpClients ob0Q 5smartSEO/lib/scripts/facebook-v5-5.0.0/PersistentData ob5zU 9smartSEO/lib/scripts/facebook-v5-5.0.0/PseudoRandomString ob7F *smartSEO/lib/scripts/facebook-v5-5.0.0/Url ob>cC 'smartSEO/modules/dashboard/assets/stats obҋE )smartSEO/modules/depedencies/assets/stats ob"; smartSEO/aa-framework/images/bg obXB &smartSEO/aa-framework/images/jquery-ui obҪɓ@ $smartSEO/aa-framework/js/colorpicker ob4@ $smartSEO/aa-framework/js/jquery.flot obT; smartSEO/aa-framework/js/rateit ob^R@ $smartSEO/aa-framework/shortcodes/css ob)(PC 'smartSEO/aa-framework/shortcodes/images obHy? #smartSEO/aa-framework/shortcodes/js obqa9 smartSEO/lib/scripts/facebook ob2=B &smartSEO/lib/scripts/facebook-v5-5.0.0 obA %smartSEO/lib/scripts/google-analytics ob2\m> "smartSEO/lib/scripts/mobile-detect obh: smartSEO/lib/scripts/php-query ob0t0C 'smartSEO/lib/scripts/plugin-depedencies ob8 smartSEO/lib/scripts/scssphp ob1@ $smartSEO/lib/scripts/seo-check-class ob5 smartSEO/lib/scripts/serp ob ^g5 smartSEO/lib/scripts/utf8 obEW= !smartSEO/modules/dashboard/assets ob "smartSEO/modules/title_meta_format obȝ1 smartSEO/aa-framework obk[(  smartSEO/lib ob$EB, smartSEO/modules obҹ$ smartSEO obzb=g%  Licensing objwF%  ު readme.md Gu\ȸ(0vBC/W^Ցq2leyWɫdxV[-x'ylD𧂱dc_MW44 nW.04 f} xP OjXPq6\t@* 4ɥI _PKemB?j6aM/Zpt˃A3iAx->(1ԓ5Qysܕ.LJ4݂KTzy)εnծ\qm8zv;' Lw"DW'>I䅱vu"$m=qvn-9>lop[90 qʁY-w~e|!tt-m6rx-2K c #c۔KzxIͥydeyњU17⤘Z[Hc2ְ L4Wzsx0MPaxKR3_nlt}q4Mҵ$IFg*m:iMõD7K λI\7I᪄Q6xQO·T讷NI 9)smartSEO/aa-framework/ajax-list-table.php ob)KޕEF~@ ))oʀ"smartSEO/aa-framework/css/font.css obW^RLWYfG 'smartSEO/aa-framework/fonts/pspicon.eot ob@|RаL( G ȗȗu'smartSEO/aa-framework/fonts/pspicon.svg obyRḬL)G 2['smartSEO/aa-framework/fonts/pspicon.ttf ob׵SM-dH Xg(smartSEO/aa-framework/fonts/pspicon.woff ob{=TǩN0nI  Gûހ)smartSEO/aa-framework/framework.class.php obY}SM#H ¡¡(smartSEO/aa-framework/images/16_code.png ob8XǜRƐ M  s-smartSEO/aa-framework/images/16_dashboard.png ob*̐XR`?!M Ѝ Ѝ "߁-smartSEO/aa-framework/images/16_fbplanner.png ob/O^XJlS wt3smartSEO/aa-framework/images/16_generalsettings.png ob;VP/K `+smartSEO/aa-framework/images/16_modules.png obgTԍN+I ۝۝*)smartSEO/aa-framework/images/16_offpg.png obô+SMH n(smartSEO/aa-framework/images/16_onpg.png obSrZT"O '/smartSEO/aa-framework/images/16_setupbackup.png obNTֆNDqI 6A)smartSEO/aa-framework/images/16_tools.png obYSQN /.smartSEO/aa-framework/images/32_monitorize.png obTtTN3ovI ]A)smartSEO/aa-framework/images/32_offpg.png ob6a͆[ ēV ۦۦgS6smartSEO/aa-framework/images/32_onpageoptimization.png obW8SMt6H i"(smartSEO/aa-framework/images/aa-logo.png ob'Z׀T:pO 0؀/smartSEO/aa-framework/images/envato_sprites.png obYNHHC CCYĀ%smartSEO/aa-framework/images/help.png obke=Ek` ""7BsmartSEO/aa-framework/images/jquery-ui/ui-icons_222222_256x240.png ob$ke*~?` )) 0 BsmartSEO/aa-framework/images/jquery-ui/ui-icons_2e83ff_256x240.png ob]ke;j` ""5BsmartSEO/aa-framework/images/jquery-ui/ui-icons_454545_256x240.png obke˕;` ""݀BsmartSEO/aa-framework/images/jquery-ui/ui-icons_888888_256x240.png oboOKke>"` ""wBsmartSEO/aa-framework/images/jquery-ui/ui-icons_cd0a0a_256x240.png obVP5K Ww+smartSEO/aa-framework/images/logo-small.png obwlP؊JT!E `B%smartSEO/aa-framework/images/logo.png obwXRq.M 00&/smartSEO/aa-framework/images/meta-box-icons.png obq(ONXRٯM 66׀/smartSEO/aa-framework/images/no-product-img.jpg obRLcG {{|)smartSEO/aa-framework/images/rate-now.png obp8NHĮ C ''ڀ%smartSEO/aa-framework/images/star.gif ob4XRkM I؀-smartSEO/aa-framework/images/stars_sprite.png ob9hLFw#jA TO'!smartSEO/aa-framework/js/admin.js ob_+,QK31F h&smartSEO/aa-framework/js/ajaxupload.js obUj^XnMS La3smartSEO/aa-framework/js/colorpicker/colorpicker.js ob9klfaa PPSZCsmartSEO/aa-framework/js/colorpicker/images/colorpicker_overlay.png ob9$b\kW Wʀ7smartSEO/aa-framework/js/jquery.flot/jquery.flot.min.js obdiHd^y=Y EEY;smartSEO/aa-framework/js/jquery.flot/jquery.flot.pie.min.js obOa߮[V ffR8smartSEO/aa-framework/js/jquery.flot/jquery.flot.time.js obEef`,[ ] ;smartSEO/aa-framework/js/jquery.percentageloader-0.1.min.js ob`_Y{J{VT 4smartSEO/aa-framework/js/jquery.timepicker.v1.1.1.js obUc]a({X ~8smartSEO/aa-framework/js/jquery.timepicker.v1.1.1.min.js ob#FSM96H C (smartSEO/aa-framework/js/menu-tooltip.js ob2P~YS?pN ww0smartSEO/aa-framework/js/rateit/jquery.rateit.js obP{]Wg+xR ..S04smartSEO/aa-framework/js/rateit/jquery.rateit.min.js obna[ 0MmV __ u8smartSEO/aa-framework/js/rateit/jquery.rateit.min.js.map ob&LFxA JJx#smartSEO/aa-framework/js/tooltip.js obk^OI5D  Չ;$smartSEO/aa-framework/main-style.css obSyGAD< LL&ӀsmartSEO/aa-framework/menu.php ob ll2YSUN ::"{Ā0smartSEO/aa-framework/scss/_ajax-list-table.scss obZUOj J ܺܺy*smartSEO/aa-framework/scss/_bootstrap.scss ob#SMH|BH ((=&<*smartSEO/aa-framework/scss/_dashboard.scss obQVP*K II -smartSEO/aa-framework/scss/_dependencies.scss obGPPJ~E s%smartSEO/aa-framework/scss/_main.scss ob>z[U.P ddj2smartSEO/aa-framework/scss/_mass-optimization.scss obkVP8QK  _f+smartSEO/aa-framework/scss/_meta-boxes.scss ob5nTNlI aapM+smartSEO/aa-framework/scss/_responsive.scss obx!\WQdL --S㢀.smartSEO/aa-framework/scss/_server-status.scss obČ\ղV$LQ X1smartSEO/aa-framework/settings-template.class.php obq^XqS !!Xɀ5smartSEO/aa-framework/shortcodes/js/tinymce.plugin.js obʔ0_]W)[dR ##J4smartSEO/aa-framework/shortcodes/js/tinymce.popup.js ob?_]WTyR 00 v%4smartSEO/aa-framework/shortcodes/shortcodes.init.php ob[U?@6P ))훮2smartSEO/aa-framework/shortcodes/tinymce.popup.php obLT\VY&)Q ŦŦ?~܀1smartSEO/aa-framework/utils/action_admin_ajax.php obRw UɻOHdJ +*smartSEO/aa-framework/utils/buddypress.php ob].Y΅S X[N #my.smartSEO/aa-framework/utils/import_seodata.php obdWQ;u L %,smartSEO/aa-framework/utils/plugin_utils.php ob4bҩYSz6N Q9p.smartSEO/aa-framework/utils/social_sharing.php ob]WLR d12smartSEO/aa-framework/utils/social_sharing_btn.php ob/cXʲRgRYM k51F-smartSEO/aa-framework/utils/twitter_cards.php ob6NԱHEC ccClDt%smartSEO/aa-framework/utils/utils.php obw>J=7ŠM92 xxo&smartSEO/icon_16.png obX[LF@A ..G5#smartSEO/lib/design/serp_email.html obC1ZTLm`O Ia/smartSEO/lib/scripts/facebook/base_facebook.php obSM}*H ++73*smartSEO/lib/scripts/facebook/facebook.php obLZ_YE:T ~ 4smartSEO/lib/scripts/facebook/fb_ca_chain_bundle.crt ob|^XS :: z5smartSEO/lib/scripts/facebook/_fb_ca_chain_bundle.crt obSշvpSk LLYMsmartSEO/lib/scripts/facebook-v5-5.0.0/Authentication/AccessTokenMetadata.php obe㤴oכiJ>d DD))!FsmartSEO/lib/scripts/facebook-v5-5.0.0/Authentication/OAuth2Client.php ob:]‰xКrwm 11 ؀OsmartSEO/lib/scripts/facebook-v5-5.0.0/Exceptions/FacebookResponseException.php obf(^XfS r>,%3smartSEO/lib/scripts/facebook-v5-5.0.0/Facebook.php obkh˜b"yVI] HH R?smartSEO/lib/scripts/facebook-v5-5.0.0/FacebookBatchRequest.php oblic+^ &&H@smartSEO/lib/scripts/facebook-v5-5.0.0/FacebookBatchResponse.php obbҗ\߂W ;;9smartSEO/lib/scripts/facebook-v5-5.0.0/FacebookClient.php ob^c]KN3X ffѬ59:smartSEO/lib/scripts/facebook-v5-5.0.0/FacebookRequest.php obmP1d^x4Y RR6;smartSEO/lib/scripts/facebook-v5-5.0.0/FacebookResponse.php obuykܕeN]wo` !!߆BsmartSEO/lib/scripts/facebook-v5-5.0.0/FileUpload/FacebookFile.php obxrW:m ((WOsmartSEO/lib/scripts/facebook-v5-5.0.0/FileUpload/FacebookResumableUploader.php obd|.]jd>cwm_ ?smartSEO/lib/scripts/facebook-v5-5.0.0/FileUpload/Mimetypes.php obEicM^ ++ߧ@smartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/Collection.php obNi‘ct ~^  ]:CT@smartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphAlbum.php ob*hbwA] 55`?smartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphEdge.php obDYiΐc1^ //M@smartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphEvent.php ob@fic³^ ##>Y@smartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphGroup.php ob hڏbC] **{9mk?smartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphNode.php ob8UoiɎ,d aa^)FsmartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphNodeFactory.php ob,ѭhb]B]  Ẁ?smartSEO/lib/scripts/facebook-v5-5.0.0/GraphNodes/GraphUser.php obfwqol UUxNsmartSEO/lib/scripts/facebook-v5-5.0.0/Helpers/FacebookRedirectLoginHelper.php obzOu $$ "WsmartSEO/lib/scripts/facebook-v5-5.0.0/Helpers/FacebookSignedRequestFromInputHelper.php ob7mgq2b ##b DsmartSEO/lib/scripts/facebook-v5-5.0.0/Http/RequestBodyMultipart.php ob~vp>Ǔk %%V!MsmartSEO/lib/scripts/facebook-v5-5.0.0/HttpClients/FacebookCurlHttpClient.php ob΍`a[{V AA(x8smartSEO/lib/scripts/facebook-v5-5.0.0/SignedRequest.php obQ۩sԇm (h ))_}JsmartSEO/lib/scripts/facebook-v5-5.0.0/Url/FacebookUrlDetectionHandler.php obn̪h(c ((~SEsmartSEO/lib/scripts/facebook-v5-5.0.0/Url/FacebookUrlManipulator.php obWTBmg|b ~BsmartSEO/lib/scripts/google-analytics/GoogleAnalyticsAPI.class.php obd`˅ZRfU ;..5smartSEO/lib/scripts/mobile-detect/Mobile_Detect.json ob _㙄Y|4T W+Հ4smartSEO/lib/scripts/mobile-detect/Mobile_Detect.php ob0$gWQˀL  5q,smartSEO/lib/scripts/php-query/php-query.php obᘜSuNII c*)smartSEO/lib/scripts/scssphp/scss.inc.php ob>l\nWVS/R '2smartSEO/lib/scripts/seo-check-class/seo.class.php ob[ TiO1rJ tt._,smartSEO/lib/scripts/serp/serp.api.class.php ob]SJiEљȗ@ --m"smartSEO/lib/scripts/utf8/utf8.php obXAh<7 -РsmartSEO/logo-small.png obFoKgFs>A ::#smartSEO/modules/dashboard/ajax.php ob?}FOʗgJE &&It'smartSEO/modules/dashboard/app.class.js obSUfP-K ,,@-smartSEO/modules/dashboard/assets/browser.png obkSfNVI )smartSEO/modules/dashboard/assets/ipc.png obUPPS K  J'w-smartSEO/modules/dashboard/assets/license.PNG obr0^PY` )dT ++DL6smartSEO/modules/dashboard/assets/stats/alexa-icon.png obϣfOa]Bj\ !! >smartSEO/modules/dashboard/assets/stats/facebook-like-icon.png ob [|\NWA2R KK} e4smartSEO/modules/dashboard/assets/support_banner.jpg obMpbKۊNFA FFր#smartSEO/modules/dashboard/init.php ob\KMF*A !!2#smartSEO/modules/dashboard/_app.css obK0MݏMHtAaC ..`%smartSEO/modules/depedencies/ajax.php ob[QLLSG %%K`)smartSEO/modules/depedencies/app.class.js ob_cLLG:̤B !!,%C$smartSEO/modules/depedencies/app.css ob!sWKRmaM ,,@/smartSEO/modules/depedencies/assets/browser.png obcUKPK +smartSEO/modules/depedencies/assets/ipc.png obcB+W6RM  J'w/smartSEO/modules/depedencies/assets/license.PNG obȼ`5[V ++DL8smartSEO/modules/depedencies/assets/stats/alexa-icon.png ob?hƑ5cYff^ !! @smartSEO/modules/depedencies/assets/stats/facebook-like-icon.png obߺJ^4YRT KK} e6smartSEO/modules/depedencies/assets/support_banner.jpg obоM3HC NNfC|%smartSEO/modules/depedencies/init.php obRc2^*Y 22@G;smartSEO/modules/modules_manager/aaModulesManager.class.php ob@rX2S N .smartSEO/modules/modules_manager/assets/32.png ob~_0Z'G.@U `5smartSEO/modules/modules_manager/assets/menu_icon.png obf;\ԭ/W 0R ƼƼ9L2smartSEO/modules/on_page_optimization/app.class.js ob}p,k&f  χ'FsmartSEO/modules/on_page_optimization/assets/16_onpageoptimization.png ob|{!v`q %%z,SsmartSEO/modules/on_page_optimization/bootstrap-tokenfield/bootstrap-tokenfield.css ob6|!w3Dr ЎЎL RsmartSEO/modules/on_page_optimization/bootstrap-tokenfield/bootstrap-tokenfield.js obf,{ffצv /VsmartSEO/modules/on_page_optimization/bootstrap-tokenfield/bootstrap-tokenfield.min.js obXS")N JR3(.smartSEO/modules/on_page_optimization/init.php ob YьTO --uW1smartSEO/modules/on_page_optimization/options.php obe QLllG {|ۘ'smartSEO/modules/server_status/ajax.php ob_.]5UPwK \ +smartSEO/modules/server_status/app.class.js obRNIPf1*D ""3o&smartSEO/modules/server_status/app.css obI`[V ررas6smartSEO/modules/server_status/assets/16_serversts.png ob_Rnic^*`Y sր9smartSEO/modules/server_status/assets/32_serverstatus.png ob]]Xʇ5S ررas3smartSEO/modules/server_status/assets/menu_icon.png ob(K, Oͮ JA0\E ZZ'smartSEO/modules/server_status/init.php obD\ W69R '2smartSEO/modules/setup_backup/assets/menu_icon.png ob#X SN II(;0smartSEO/modules/setup_backup/default-setup.json obEDU PR<&K &&-smartSEO/modules/setup_backup/default-sql.php ob qQZ U.J2P 00smartSEO/modules/title_meta_format/assets/32.png obdya\C4W R;Pe7smartSEO/modules/title_meta_format/assets/menu_icon.png ob/POUP\q6K R+smartSEO/modules/title_meta_format/init.php obnXS7?N #.smartSEO/modules/title_meta_format/options.php ob+(94v / ss-lLicensing/GPL.txt obwVQ