PluginProbe
Post Grid Gutenberg Blocks – PostX / 5.0.18
Post Grid Gutenberg Blocks – PostX v5.0.18
5.0.39 5.0.38 5.0.37 5.0.36 5.0.35 5.0.34 5.0.33 5.0.32 5.0.31 5.0.30 5.0.29 5.0.28 5.0.27 5.0.26 5.0.25 5.0.23 5.0.24 5.0.22 5.0.21 5.0.20 5.0.19 5.0.18 5.0.17 2.1.1 2.1.2 All 237 releases
ultimate-post / classes / Initialization.php

Initialization.php in Post Grid Gutenberg Blocks – PostX 5.0.18, at classes/Initialization.php

620 lines 20.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Initialization Action.
5 *
6 * @package ULTP\ULTP_Initialization
7 * @since v.1.1.0
8 */
9
10 namespace ULTP;
11
12 defined( 'ABSPATH' ) || exit;
13
14 use ULTP\Includes\Durbin\Xpo;
15 use ULTP\Includes\Notice\Notice;
16
17 /**
18 * Initialization class.
19 *
20 * Handles plugin initialization for Ultimate Post.
21 *
22 * @package ULTP\Initialization
23 * @since 4.0.0
24 */
25 class ULTP_Initialization {
26
27 /**
28 * Setup class.
29 *
30 * @since 4.0.0
31 * @return void No return value.
32 */
33 public function __construct() {
34
35 $this->compatibility_check();
36 $this->requires();
37 $this->include_addons();
38
39 add_filter( 'admin_body_class', array( $this, 'add_admin_body_class' ) ); // add body class in editor.
40 add_filter( 'body_class', array( $this, 'add_body_class' ) ); // add body class in front end.
41
42 add_action( 'wp', array( $this, 'popular_posts_tracker_callback' ) );
43 add_action( 'after_setup_theme', array( $this, 'add_image_size' ) );
44 add_filter( 'block_categories_all', array( $this, 'register_category_callback' ), 999999999, 2 ); // Block Category Register.
45
46 add_filter( 'safe_style_css', array( $this, 'ultp_handle_safe_style_css' ) ); // support for css used in svg icon.
47 add_filter( 'wp_kses_allowed_html', array( $this, 'ultp_handle_allowed_html' ), 99, 2 ); // support for svg icon used in list, row, icon block.
48
49 add_action( 'enqueue_block_editor_assets', array( $this, 'register_block_scripts_editor_area' ) ); // Only editor.
50 add_action( 'admin_enqueue_scripts', array( $this, 'register_option_panel_scripts_callback' ) ); // Option Panel.
51 register_activation_hook( ULTP_PATH . 'ultimate-post.php', array( $this, 'plugin_activation_hook' ) );
52 add_action( 'activated_plugin', array( $this, 'ultp_plugin_activation' ) ); // Plugin Activation Call.
53 // new Notice();
54 }
55
56 /**
57 * Check plugin compatibility.
58 *
59 * @since v.1.0.0
60 * @return void
61 */
62 public function compatibility_check() {
63 require_once ULTP_PATH . 'classes/Compatibility.php';
64 new \ULTP\Compatibility();
65 }
66
67 /**
68 * Load all required classes.
69 *
70 * @since v.1.0.0
71 * @return void No return value.
72 */
73 public function requires() {
74 require_once ULTP_PATH . 'classes/Styles.php';
75 require_once ULTP_PATH . 'classes/Options.php';
76 require_once ULTP_PATH . 'classes/REST_API.php';
77 require_once ULTP_PATH . 'classes/Caches.php';
78 require_once ULTP_PATH . 'classes/Importer.php';
79 require_once ULTP_PATH . 'classes/Dashboard.php';
80 require_once ULTP_PATH . 'classes/Blocks.php';
81 new \ULTP\REST_API();
82 new \ULTP\Options();
83 new \ULTP\Caches();
84 new \ULTP\Styles();
85 new \ULTP\Importer();
86 new \ULTP\Dashboard();
87 new \ULTP\Blocks();
88
89 require_once ULTP_PATH . 'includes/durbin/class-durbin-client.php';
90 require_once ULTP_PATH . 'includes/durbin/class-xpo.php';
91 require_once ULTP_PATH . 'includes/deactive/class-deactive.php';
92 require_once ULTP_PATH . 'includes/notice/class-notice.php';
93 require_once ULTP_PATH . 'includes/durbin/class-our-plugins.php';
94 require_once ULTP_PATH . 'includes/notice/class-wow-shipping-promotion.php';
95 new \ULTP\Includes\Deactive\Deactive();
96 new \ULTP\Includes\notice\Notice();
97 new \ULTP\Includes\notice\WowShippingPromotion();
98 new \ULTP\Includes\Durbin\OurPlugins();
99 }
100
101 /**
102 * Include all addons from the addons directory.
103 *
104 * @since v.1.0.0
105 * @return void
106 */
107 public function include_addons() {
108 $addons_dir = array_filter( glob( ULTP_PATH . 'addons/*' ), 'is_dir' );
109 if ( count( $addons_dir ) > 0 ) {
110 foreach ( $addons_dir as $key => $value ) {
111 $addon_dir_name = str_replace( dirname( $value ) . '/', '', $value );
112 $file_name = ULTP_PATH . 'addons/' . $addon_dir_name . '/init.php';
113 if ( file_exists( $file_name ) ) {
114 include_once $file_name;
115 }
116 }
117 }
118 }
119
120
121 /**
122 * Add admin body class in editor.
123 *
124 * @since v.3.1.6
125 * @param STRING $classes The existing admin body classes.
126 * @return STRING Modified admin body classes.
127 */
128 public function add_admin_body_class( $classes ) {
129 $classes .= ' postx-admin-page ';
130 return $classes;
131 }
132
133 /**
134 * Add body class in front end.
135 *
136 * @since v.3.1.6
137 * @param ARRAY $classes The existing body classes.
138 * @return ARRAY Modified body classes.
139 */
140 public function add_body_class( $classes ) {
141 $classes[] = 'postx-page';
142 return $classes;
143 }
144
145 /**
146 * Post view counter for every post.
147 *
148 * @since v.1.0.0
149 * @param INT $post_id The post ID.
150 * @return NULL No return value.
151 */
152 public function popular_posts_tracker_callback( $post_id ) {
153 if ( ! is_single() ) {
154 return;
155 }
156 global $post;
157 $post_id = isset( $post->ID ) ? $post->ID : '';
158 $isEnable = apply_filters( 'ultp_view_cookies', true );
159 // add_filter( 'ultp_view_cookies', '__return_false' );
160 $cookies_disable = ultimate_post()->get_setting( 'disable_view_cookies' );
161 if ( $post_id && $isEnable && $cookies_disable != 'yes' ) {
162 $has_cookie = isset( $_COOKIE[ 'ultp_view_' . $post_id ] ) ? sanitize_text_field( $_COOKIE[ 'ultp_view_' . $post_id ] ) : false;
163 if ( ! $has_cookie ) {
164 $count = (int) get_post_meta( $post_id, '__post_views_count', true );
165 update_post_meta( $post_id, '__post_views_count', $count ? (int) $count + 1 : 1 );
166 setcookie( 'ultp_view_' . $post_id, 1, time() + 86400, COOKIEPATH ); // 1 days cookies
167 }
168 }
169 }
170
171 /**
172 * Set image sizes for the plugin.
173 *
174 * @since v.1.0.0
175 * @return void No return value.
176 */
177 public function add_image_size() {
178 $size_disable = ultimate_post()->get_setting( 'disable_image_size' );
179 if ( $size_disable != 'yes' ) {
180 add_image_size( 'ultp_layout_landscape_large', 1200, 800, true );
181 add_image_size( 'ultp_layout_landscape', 870, 570, true );
182 add_image_size( 'ultp_layout_portrait', 600, 900, true );
183 add_image_size( 'ultp_layout_square', 600, 600, true );
184 }
185 }
186
187 /**
188 * Block categories initialization.
189 *
190 * @since v.1.0.0
191 * @param ARRAY $categories The block categories.
192 * @param ARRAY $post The post object.
193 * @return ARRAY Modified block categories.
194 */
195 public function register_category_callback( $categories, $post ) {
196 $attr = array(
197 array(
198 'slug' => 'ultimate-post',
199 'title' => __( 'PostX - Gutenberg Post Blocks', 'ultimate-post' ),
200 ),
201 array(
202 'slug' => 'postx-site-builder',
203 'title' => __( 'PostX Site Builder', 'ultimate-post' ),
204 ),
205 );
206 return array_merge( $attr, $categories );
207 }
208
209 /**
210 * Add support for CSS to use SVG.
211 *
212 * @since 4.0.0
213 * @param ARRAY $styles The allowed CSS styles.
214 * @return ARRAY Modified allowed CSS styles.
215 */
216 public function ultp_handle_safe_style_css( $styles ) {
217 if ( ! is_multisite() && ! current_user_can( 'edit_posts' ) ) {
218 return $styles;
219 }
220 return array_merge(
221 $styles,
222 array(
223 'opacity',
224 // for SVG gradients.
225 // 'stop-opacity',
226 // 'stop-color',
227 )
228 );
229 }
230
231 /**
232 * Add support for HTML tags to use SVG.
233 *
234 * @since 4.0.0
235 * @param ARRAY $tags The allowed HTML tags.
236 * @param STRING $context The context for allowed HTML.
237 * @return ARRAY Modified allowed HTML tags.
238 */
239 public function ultp_handle_allowed_html( $tags, $context ) {
240 if ( 'post' !== $context && ! is_multisite() && ! current_user_can( 'edit_posts' ) ) {
241 return $tags;
242 }
243 if ( ! isset( $tags['svg'] ) ) {
244 $tags['svg'] = array_merge(
245 array(
246 'xmlns' => true,
247 // 'xmlns:xlink' => true,
248 // 'xlink:href' => true,
249 // 'xml:id' => true,
250 // 'xlink:title' => true,
251 // 'xml:space' => true,
252 'viewbox' => true,
253 'enable-background' => true,
254 'version' => true,
255 'preserveaspectratio' => true,
256 'fill' => true,
257 )
258 );
259 }
260 if ( ! isset( $tags['path'] ) || ! is_array( $tags['path'] ) ) {
261 $tags['path'] = array();
262 }
263
264 $tags['path'] = array_merge(
265 $tags['path'],
266 array(
267 'd' => true,
268 'stroke' => true,
269 'stroke-miterlimit' => true,
270 'data-original' => true,
271 'class' => true,
272 'transform' => true,
273 'style' => true,
274 'opacity' => true,
275 'fill' => true,
276 'stroke-width' => true,
277 'stroke-linecap' => true,
278 'stroke-linejoin' => true,
279 )
280 );
281
282 if ( ! isset( $tags['g'] ) ) {
283 $tags['g'] = array(
284 'transform' => true,
285 'clip-path' => true,
286 );
287 }
288 if ( ! isset( $tags['clippath'] ) ) {
289 $tags['clippath'] = array();
290 }
291 if ( ! isset( $tags['defs'] ) ) {
292 $tags['defs'] = array();
293 }
294 if ( ! isset( $tags['rect'] ) ) {
295 $tags['rect'] = array(
296 'rx' => true,
297 'height' => true,
298 'width' => true,
299 'transform' => true,
300 'x' => true,
301 'fill' => true,
302 );
303 }
304 if ( ! isset( $tags['circle'] ) ) {
305 $tags['circle'] = array(
306 'cx' => true,
307 'cy' => true,
308 'transform' => true,
309 'r' => true,
310 );
311 }
312 if ( ! isset( $tags['polygon'] ) ) {
313 $tags['polygon'] = array(
314 'points' => true,
315 );
316 }
317 if ( ! isset( $tags['lineargradient'] ) ) {
318 $tags['lineargradient'] = array(
319 'gradienttransform' => true,
320 'id' => true,
321 );
322 }
323 if ( ! isset( $tags['stop'] ) ) {
324 $tags['stop'] = array(
325 'offset' => true,
326 'stop-color' => true,
327 'style' => true,
328 'stop-opacity' => true,
329 );
330 }
331 return $tags;
332 }
333
334 /**
335 * Plugin activation callback.
336 *
337 * @since v.1.1.0
338 * @param STRING $plugin The plugin file path.
339 * @return NULL No return value.
340 */
341 public function ultp_plugin_activation( $plugin ) {
342 if ( wp_doing_ajax() ) {
343 return;
344 }
345 if ( $plugin == 'ultimate-post/ultimate-post.php' ) {
346 if ( wp_doing_ajax() || is_network_admin() || isset( $_GET['activate-multi'] ) || isset( $_POST['action'] ) && 'activate-selected' == $_POST['action'] ) {
347 return;
348 }
349 if ( ultimate_post()->get_setting( 'init_setup' ) != 'yes' ) {
350 ultimate_post()->set_setting( 'init_setup', 'yes' );
351 exit(wp_safe_redirect(admin_url('admin.php?page=ultp-setup-wizard'))); //phpcs:ignore
352 } else {
353 exit(wp_safe_redirect(admin_url('admin.php?page=ultp-settings#home'))); //phpcs:ignore
354 }
355 }
356 }
357
358 /**
359 * Enqueue option panel CSS and JS scripts.
360 *
361 * @since v.1.0.0
362 * @return void No return value.
363 */
364 public function register_option_panel_scripts_callback() {
365 $is_active = ultimate_post()->is_lc_active();
366 $license_key = Xpo::get_lc_key();
367 $_page = isset($_GET['page']) ? sanitize_text_field($_GET['page']) : ''; // @codingStandardsIgnoreLine
368 $post_type = get_post_type();
369
370 wp_enqueue_style( 'wp-color-picker' );
371 wp_enqueue_script( 'wp-color-picker' );
372
373 wp_enqueue_script( 'ultp-option-script', ULTP_URL . 'assets/js/ultp-option.js', array( 'jquery' ), ULTP_VER, true );
374 wp_enqueue_style( 'ultp-option-style', ULTP_URL . 'assets/css/ultp-option.css', array(), ULTP_VER );
375 wp_localize_script(
376 'ultp-option-script',
377 'ultp_option_panel',
378 array(
379 'url' => ULTP_URL,
380 'version' => ULTP_VER,
381 'active' => $is_active,
382 'security' => wp_create_nonce( 'ultp-nonce' ),
383 'ajax' => admin_url( 'admin-ajax.php' ),
384 'settings' => ultimate_post()->get_setting(),
385 'post_type' => $post_type,
386 'saved_template_url' => admin_url( 'admin.php?page=ultp-settings#saved-templates' ),
387 )
388 );
389
390 if ( $post_type == 'ultp_custom_font' ) {
391 $font_settings = ultimate_post()->get_setting( 'ultp_custom_font' );
392 if ( $font_settings == 'true' ) {
393 wp_enqueue_media();
394 }
395 }
396
397 /* === Installation Wizard === */
398 if ( $_page == 'ultp-setup-wizard' ) {
399 wp_enqueue_script( 'ultp-initial-setup-script', ULTP_URL . 'assets/js/ultp_initial_setup_min.js', array( 'wp-i18n', 'wp-api-fetch', 'wp-api-request' ), ULTP_VER, true );
400 wp_set_script_translations( 'ultp-initial-setup-script', 'ultimate-post', ULTP_PATH . 'languages/' );
401 }
402
403 /* === Builder And Setting Pannel === */
404 if ( get_post_type( get_the_ID() ) == 'ultp_builder' ) {
405 wp_enqueue_script( 'ultp-conditions-script', ULTP_URL . 'addons/builder/assets/js/conditions.js', array( 'wp-i18n', 'wp-api-fetch', 'wp-components', 'wp-i18n', 'wp-blocks' ), ULTP_VER, true );
406 wp_localize_script(
407 'ultp-conditions-script',
408 'ultp_condition',
409 array(
410 'url' => ULTP_URL,
411 'active' => $is_active,
412 'builder_url' => admin_url( 'admin.php?page=ultp-settings#builder' ),
413 )
414 );
415 wp_set_script_translations( 'ultp-conditions-script', 'ultimate-post', ULTP_PATH . 'languages/' );
416 }
417
418 /* === Dashboard === */
419 if ( $_page == 'ultp-settings' ) {
420 wp_enqueue_script( 'ultp-dashboard-script', ULTP_URL . 'assets/js/ultp_dashboard_min.js', array( 'wp-i18n', 'wp-api-fetch', 'wp-api-request', 'wp-components', 'wp-blocks' ), ULTP_VER, true );
421 $user_info = get_userdata( get_current_user_id() );
422 wp_localize_script(
423 'ultp-dashboard-script',
424 'ultp_dashboard_pannel',
425 array_merge(
426 array(
427 'ajax' => admin_url( 'admin-ajax.php' ),
428 'security' => wp_create_nonce( 'ultp-nonce' ),
429 'url' => ULTP_URL,
430 'active' => $is_active,
431 'license' => $license_key,
432 'settings' => ultimate_post()->get_setting(),
433 'addons_settings' => apply_filters( 'ultp_settings', array() ),
434 'builder_url' => admin_url( 'admin.php?page=ultp-settings#builder' ),
435 'version' => ULTP_VER,
436 'setup_wizard_link' => admin_url( 'admin.php?page=ultp-setup-wizard' ),
437 'is_free' => ! $is_active,
438 'user_email' => wp_get_current_user()->user_email,
439 'home_url' => home_url(),
440 'generalDiscount' => get_transient( 'ultp_generalDiscount' ),
441 'helloBar' => Notice::get_hellobar_config(),
442 'userInfo' => array(
443 'name' => $user_info->first_name ? $user_info->first_name . ( $user_info->last_name ? ' ' . $user_info->last_name : '' ) : $user_info->user_login,
444 'email' => $user_info->user_email,
445 ),
446 ),
447 Xpo::get_wow_products_details()
448 )
449 );
450 wp_set_script_translations( 'ultp-dashboard-script', 'ultimate-post', ULTP_PATH . 'languages/' );
451 }
452 }
453
454 /**
455 * Enqueue backend CSS and JS scripts for the block editor.
456 *
457 * @since v.1.0.0
458 * @return void No return value.
459 */
460 public function register_block_scripts_editor_area() {
461 ultimate_post()->register_scripts_common();
462 global $pagenow;
463 $depends = 'wp-editor';
464 if ( $pagenow === 'widgets.php' ) {
465 $depends = 'wp-edit-widgets';
466 }
467 wp_enqueue_script( 'ultp-blocks-editor-script', ULTP_URL . 'assets/js/editor.blocks.js', array( 'wp-i18n', 'wp-element', 'wp-blocks', 'wp-components', $depends ), ULTP_VER, true );
468 wp_enqueue_style( 'ultp-blocks-editor-css', ULTP_URL . 'assets/css/blocks.editor.css', array(), ULTP_VER );
469 if ( is_rtl() ) {
470 wp_enqueue_style( 'ultp-blocks-editor-rtl-css', ULTP_URL . 'assets/css/rtl.css', array(), ULTP_VER );
471 }
472 $is_active = ultimate_post()->is_lc_active();
473 $post_type = get_post_type();
474
475 // Custom Font Support Added
476 $font_settings = ultimate_post()->get_setting( 'ultp_custom_font' );
477 $custom_fonts = array();
478 if ( $font_settings == 'true' ) {
479 $args = array(
480 'post_type' => 'ultp_custom_font',
481 'post_status' => 'publish',
482 'numberposts' => -1,
483 'order' => 'ASC',
484 );
485 $posts = get_posts( $args );
486 if ( $posts ) {
487 foreach ( $posts as $post ) {
488 setup_postdata( $post );
489 $font = get_post_meta( $post->ID, '__font_settings', true );
490
491 if ( $font ) {
492 array_push(
493 $custom_fonts,
494 array(
495 'title' => $post->post_title,
496 'font' => $font,
497 )
498 );
499 }
500 }
501 wp_reset_postdata();
502 }
503 }
504
505 wp_localize_script(
506 'ultp-blocks-editor-script',
507 'ultp_data',
508 array(
509 'url' => ULTP_URL,
510 'ajax' => admin_url( 'admin-ajax.php' ),
511 'security' => wp_create_nonce( 'ultp-nonce' ),
512 'hide_import_btn' => ultimate_post()->get_setting( 'hide_import_btn' ),
513 'premium_link' => Xpo::generate_utm_link(),
514 'license' => $is_active ? Xpo::get_lc_key() : '',
515 'active' => $is_active,
516 'archive' => ultimate_post()->is_archive_builder(),
517 'settings' => ultimate_post()->get_setting(),
518 'post_type' => $post_type == 'premade' ? 'ultp_builder' : $post_type, // premade used for ultp.wpxpo.com
519 'date_format' => get_option( 'date_format' ),
520 'time_format' => get_option( 'time_format' ),
521 'blog' => get_current_blog_id(),
522 'affiliate_id' => apply_filters( 'ultp_affiliate_id', false ),
523 'category_url' => admin_url( 'edit-tags.php?taxonomy=category' ),
524 'disable_image_size' => ultimate_post()->get_setting( 'disable_image_size' ),
525 'dark_logo' => get_option( 'ultp_site_dark_logo' ) ? get_option( 'ultp_site_dark_logo' ) : false,
526 'builder_url' => admin_url( 'admin.php?page=ultp-settings#builder' ),
527 'custom_fonts' => $custom_fonts,
528 )
529 );
530 wp_set_script_translations( 'ultp-blocks-editor-script', 'ultimate-post', ULTP_PATH . 'languages/' );
531 }
532
533
534 /**
535 * Fire when plugin is first installed.
536 *
537 * @since v.1.0.0
538 * @return void No return value.
539 */
540 public function plugin_activation_hook() {
541 $data = get_option( 'ultp_options', array() );
542 $currentDate = new \DateTime();
543 $currentDate->setTime( 0, 0, 0, 0 );
544 $init_data = array(
545 'preloader_style' => 'style1',
546 'preloader_color' => '#037fff',
547 'container_width' => '1140',
548 'hide_import_btn' => '',
549 'disable_image_size' => '',
550 'disable_view_cookies' => '',
551 'disable_google_font' => '',
552 'ultp_templates' => 'true',
553 'ultp_elementor' => 'true',
554 'ultp_table_of_content' => 'true',
555 'ultp_builder' => 'true',
556 'ultp_dynamic_content' => 'true',
557 'ultp_custom_font' => 'true',
558 'ultp_chatgpt' => 'true',
559 'post_grid_1' => 'yes',
560 'post_grid_2' => 'yes',
561 'post_grid_3' => 'yes',
562 'post_grid_4' => 'yes',
563 'post_grid_5' => 'yes',
564 'post_grid_6' => 'yes',
565 'post_grid_7' => 'yes',
566 'post_list_1' => 'yes',
567 'post_list_2' => 'yes',
568 'post_list_3' => 'yes',
569 'post_list_4' => 'yes',
570 'post_module_1' => 'yes',
571 'post_module_2' => 'yes',
572 'post_slider_1' => 'yes',
573 'post_slider_2' => 'yes',
574 'heading' => 'yes',
575 'image' => 'yes',
576 'taxonomy' => 'yes',
577 'wrapper' => 'yes',
578 'news_ticker' => 'yes',
579 'accordion' => 'yes',
580 'star_rating' => 'yes',
581 'youtube_gallery' => 'yes',
582 'builder_advance_post_meta' => 'yes',
583 'builder_archive_title' => 'yes',
584 'builder_author_box' => 'yes',
585 'builder_post_next_previous' => 'yes',
586 'builder_post_author_meta' => 'yes',
587 'builder_post_breadcrumb' => 'yes',
588 'builder_post_category' => 'yes',
589 'builder_post_comment_count' => 'yes',
590 'builder_post_comments' => 'yes',
591 'builder_post_content' => 'yes',
592 'builder_post_date_meta' => 'yes',
593 'builder_post_excerpt' => 'yes',
594 'builder_post_featured_image' => 'yes',
595 'builder_post_reading_time' => 'yes',
596 'builder_post_social_share' => 'yes',
597 'builder_post_tag' => 'yes',
598 'builder_post_title' => 'yes',
599 'builder_post_view_count' => 'yes',
600 'save_version' => wp_rand( 1, 1000 ),
601 'activated_date' => $currentDate->getTimestamp(),
602 );
603 if ( empty( $data ) ) {
604 update_option( 'ultp_options', $init_data );
605 $GLOBALS['ultp_settings'] = $init_data;
606 } else {
607 foreach ( $init_data as $key => $single ) {
608 if ( ! isset( $data[ $key ] ) ) {
609 $data[ $key ] = $single;
610 }
611 }
612 update_option( 'ultp_options', $data );
613 $GLOBALS['ultp_settings'] = $data;
614 }
615 if ( ! get_transient( 'wpxpo_installation_date' ) ) {
616 set_transient( 'wpxpo_installation_date', 'yes', 5 * DAY_IN_SECONDS ); // 5 Days Notice
617 }
618 }
619 }
620