Advertisement
Guest User

Untitled

a guest
Nov 28th, 2022
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.07 KB | None | 0 0
  1. <?php
  2. if( ! defined( 'ABSPATH' ) ) { exit; } // Exit if accessed directly
  3.  
  4. global $avia_config, $post_loop_count;
  5.  
  6.  
  7. if( 'disable_blog' == avia_get_option( 'disable_blog' ) )
  8. {
  9. if( current_user_can( 'edit_posts' ) )
  10. {
  11. $msg = '<strong>' . __( 'Admin notice for:', 'avia_framework' ) . '</strong><br>';
  12. $msg .= __( 'Blog Posts', 'avia_framework' ) . '<br><br>';
  13. $msg .= __( 'This element was disabled in your theme settings. You can activate it here:', 'avia_framework' ) . '<br>';
  14. $msg .= '<a target="_blank" href="' . admin_url( 'admin.php?page=avia#goto_performance') . '">' . __( 'Performance Settings', 'avia_framework' ) . '</a>';
  15.  
  16. $content = "<span class='av-shortcode-disabled-notice'>{$msg}</span>";
  17.  
  18. echo $content;
  19. }
  20.  
  21. return;
  22. }
  23.  
  24.  
  25. if( empty( $post_loop_count ) )
  26. {
  27. $post_loop_count = 1;
  28. }
  29.  
  30. $blog_style = ! empty( $avia_config['blog_style'] ) ? $avia_config['blog_style'] : avia_get_option( 'blog_style', 'multi-big' );
  31.  
  32. if( is_single() )
  33. {
  34. $blog_style = avia_get_option( 'single_post_style', 'single-big' );
  35. }
  36.  
  37. $blog_global_style = avia_get_option( 'blog_global_style', '' ); //alt: elegant-blog
  38.  
  39. $initial_id = avia_get_the_ID();
  40.  
  41. // check if we got posts to display:
  42. if( have_posts() )
  43. {
  44. while( have_posts() )
  45. {
  46. the_post();
  47.  
  48. /**
  49. * get the current post id, the current post class and current post format
  50. */
  51. $url = '';
  52. $current_post = array();
  53. $current_post['post_loop_count'] = $post_loop_count;
  54. $current_post['the_id'] = get_the_ID();
  55. $current_post['parity'] = $post_loop_count % 2 ? 'odd' : 'even';
  56. $current_post['last'] = count( $wp_query->posts ) == $post_loop_count ? ' post-entry-last ' : '';
  57. $current_post['post_type'] = get_post_type( $current_post['the_id'] );
  58. $current_post['post_class'] = "post-entry-{$current_post['the_id']} post-loop-{$post_loop_count} post-parity-{$current_post['parity']} {$current_post['last']} {$blog_style}";
  59. $current_post['post_class'] .= ( $current_post['post_type'] == 'post' ) ? '' : ' post';
  60. $current_post['post_format'] = get_post_format() ? get_post_format() : 'standard';
  61. $current_post['post_layout'] = avia_layout_class( 'main', false );
  62. $blog_content = ! empty( $avia_config['blog_content'] ) ? $avia_config['blog_content'] : 'content';
  63.  
  64. /*If post uses builder change content to exerpt on overview pages*/
  65. if( Avia_Builder()->get_alb_builder_status( $current_post['the_id'] ) && ! is_singular( $current_post['the_id'] ) && $current_post['post_type'] == 'post' )
  66. {
  67. $current_post['post_format'] = 'standard';
  68. $blog_content = 'excerpt_read_more';
  69. }
  70.  
  71. /**
  72. * Allows especially for ALB posts to change output to 'content'
  73. * Supported since 4.5.5
  74. *
  75. * @since 4.5.5
  76. * @param string $blog_content
  77. * @param array $current_post
  78. * @param string $blog_style
  79. * @param string $blog_global_style
  80. * @return string
  81. */
  82. $blog_content = apply_filters( 'avf_blog_content_in_loop', $blog_content, $current_post, $blog_style, $blog_global_style );
  83.  
  84.  
  85. /*
  86. * retrieve slider, title and content for this post,...
  87. */
  88. $size = strpos( $blog_style, 'big' ) ? ( ( strpos( $current_post['post_layout'], 'sidebar' ) !== false ) ? 'entry_with_sidebar' : 'entry_without_sidebar' ) : 'square';
  89.  
  90. if( ! empty( $avia_config['preview_mode'] ) && ! empty( $avia_config['image_size'] ) && $avia_config['preview_mode'] == 'custom' )
  91. {
  92. $size = $avia_config['image_size'];
  93. }
  94.  
  95.  
  96. $current_post['title'] = get_the_title();
  97.  
  98. /**
  99. * Change default theme image
  100. *
  101. * @since 4.5.4
  102. * @param string $image_link
  103. * @param array $current_post
  104. * @param string $size
  105. * @return string
  106. */
  107. $current_post['slider'] = apply_filters( 'avf_post_featured_image_link', get_the_post_thumbnail( $current_post['the_id'], $size ), $current_post, $size );
  108.  
  109. /**
  110. * Backwards comp. to checkbox prior v4.5.3 (now selectbox with '' or '1')
  111. */
  112. $hide_featured_image = empty( get_post_meta( $current_post['the_id'], '_avia_hide_featured_image', true ) ) ? false : true;
  113. if( is_single( $initial_id ) && $hide_featured_image )
  114. {
  115. $current_post['slider'] = '';
  116. }
  117.  
  118. /**
  119. * Allow 3rd party to hook and return a plugin specific content.
  120. * This returned content replaces Enfold's standard content building procedure.
  121. *
  122. * @since 4.5.7.2
  123. * @param string
  124. * @param string $context
  125. * @return string
  126. */
  127. $current_post['content'] = apply_filters( 'avf_the_content', '', 'loop_index' );
  128. if( '' == $current_post['content'] )
  129. {
  130. $current_post['content'] = $blog_content == 'content' ? get_the_content( __( 'Read more', 'avia_framework' ) . '<span class="more-link-arrow"></span>' ) : get_the_excerpt();
  131. $current_post['content'] = $blog_content == 'excerpt_read_more' ? $current_post['content'] . '<div class="read-more-link"><a href="' . get_permalink() . '" class="more-link">' . __( 'Read more', 'avia_framework' ) . '<span class="more-link-arrow"></span></a></div>' : $current_post['content'];
  132. $current_post['before_content'] = '';
  133.  
  134. /*
  135. * ...now apply a filter, based on the post type... (filter function is located in includes/helper-post-format.php)
  136. */
  137. $current_post = apply_filters( 'post-format-' . $current_post['post_format'], $current_post );
  138. $with_slider = empty( $current_post['slider'] ) ? '' : 'with-slider';
  139.  
  140. /*
  141. * ... last apply the default wordpress filters to the content
  142. */
  143. $current_post['content'] = str_replace( ']]>', ']]&gt;', apply_filters( 'the_content', $current_post['content'] ) );
  144. }
  145.  
  146. /*
  147. * Now extract the variables so that $current_post['slider'] becomes $slider, $current_post['title'] becomes $title, etc
  148. */
  149. extract( $current_post );
  150.  
  151.  
  152. /**
  153. * render the html:
  154. */
  155. echo '<article class="' . implode( ' ', get_post_class( "post-entry post-entry-type-{$post_format} {$post_class} {$with_slider}" ) ) . '" ' . avia_markup_helper( array( 'context' => 'entry', 'echo' => false ) ) . '>';
  156.  
  157. // default link for preview images
  158. $link = ! empty( $url ) ? $url : get_permalink();
  159.  
  160. // prepare responsive lightbox images
  161. $link_lightbox = false;
  162. $lightbox_attr = '';
  163.  
  164. //preview image description
  165. $desc = '';
  166. $thumb_post = get_post( get_post_thumbnail_id() );
  167. if( $thumb_post instanceof WP_Post )
  168. {
  169. if( '' != trim( $thumb_post->post_excerpt ) )
  170. {
  171. // return 'Caption' from media gallery
  172. $desc = $thumb_post->post_excerpt;
  173. }
  174. else if( '' != trim( $thumb_post->post_title ) )
  175. {
  176. // return 'Title' from media gallery
  177. $desc = $thumb_post->post_title;
  178. }
  179. else if( '' != trim( $thumb_post->post_content ) )
  180. {
  181. // return 'Description' from media gallery
  182. $desc = $thumb_post->post_content;
  183. }
  184. }
  185.  
  186. $desc = trim( $desc );
  187. if( '' == $desc )
  188. {
  189. $desc = trim( the_title_attribute( 'echo=0' ) );
  190. }
  191.  
  192. /**
  193. * Allows to change the title attribute text for the featured image.
  194. * If '' is returned, then no title attribute is added.
  195. *
  196. * @since 4.6.4
  197. * @param string $desc
  198. * @param string $context 'loop_index'
  199. * @param WP_Post $thumb_post
  200. */
  201. $featured_img_title = apply_filters( 'avf_featured_image_title_attr', $desc, 'loop_index', $thumb_post );
  202.  
  203. $featured_img_title = '' != trim( $featured_img_title ) ? ' title="' . esc_attr( $featured_img_title ) . '" ' : '';
  204.  
  205. //on single page replace the link with a fullscreen image
  206. if( is_singular() )
  207. {
  208. if( ! $thumb_post instanceof WP_Post )
  209. {
  210. $link = '';
  211. }
  212. else
  213. {
  214. $link = avia_image_by_id( $thumb_post->ID, 'large', 'url' );
  215.  
  216. $lightbox_img = AviaHelper::get_url( 'lightbox', $thumb_post->ID, true );
  217. $lightbox_attr = Av_Responsive_Images()->html_attr_image_src( $lightbox_img, false );
  218. $link_lightbox = true;
  219. }
  220. }
  221.  
  222. if( ! in_array( $blog_style, array( 'bloglist-simple', 'bloglist-compact', 'bloglist-excerpt' ) ) )
  223. {
  224. //echo preview image
  225. if( strpos( $blog_global_style, 'elegant-blog' ) === false )
  226. {
  227. if( strpos( $blog_style, 'big' ) !== false )
  228. {
  229. if( $slider )
  230. {
  231. if( $link_lightbox )
  232. {
  233. $slider = '<a ' . $lightbox_attr . ' ' . $featured_img_title . '>' . $slider . '</a>';
  234. }
  235. else
  236. {
  237. $slider = '<a href="' . $link . '" ' . $featured_img_title . '>' . $slider . '</a>';
  238. }
  239. }
  240.  
  241. if( $slider )
  242. {
  243. echo '<div class="big-preview ' . $blog_style . '" ' . avia_markup_helper( array( 'context' => 'image', 'echo' => false ) ) . '>' . $slider . '</div>';
  244. }
  245. }
  246.  
  247. if( ! empty( $before_content ) )
  248. {
  249. echo '<div class="big-preview ' . $blog_style . '">' . $before_content . '</div>';
  250. }
  251. }
  252. }
  253.  
  254. echo '<div class="blog-meta">';
  255.  
  256. $blog_meta_output = '';
  257. $icon = '<span class="iconfont" ' . av_icon_string( $post_format ) . '></span>';
  258.  
  259. if( strpos( $blog_style, 'multi' ) !== false )
  260. {
  261. $gravatar = '';
  262. $pf_link = get_post_format_link( $post_format );
  263.  
  264. if( $post_format == 'standard' )
  265. {
  266. $author_name = apply_filters( 'avf_author_name', get_the_author_meta( 'display_name', $post->post_author ), $post->post_author );
  267. $author_email = apply_filters( 'avf_author_email', get_the_author_meta('email', $post->post_author), $post->post_author );
  268.  
  269. $gravatar_alt = esc_html( $author_name );
  270. $gravatar = get_avatar( $author_email, '81', 'blank', $gravatar_alt );
  271. $pf_link = get_author_posts_url( $post->post_author );
  272. }
  273.  
  274. $blog_meta_output = "<a href='{$pf_link}' class='post-author-format-type'><span class='rounded-container'>" . $gravatar . $icon . '</span></a>';
  275. }
  276. else if( strpos( $blog_style, 'small' ) !== false )
  277. {
  278. if( $link_lightbox )
  279. {
  280. $attr = $lightbox_attr;
  281. }
  282. else
  283. {
  284. $attr = "href='{$link}'";
  285. }
  286.  
  287. $blog_meta_output = "<a {$attr} class='small-preview' {$featured_img_title} " . avia_markup_helper( array( 'context' => 'image', 'echo' => false ) ). ">{$slider}{$icon}</a>";
  288. }
  289.  
  290. echo apply_filters( 'avf_loop_index_blog_meta', $blog_meta_output );
  291.  
  292. echo '</div>';
  293.  
  294. echo "<div class='entry-content-wrapper clearfix {$post_format}-content'>";
  295. echo '<header class="entry-content-header">';
  296.  
  297. if( $blog_style == 'bloglist-compact' )
  298. {
  299. $format = get_post_format();
  300. echo '<span class="fallback-post-type-icon" ' . av_icon_string( $format ) . '></span>';
  301. }
  302.  
  303. $close_header = '</header>';
  304.  
  305. $content_output = '<div class="entry-content" ' . avia_markup_helper( array( 'context' => 'entry_content', 'echo' => false ) ) . '>';
  306. $content_output .= $content;
  307. $content_output .= '</div>';
  308.  
  309.  
  310. $taxonomies = get_object_taxonomies( get_post_type( $the_id ) );
  311. $cats = '';
  312.  
  313. $excluded_taxonomies = array_merge( get_taxonomies( array( 'public' => false ) ), array( 'post_tag', 'post_format' ) );
  314.  
  315. /**
  316. *
  317. * @since ????
  318. * @since 4.8.8 added $context
  319. * @param array $excluded_taxonomies
  320. * @param string $post_type
  321. * @param int $the_id
  322. * @param string $context
  323. * @return array
  324. */
  325. $excluded_taxonomies = apply_filters( 'avf_exclude_taxonomies', $excluded_taxonomies, get_post_type( $the_id ), $the_id, 'loop-index' );
  326.  
  327. if( ! empty( $taxonomies ) )
  328. {
  329. foreach( $taxonomies as $taxonomy )
  330. {
  331. if( ! in_array( $taxonomy, $excluded_taxonomies ) )
  332. {
  333. $cats .= get_the_term_list( $the_id, $taxonomy, '', ', ', '' ) . ' ';
  334. }
  335. }
  336. }
  337.  
  338. //elegant blog
  339. //prev: if( $blog_global_style == 'elegant-blog' )
  340. if( strpos( $blog_global_style, 'elegant-blog' ) !== false )
  341. {
  342. $cat_output = '';
  343.  
  344. if( ! empty( $cats ) )
  345. {
  346. $cat_output .= '<span class="blog-categories minor-meta">';
  347. $cat_output .= trim( $cats );
  348. $cat_output .= '</span>';
  349. $cats = '';
  350. }
  351.  
  352. if ( in_array( $blog_style, array( 'bloglist-compact', 'bloglist-excerpt' ) ) )
  353. {
  354. echo $title;
  355. }
  356. else
  357. {
  358. // The wrapper div prevents the Safari reader from displaying the content twice ¯\_(ツ)_/¯
  359. echo '<div class="av-heading-wrapper">';
  360.  
  361. if( strpos( $blog_global_style, 'modern-blog' ) === false )
  362. {
  363. echo $cat_output . $title;
  364. }
  365. else
  366. {
  367. echo $title . $cat_output;
  368. }
  369.  
  370. echo '</div>';
  371. }
  372.  
  373. echo $close_header;
  374. $close_header = '';
  375.  
  376. if( ! in_array( $blog_style, array( 'bloglist-simple', 'bloglist-compact', 'bloglist-excerpt' ) ) )
  377. {
  378. echo '<span class="av-vertical-delimiter"></span>';
  379.  
  380. //echo preview image
  381. if( strpos( $blog_style, 'big' ) !== false )
  382. {
  383. if( $slider )
  384. {
  385. if( $link_lightbox )
  386. {
  387. $slider = '<a ' . $lightbox_attr . ' ' . $featured_img_title . '>' . $slider . '</a>';
  388. }
  389. else
  390. {
  391. $slider = '<a href="' . $link . '" ' . $featured_img_title . '>' . $slider . '</a>';
  392. }
  393. }
  394.  
  395. if( $slider )
  396. {
  397. echo '<div class="big-preview ' . $blog_style . '" ' . avia_markup_helper( array( 'context' => 'image', 'echo' => false ) ) . '>' . $slider . '</div>';
  398. }
  399. }
  400.  
  401. if( ! empty( $before_content ) )
  402. {
  403. echo '<div class="big-preview ' . $blog_style . '">' . $before_content . '</div>';
  404. }
  405.  
  406. echo $content_output;
  407. }
  408.  
  409. $cats = '';
  410. $title = '';
  411. $content_output = '';
  412. }
  413.  
  414. echo $title;
  415.  
  416. if( $blog_style !== 'bloglist-compact' )
  417. {
  418. echo '<span class="post-meta-infos">';
  419.  
  420. $meta_info = array();
  421.  
  422. /**
  423. * @since 4.8.8
  424. * @param string $hide_meta_only
  425. * @param string $context
  426. * @return string
  427. */
  428. $meta_seperator = apply_filters( 'avf_post_metadata_seperator', '<span class="text-sep">/</span>', 'loop-author' );
  429.  
  430. if( 'blog-meta-date' == avia_get_option( 'blog-meta-date' ) )
  431. {
  432. $meta_time = '<time class="date-container minor-meta updated" ' . avia_markup_helper( array( 'context' => 'entry_time', 'echo' => false ) ) . '>';
  433.  
  434. /**
  435. * Modify date displayed for meta data of blog
  436. *
  437. * @used_by enfold\config-events-calendar\config.php avia_events_modify_event_publish_date() 10
  438. * @since 5.3
  439. * @param string $published_time
  440. * @param int $current_post['the_id']
  441. * @param string $date_format
  442. * @return string
  443. */
  444. $meta_time .= apply_filters( 'avf_loop_index_meta_time', get_the_time( get_option( 'date_format' ) ), $current_post['the_id'], get_option( 'date_format' ) );
  445.  
  446. $meta_time .= '</time>';
  447.  
  448. $meta_info['date'] = $meta_time;
  449. }
  450.  
  451. if( 'blog-meta-comments' == avia_get_option( 'blog-meta-comments' ) )
  452. {
  453. if( get_comments_number() != '0' || comments_open() )
  454. {
  455. $meta_comment = '<span class="comment-container minor-meta">';
  456.  
  457. ob_start();
  458. comments_popup_link(
  459. "0 " . __( 'Comments', 'avia_framework' ),
  460. "1 " . __( 'Comment' , 'avia_framework' ),
  461. "% " . __( 'Comments', 'avia_framework' ),
  462. 'comments-link',
  463. __( 'Comments Disabled', 'avia_framework' )
  464. );
  465.  
  466. $meta_comment .= ob_get_clean();
  467. $meta_comment .= '</span>';
  468.  
  469. $meta_info['comment'] = $meta_comment;
  470. }
  471. }
  472.  
  473. if( 'blog-meta-category' == avia_get_option( 'blog-meta-category' ) )
  474. {
  475. if( ! empty( $cats ) )
  476. {
  477. $meta_cats = '<span class="blog-categories minor-meta">' . __( 'in', 'avia_framework') . ' ';
  478. $meta_cats .= trim( $cats );
  479. $meta_cats .= '</span>';
  480.  
  481. $meta_info['categories'] = $meta_cats;
  482. }
  483. }
  484.  
  485. /**
  486. * Allow to change theme options setting for certain posts
  487. *
  488. * @since 4.8.8
  489. * @param boolean $show_author_meta
  490. * @param string $context
  491. * @return boolean
  492. */
  493. if( true === apply_filters( 'avf_show_author_meta', 'blog-meta-author' == avia_get_option( 'blog-meta-author' ), 'loop-index' ) )
  494. {
  495. $meta_author = '<span class="blog-author minor-meta">' . __( 'by', 'avia_framework' ) . ' ';
  496. $meta_author .= '<span class="entry-author-link" ' . avia_markup_helper( array( 'context' => 'author_name', 'echo' => false ) ) . '>';
  497. $meta_author .= '<span class="author">';
  498. $meta_author .= '<span class="fn">';
  499. $meta_author .= get_the_author_posts_link();
  500. $meta_author .= '</span>';
  501. $meta_author .= '</span>';
  502. $meta_author .= '</span>';
  503. $meta_author .= '</span>';
  504.  
  505. $meta_info['author'] = $meta_author;
  506. }
  507.  
  508. /**
  509. * Modify the post metadata array
  510. *
  511. * @since 4.8.8
  512. * @param array $meta_info
  513. * @param string $context
  514. * @return array
  515. */
  516. $meta_info = apply_filters( 'avf_post_metadata_array', $meta_info, 'loop-index' );
  517.  
  518. echo implode( $meta_seperator, $meta_info );
  519.  
  520. if( $blog_style == 'bloglist-simple' )
  521. {
  522. echo '<div class="read-more-link"><a href="' . get_permalink() . '" class="more-link">' . __( 'Read more', 'avia_framework' ) . '<span class="more-link-arrow"></span></a></div>';
  523. }
  524.  
  525. echo '</span>';
  526.  
  527. } // display meta-infos on all layouts except bloglist-compact
  528.  
  529. echo $close_header;
  530.  
  531.  
  532. // echo the post content
  533. if ( $blog_style == 'bloglist-excerpt' )
  534. {
  535. the_excerpt();
  536.  
  537. echo '<div class="read-more-link">';
  538. echo '<a href="' . get_permalink() . '" class="more-link">' . __( 'Read more', 'avia_framework' );
  539. echo '<span class="more-link-arrow"></span>';
  540. echo '</a>';
  541. echo '</div>';
  542. }
  543.  
  544. if ( ! in_array( $blog_style, array( 'bloglist-simple', 'bloglist-compact', 'bloglist-excerpt' ) ) )
  545. {
  546. echo $content_output;
  547. }
  548.  
  549. echo '<footer class="entry-footer">';
  550.  
  551. $avia_wp_link_pages_args = apply_filters( 'avf_wp_link_pages_args', array(
  552. 'before' => '<nav class="pagination_split_post">' . __( 'Pages:', 'avia_framework' ),
  553. 'after' => '</nav>',
  554. 'pagelink' => '<span>%</span>',
  555. 'separator' => ' ',
  556. ) );
  557.  
  558. wp_link_pages( $avia_wp_link_pages_args );
  559.  
  560. if( is_single() && ! post_password_required() )
  561. {
  562. //tags on single post
  563. if( 'blog-meta-tag' == avia_get_option( 'blog-meta-tag' ) && has_tag() )
  564. {
  565. echo '<span class="blog-tags minor-meta">';
  566. the_tags( '<strong>' . __( 'Tags:', 'avia_framework' ) . '</strong><span> ' );
  567. echo '</span></span>';
  568. }
  569.  
  570. //share links on single post
  571. avia_social_share_links_single_post();
  572. }
  573.  
  574. do_action( 'ava_after_content', $the_id, 'post' );
  575.  
  576. echo '</footer>';
  577.  
  578. echo "<div class='post_delimiter'></div>";
  579.  
  580. echo '</div>';
  581.  
  582. echo '<div class="post_author_timeline"></div>';
  583. echo av_blog_entry_markup_helper( $current_post['the_id'] );
  584.  
  585. echo '</article>';
  586.  
  587. $post_loop_count++;
  588. }
  589. }
  590. else
  591. {
  592. $default_heading = 'h1';
  593. $args = array(
  594. 'heading' => $default_heading,
  595. 'extra_class' => ''
  596. );
  597.  
  598. /**
  599. * @since 4.5.5
  600. * @return array
  601. */
  602. $args = apply_filters( 'avf_customize_heading_settings', $args, 'loop_index::nothing_found', array() );
  603.  
  604. $heading = ! empty( $args['heading'] ) ? $args['heading'] : $default_heading;
  605. $css = ! empty( $args['extra_class'] ) ? $args['extra_class'] : '';
  606. ?>
  607. <article class="entry">
  608. <header class="entry-content-header">
  609. <?php
  610. echo "<{$heading} class='post-title entry-title {$css}'>" . __( 'Nothing Found', 'avia_framework' ) . "</{$heading}>";
  611. ?>
  612. </header>
  613.  
  614. <p class="entry-content" <?php avia_markup_helper( array( 'context' => 'entry_content' ) ); ?>><?php _e( 'Sorry, no posts matched your criteria', 'avia_framework' ); ?></p>
  615.  
  616. <footer class="entry-footer"></footer>
  617. </article>
  618.  
  619. <?php
  620. }
  621.  
  622. if( empty( $avia_config['remove_pagination'] ) )
  623. {
  624. echo "<div class='{$blog_style}'>" . avia_pagination( '', 'nav' ) . '</div>';
  625. }
  626.  
  627.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement